對任何可能導致數據丟失的損壞,我們都要仔細的分析,以求理解所要涉及的數據。就修補壞塊本身來說, 它可能會丟失數據,也可能會導致數據在邏輯上不一致;因此在進行修補壞塊之前,必須仔細權衡使用DBMS_REPAIR的得失。
DBMS_REPAIR package 僅僅對transaction層和data層的壞塊(即通常所說的由軟件引起的壞塊)起作用,對物理上損壞的塊,在它被讀到緩沖區中時就已被標識出來了,而DBMS_REPAIR會忽略所有被標識為壞了的塊。
在DBMS_REPAIR package 初始版本中,“修補壞塊”的功能僅僅是“將塊標識為由軟件引起的壞塊”
使用DBMS_REPAIR package的注意事項:
1、 DB_BLOCK_CHECKING和DB_BLOCK_CHECKSUM要設置為FALSE.
2、 在使用DBMS_REPAIR之前,有壞塊的文件應做一個備份。
下面我們就通過一個例子來說明DBMS_REPAIR package是如何檢測和修補壞塊的。
例如,Table T1(結構如下)中存在一個壞塊:
SQL> desc t1
Name Null? Type
------------------------ -------- --------------------
COL1 NOT NULL NUMBER(38)
COL2 CHAR(512)
用Analyze命令對Table t1進行分析后,會得到如下錯誤提示:
SQL> analyze table t1 validate structure;
analyze table t1 validate structure
*
ERROR at line 1:
ORA-01498: block check failure
在Analyze產生的trace文件中,可以知道壞塊中包含3條記錄的數據(nrows = 3),
Trace文件中主要的內容如下:
Dump file /export/home/oracle/product/8.1.5
/admin/V815/udump/v815_ora_2835.trc
Oracle8 Enterprise Edition Release 8.1.5.0.0
With the Partitioning option
*** 1998.12.16.15.53.02.000
*** SESSION ID:(7.6) 1998.12.16.15.53.02.000
kdbchk: row locked by non-existent transaction
table=0 slot=0
lockid=32 ktbbhitc=1
Block header dump: 0x01800003
Object id on Block? Y
seg/obj: 0xb6d csc: 0x00.1cf5f itc: 1 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 xid: 0x0002.011.00000121 uba: 0x008018fb.0345.0d --U- 3 fsc
0x0000.0001cf60
data_block_dump
===============
tsiz: 0x7b8
hsiz: 0x18
pbl: 0x28088044
bdba: 0x01800003
flag=-----------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x19d
avsp=0x185
tosp=0x185
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x5ff
0x14:pri[1] offs=0x3a6
0x16:pri[2] offs=0x19d
block_row_dump:
(注:其余的省略)
end_of_block_dump
一、首先使用DBMS_REPAIR.ADMIN_TABLES來建立repair table和orphan key table,
并且為repair table和orphan key tables提供管理功能
SQL> @adminCreate
SQL> connect sys/
Connected.
SQL>
SQL> -- Repair Table
SQL>
SQL> declare
2 begin
3 -- create repair table
4 dbms_repair.admin_tables (
5 -- table_name => 'REPAIR_TABLE',
6 table_type => dbms_repair.repair_table,
7 action => dbms_repair.create_action,
8 tablespace => 'USERS'); -- 如果是使用SYS用戶的缺省表空間,該項就不用指定
9 end;
10 /
PL/SQL procedure successfully completed.
我們查詢dba_objects,可以看到如下結果:
SQL> select owner, object_name, object_type
2 from dba_objects
3 where object_name like '%REPAIR_TABLE';
OWNER OBJECT_NAME OBJECT_TYPE
------------------------------------------------------------------
SYS DBA_REPAIR_TABLE VIEW
SYS REPAIR_TABLE TABLE
SQL>
SQL> -- Orphan Key Table
SQL>
SQL> declare
2 begin
3 -- Create orphan key table
4 dbms_repair.admin_tables (
5 table_type => dbms_repair.orphan_table,
6 action => dbms_repair.create_action,
7 tablespace => 'USERS'); -- 如果是使用SYS用戶的缺省表空間,該項就不用指定
8 end;
9 /
PL/SQL procedure successfully completed.
我們查詢dba_objects,可以看到如下結果:
SQL> select owner, object_name, object_type
2 from dba_objects
3 where object_name like '%ORPHAN_KEY_TABLE';
OWNER OBJECT_NAME OBJECT_TYPE
------------------------------------------------------------------
SYS DBA_ORPHAN_KEY_TABLE VIEW
SYS ORPHAN_KEY_TABLE TABLE
文章來源于領測軟件測試網 http://www.kjueaiud.com/