首页 > 数据库 > Oracle > 【RMAN】当表空间处于备份状态时发生了什么
对于比较老的数据库版本,如果要执行在线(热)备份,我们必须将表空间设置为begin backup 模式,然后复制数据文件,后将表空间设置为 end backup 模式。现在的热备基本都是通过 RMAN 工具来实现的,不过原理是一样的。当然要确保数据库处于 archivelog 模式。
示例1 : 执行一个简单的备份
SQL> alter tablespace system begin backup;
-- 操作系统层面复制数据文件
$ copy system01.dbf /backup/
SQL> alter tablespace system end backup;
示例2 : 备份整个数据库
SQL> alter database begin backup;
$ copy all datafiles /backup/
SQL> alter database end backup;
在线备份可能会导致一个块内的数据不一致。例如,我们正在备份数据文件system01.dbf 中的 block 100 。另外, copy 命令正在读取整个块,而 DBWR 正在更新数据块。在这种情况,复制命令可以在块的上半部分读取旧数据,在块的下半部分读取新数据。结果称为“破裂块”,这就意味着对于一个给定的 SCN ,该数据块中包含的数据不一致。
针对以上内存,Oracle 的解决办法如下:
1. 当数据文件处于热备份模式时,当数据块被修改时,数据块被更改的部分会被写入redo log 中。在这种情况下,我们可能会遇到复制数据文件的进程和 DBWR 进程同时在一个数据块上工作。
比如,操作系统一次从磁盘读取512 字节,备份进程去读取一个 8k 的数据块,同时 DBWR 请求重写这个块。此时备份进程得到的是一个断裂的数据块,头部和尾部处于两个时间点。
2. 当数据文件处于热备份模式时,不会更新最新完成检查点SCN 的数据文件头。这样可以让恢复进程知道,完全恢复该数据文件可能需要哪些 archive redo log 。为了限制这种额外日志记录的影响,我们应该确保一次只将一个表空间置于备份模式中,并在对表空间进行备份后立即将其从备份模式中取出。这种方式将尽可能地减少记录的块的数量。
尽量在数据库的负载最少的情况下进行在线热备份,这样生成的redo log 会更少。
---- end ----
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31529886/viewspace-2754944/,如需转载,请注明出处,否则将追究法律责任。