用ODU恢复数据的一点注意事项

| No Comments

ODU恢复数据的时候,scan extent是非常必要的,因为这样即使在段头损坏(或者段头的extent mapauxiliary map不准)的情况下,也能够正确恢复出数据:

我们来看一个极端的例子:

SQL> select count(*) from t1;

 

  COUNT(*)

----------

     29515

 

当我把t1的段头中的extent mapauxiliary mapt1extent数量、t1block数量改了后oracle这里只能读出其中的一部分数据了:

SQL> select count(*) from t1;

 

  COUNT(*)

----------

     27051

 

可以看到这里oracle少读了29515270512464条记录。

 

此时,如果我们不用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