断裂块:网上资料很多,基本情况就是 database open时,用OS 命令备份 datafile (host copy,host cp)
如果要复制的datafile比较大,那么这个过程可能持续几分钟 这之间就产生问题了,OS 操作复制的粒度
与oracle DBWN写操作的粒度不一样(oracle 操作粒度是oracle 数据块 )一般 系统比oracle粒度要小,
os 的copy 时 可能会得到某个block的第一部分,随后dbwn 写了整个block ,最后os 的copy得到块的剩
下部分,这样就产生了 '断裂' 块(OS 分2部分 2次写的 而写之中DBWN 写了整个块,等于os copy第一部
分写的块内容已经和datafile中不一样了) 出现了代表不同oracle block的两个部分 ,这样的block是无
用的
为了避免这个情况 oracle 采用alter tablespace(database) begin backup 设置为备份模式(产生一个
部分checkpoint 按照buffer cache中filequeue 将对应的dirty buffer写入datafile)
若此时更新buffer cache中的一个block(首次)那么会将真个完整的block image 写入redo(而不是 只将
变化写入 log buffer)这个block image是读一致的,在以后的恢复中还原datafile,若有任何断裂的
block 都会替换为从redo中愁绪的block的一致读image 对断裂块修复
问题来了:整个块的image 那么 redo会多,redo多swtich 多~~再往下就会有redo的一些event了(以后实
验会详细介绍)
rman可以解决rman 检测到dbwn在某个块复制时候对其进行了变更(block头的scn变化 rman容易检测到)
那么rman会尝试再次复制操作,知道得到该block的读一致映像
SQL> conn / as sysdba
Connected.
SQL> create table test (a char(1000),b char(1000));
Table created.
SQL> insert into test values('a','a');
1 row created.
SQL> insert into test values('b','b');
1 row created.
SQL> commit;
Commit complete.
SQL> select file#,block# from (select dbms_rowid.rowid_relative_fno(rowid) file#
,dbms_rowid.rowid_block_number(rowid) block# from test);
FILE# BLOCK#
---------- ----------
1 57626
1 57626
SQL> select * from sys.redo_size;
VALUE
----------
11540
SQL> alter tablespace system begin backup;
Tablespace altered.
SQL> update test set a='aa' ,b='aa' where a='a';
1 row updated.
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 CURRENT
3 INACTIVE
4 INACTIVE
SQL> alter system dump logfile 'E:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO02.LOG
';
System altered.
KTB Redo
op: 0x01 ver: 0x01
op: F xid: 0x0004.004.00000b7f uba: 0x0080bb5a.0361.04
KDO Op code: IRP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x0040e11a hdba: 0x0040e119
itli: 1 ispac: 0 maxfr: 4863
tabn: 0 slot: 0(0x0) size/delt: 2009
fb: --H-FL-- lb: 0x1 cc: 2
null: --
col 0: [1000]
61 20 20 20 20 20
col 1: [1000]
61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20
fb: --H-FL-- lb: 0x1 cc: 2
null: --
col 0: [1000]
62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20
col 1: [1000]
62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~redo中整块的 image
vect = 0
col 0: [1000]
61 20 20 20 20 20 ~~~~~~~~~~~~~~old
col 1: [1000]
61 20 20 20 20
col 0: [1000]
61 61 20 20 20~~~~~~~~~~~~~~~~~~~~~NEW
col 1: [1000]
61 61 20 20
SQL> update test set a='bb' ,b='bb' where a='b';
1 row updated.
SQL> alter system dump logfile 'E:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO02.LOG
';
System altered.
~~~~~~~~~~~~~~~~~~没有产生新的block image 只有修改记录new,old
col 1: [1000]
62 20 20
col 0: [1000]
62 20 20 20 20
col 0: [1000]
62 62 20 20
col 1: [1000]
62 62 20 20
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12020513/viewspace-612827/ ,如需转载,请注明出处,否则将追究法律责任。