用ODU恢复数据的时候,scan extent是非常必要的,因为这样即使在段头损坏(或者段头的extent map和auxiliary map不准)的情况下,也能够正确恢复出数据:
我们来看一个极端的例子:
SQL> select count(*) from t1;
COUNT(*)
----------
29515
当我把t1的段头中的extent map、auxiliary map、t1的extent数量、t1的block数量改了后oracle这里只能读出其中的一部分数据了:
SQL> select count(*) from t1;
COUNT(*)
----------
27051
可以看到这里oracle少读了29515-27051=2464条记录。
此时,如果我们不用scan extent,则ODU也只能恢复出27051条记录:
ODU> unload dict
CLUSTER C_USER# file_no: 1 block_no: 89
TABLE OBJ$ file_no: 1 block_no: 121
CLUSTER C_OBJ# file_no: 1 block_no: 25
CLUSTER C_OBJ# file_no: 1 block_no: 25
found IND$'s obj# 19
found IND$'s dataobj#:2,ts#:0,file#:1,block#:25,tab#:3
found TABPART$'s obj# 230
found TABPART$'s dataobj#:230,ts#:0,file#:1,block#:1657,tab#:0
found INDPART$'s obj# 234
found INDPART$'s dataobj#:234,ts#:0,file#:1,block#:1689,tab#:0
found TABSUBPART$'s obj# 240
found TABSUBPART$'s dataobj#:240,ts#:0,file#:1,block#:1737,tab#:0
found INDSUBPART$'s obj# 245
found INDSUBPART$'s dataobj#:245,ts#:0,file#:1,block#:1777,tab#:0
found IND$'s obj# 19
found IND$'s dataobj#:2,ts#:0,file#:1,block#:25,tab#:3
found LOB$'s obj# 156
found LOB$'s dataobj#:2,ts#:0,file#:1,block#:25,tab#:6
found LOBFRAG$'s obj# 258
found LOBFRAG$'s dataobj#:258,ts#:0,file#:1,block#:1881,tab#:0
ODU> unload table sys.t1
Unloading table: T1,object ID: 30337
Unloading segment,storage(Obj#=30337 DataObj#=30337 TS#=9 File#=9 Block#=523 Clu
ster=0)
27051 rows unloaded
如果我们用了scan extent,则ODU能将所有的29515条记录正确的unload出来:
ODU> scan extent tablespace 9 datafile 9
scan extent start: 2010-04-11 14:13:05
scanning extent...
scanning extent finished.
scan extent completed: 2010-04-11 14:13:06
ODU> unload table sys.t1 object 30337
Unloading table: T1,object ID: 30337
Unloading segment,storage(Obj#=30337 DataObj#=30337 TS#=9 File#=9 Block#=523 Clu
ster=0)
29515 rows unloaded
Leave a comment