关于热备份:
Oracle数据块的大小是操作系统数据块的整数倍,如果直接通过OS命令拷贝数据
文件到备份介质,由于数据库一直在使用,我们通过OS命令拷贝数据文件是以
OS Block为单位进行的,那么一个Oracle block会被分成好几次被操作系统复制,
我们可能在复制一个Oracle block中的一些OS Block的时候,该Oracle block因为
用户操作而被修改了,那么这个Oracle block中一部分OS Block已经被拷贝过去了,
而这个Oracle block中的后一半部分被改动过了,该数据块的状态已经不一致了,
该Oracle block的备份是不能被使用的(因为block内部版本不一致),这叫做分离
数据块(split blocks)的现象。
Oracle判断某个数据块是否出现这种分离的现象,是通过比较数据块头部和尾部的
版本号是否一致来实现的。只要修改了数据块,Oracle就会同时更新数据块头和尾
的版本号,因此,如果头尾版本号不一致,说明该数据块损坏,不能被使用。
发出begin backup以后,第一次修改数据块中的数据行之前,在online redo log文件中记录整个数据块的修改前的数据(以重做记录形式?)。在使用热备份进行恢复时,一旦发现某个数据块被分离(split),则会利用日志文件中记录的数据对整个数据块进行恢复 。 那么如果热备份期间有第二次,第三次修改了该数据块, Oracle 不会再次记录第二次修改前的整个块包含的数据行 (因为有第一次修改前的联机日志中的整块的记录加上后面的log足可以恢复) 。
如上所述,那么在第二次修改这个块的时候,Oracle是如何知道这个数据块第一次修改前的整块中的数据已经记录在联机日志文件中而不用再次记录整块到联机日志中呢, 数据块头部会有标记 ?
http://www.itpub.net/viewthread.php?tid=1351440
> Oracle 应该不会再次记录第二次修改前的整个块包含的数据行 (因为有第一次修改前的联机日志中的整块的记录加上后面的log足可以恢复) ?
Correct. Useful references:
message 3 at
http://groups.google.com/group/c ... ad/e3a2b32fa3c68904
"Proof! November 15, 2005 - 5am Central time zone" at
http://asktom.oracle.com/pls/ask ... ION_ID:271815712711
> 那么在第二次修改这个块的时候,Oracle是如何知道这个数据块第一次修改前的整块中的数据已经记录在联机日志文件中而不用再次记录整块到联机日志中呢, 数据块头部会有标记 ?
A good question. I don't think the data block header has it. A likely place is the flag of a buffer in buffer cache, i.e. flag column of x$bh. See
http://www.jlcomp.demon.co.uk/buf_flag.html
for all bits of the flag. It's possible one of the bits indicates that. It won't be hard to do a test.
Yong Huang
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-673873/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-673873/
196

被折叠的 条评论
为什么被折叠?



