[OCP學習筆記]043-07-處理資料庫損壞--模擬實驗(1)

xuqingwei發表於2010-06-05

二、模擬實驗

該實驗我參照了yangtingkun老師的技術貼http://space.itpub.net/4227/viewspace-68509,並根據我的理解加以改進。不足之處,請大家批評指正。

1. 實驗準備:

為了演示的方便,我們建一個1MB的表空間test,共有128個塊,每塊大小為8192

sys@STUDY>create tablespace test

datafile 'C:ORACLEPRODUCT10.2.0ORADATASTUDYTEST01.DBF' size 1m;

Tablespace created.

sys@STUDY>select file_id, file_name from dba_data_files where tablespace_name='TEST';

FILE_ID FILE_NAME

---------- -------------------------------

14 C:ORACLEPRODUCT10.2.0ORADATASTUDYTEST01.DBF

sys@STUDY>show parameter db_block_size

NAME TYPE VALUE

--------------------------------

db_block_size integer 8192

在其中我們建立資料表T1和索引ID_T1。建立索引的目的是為了做DBMS_REPAIR實驗。T1表塊號從1267

sys@STUDY>create table t1 tablespace test as select * from dba_tables;

Table created.

sys@STUDY>select count(*) from t1;

COUNT(*)

----------

1735

sys@STUDY>select min(dbms_rowid.rowid_block_number(rowid)) from t1;

MIN(DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))

-----------------------------------------

12

sys@STUDY>select max(dbms_rowid.rowid_block_number(rowid)) from t1;

MAX(DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID))

-----------------------------------------

67

sys@STUDY>create index id_t1 on t1(table_name) tablespace test;

Index created.

啟動RMAN,執行帶validate的備份和映象複製。檢視v$Database_Block_Corrpution沒有發現錯誤。

RMAN> backup validate tablespace "TEST";

Starting backup at 2010-06-05 11:07:05

using channel ORA_DISK_1

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00014 name=C:ORACLEPRODUCT10.2.0ORADATASTUDYTEST01.DBF

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01

Finished backup at 2010-06-05 11:07:06

RMAN> backup as copy validate tablespace "TEST";

Starting backup at 2010-06-05 11:11:14

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=159 devtype=DISK

channel ORA_DISK_1: starting datafile copy

input datafile fno=00014 name=C:ORACLEPRODUCT10.2.0ORADATASTUDYTEST01.DBF

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01

Finished backup at 2010-06-05 11:11:16

sys@STUDY>select * from v$database_block_corruption;

no rows selected

2. 模擬壞塊

模擬之前,我們先回顧一下塊的基本結構。塊由塊頭、塊尾和內容組成。其中ASSM將內容分為4個級別,由點陣圖進行管理。資料存放的方式由後向前,達到pctfree時為塊滿。

塊頭

(checksum)

FS1

100%

FS2

75%

FS3

50%

FS4

25%

塊尾

關於Oracle內部塊的詳細結構的說明,請檢視以下文章。這裡我對需要進行修改的幾個欄位所處的Block(以8192個位元組為例)中的相對位置進行說明:

http://dongguangit.itpub.net/post/24185/303231

l 塊頭:長度不固定。主要包括:

116位中:

Ø 0位:type

Ø 8-13位:scn

Ø 14位:seq

216位中:

Ø 1-2位:chkval,校驗位

l 塊尾:長度為4個位元組

Ø 1位:對應head中的seq

Ø 2位:對應head中的type

為了達到較好的演示效果,我們選取12-67塊中第162024284個資料塊來模擬all zerofacturedchecksumlogical4種塊的錯誤。其中前三種為介質錯誤,後面一種為邏輯錯誤。此外corrupt型別塊錯誤,為系統無法識別的塊,我尚不知如何進行模擬。

資料來源:/oracle102/server.102/b14237/dynviews_1074.htm#sthref3571

l All zero 塊頭丟失,內容全為0

l Fractured 塊頭和塊尾版本不同

l Checksum:校驗碼錯誤,通常為塊中間內容發生改變

l Logical 邏輯錯誤

首先定位需要修改的資料塊的地址:

sys@STUDY>select to_char(16*8192, 'XXXXXX') s_addr, to_char(17*8192-1, 'XXXXXX') e_addr from dual;

S_ADDR E_ADDR

------- -------

20000 21FFF

sys@STUDY>select to_char(20*8192, 'XXXXXX') s_addr, to_char(21*8192-1, 'XXXXXX') e_addr from dual;

S_ADDR E_ADDR

------- -------

28000 29FFF

sys@STUDY>select to_char(24*8192, 'XXXXXX') s_addr, to_char(25*8192-1, 'XXXXXX') e_addr from dual;

S_ADDR E_ADDR

------- -------

30000 31FFF

sys@STUDY>select to_char(28*8192, 'XXXXXX') s_addr, to_char(29*8192-1, 'XXXXXX') e_addr from dual;

S_ADDR E_ADDR

------- -------

38000 39FFF

執行checkpoint,將buffer cache中的內容寫到資料塊中;將test表空間offline,以便可以離線修改test01.dbf檔案;

sys@STUDY>alter system checkpoint;

System altered.

sys@STUDY>alter tablespace test offline;

Tablespace altered.

使用UltraEdit開啟test01.dbf檔案,以十六進位制模式顯示。依據上面計算的地址,分別定位到0X20000(第16塊),0X28000(第20塊),0X30000(第24塊),0X38000(第28塊)。

l 16塊:

0X20000--0X200F位全部設為0,模擬塊頭丟失的情況。

l 20塊:

0X280000E位設為0,即改變該塊塊頭的seq位,使他和塊尾的seq位不一致。模擬塊頭和塊尾版本不同的情況。

l 24塊:

0X30010--0X30011位設為0,清空checksum的值。

l 28塊:

0X38458位設定為0。我們在T1表的table_name欄位建立了索引,該欄位是字元型,其值可以在UltraEdit編輯欄右側顯示。我們修改的這個位,剛好存放了一個table_name值。這樣,資料表中的內容將與索引中的內容不一致。從而模擬一個Logical錯誤。

這樣我們完成了所需實驗的準備工作。由於下面我們將嘗試運用多個工具來進行恢復操作,所以有必要將修改好的資料檔案進行儲存,以便可以多次呼叫。

sys@STUDY> host copy test01.dbf test01.bak

Test表空間online,開始進入下一步檢驗工作。

sys@STUDY>alter tablespace test online;

Tablespace altered.

3. 使用工具進行檢驗

l 運用DBVTEST01.dbf進行檢驗

dbv file=test01.dbf

DBVERIFY - Verification starting : FILE = test01.dbf

Page 16 is influx - most likely media corrupt

Corrupt block relative dba: 0x03800010 (file 14, block 16)

Fractured block found during dbv:

Data in bad block:

type: 0 format: 0 rdba: 0x00000000

last change scn: 0x0000.00000000 seq: 0x0 flg: 0x00

spare1: 0x0 spare2: 0x0 spare3: 0x0

consistency value in tail: 0xf3520601

check value in block header: 0x5b16

block checksum disabled

Page 20 is influx - most likely media corrupt

Corrupt block relative dba: 0x03800014 (file 14, block 20)

Fractured block found during dbv:

Data in bad block:

type: 6 format: 2 rdba: 0x03800014

last change scn: 0x0000.001cf352 seq: 0x0 flg: 0x04

spare1: 0x0 spare2: 0x0 spare3: 0x0

consistency value in tail: 0xf3520601

check value in block header: 0xd98d

computed block checksum: 0x1

Block Checking: DBA = 58720280: Block Type byte corrupted

Block Checking: DBA = 58720280: Block Type byte corrupted

Page 24 is influx - most likely media corrupt

Corrupt block relative dba: 0x03800018 (file 14, block 24)

Fractured block found during dbv:

Data in bad block:

type: 0 format: 2 rdba: 0x03800018

last change scn: 0x0000.00000001 seq: 0x1 flg: 0x00

spare1: 0x0 spare2: 0x0 spare3: 0x0

consistency value in tail: 0x00010001

check value in block header: 0x0

block checksum disabled

Page 28 is marked corrupt

Corrupt block relative dba: 0x0380001c (file 14, block 28)

Bad check value found during dbv:

Data in bad block:

type: 6 format: 2 rdba: 0x0380001c

last change scn: 0x0000.001cf352 seq: 0x2 flg: 0x04

spare1: 0x0 spare2: 0x0 spare3: 0x0

consistency value in tail: 0xf3520602

check value in block header: 0xf5df

computed block checksum: 0x62

DBVERIFY - Verification complete

Total Pages Examined : 128

Total Pages Processed (Data) : 95

Total Pages Failing (Data) : 0

Total Pages Processed (Index): 8

Total Pages Failing (Index): 0

Total Pages Processed (Other): 22

Total Pages Processed (Seg) : 0

Total Pages Failing (Seg) : 0

Total Pages Empty : 1

Total Pages Marked Corrupt : 4

Total Pages Influx : 3

Highest block SCN : 1897456 (0.1897456)

l 運用RMANvalidate,對資料塊進行檢驗

RMAN> backup validate tablespace "TEST";

Starting backup at 2010-06-05 15:54:20

using channel ORA_DISK_1

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00014 name=C:ORACLEPRODUCT10.2.0ORADATASTUDYTEST01.DBF

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01

Finished backup at 2010-06-05 15:54:23

sys@STUDY>select file#, block#, MARKED_CORRUPT, CORRUPTION_TYPE from v$backup_corruption;

FILE# BLOCK# MAR CORRUPTIO

---------- ---------- --- ---------

14 16 YES FRACTURED

14 20 YES FRACTURED

14 28 YES CHECKSUM

這裡缺一個24號塊,目前尚未定位出原因。

RMAN> backup as copy validate tablespace "TEST";

Starting backup at 2010-06-05 15:59:45

using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile copy

input datafile fno=00014 name=C:ORACLEPRODUCT10.2.0ORADATASTUDYTEST01.DBF

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01

Finished backup at 2010-06-05 15:59:46

sys@STUDY>select file#, block#, MARKED_CORRUPT, CORRUPTION_TYPE from v$copy_corruption;

FILE# BLOCK# MAR CORRUPTIO

---------- ---------- --- ---------

14 16 YES FRACTURED

14 20 YES FRACTURED

14 28 YES CHECKSUM

這裡也少了一個24號塊。

sys@STUDY>select * from v$database_block_corruption;

FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO

---------- ---------- ---------- ------------------ ---------

14 28 1 0 CHECKSUM

14 20 1 0 FRACTURED

14 16 1 0 FRACTURED

l 運用EXP在匯出的過程中對資料進行檢驗

sys@STUDY>grant exp_full_database to scott;

exp scott/tiger tablespaces=test

Export: Release 10.2.0.1.0 - Production on Sat Jun 5 16:16:00 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set

About to export selected tablespaces ...

For tablespace TEST ...

. exporting cluster definitions

. exporting table definitions

. exporting referential integrity constraints

. exporting triggers

Export terminated successfully without warnings.

以表空間的方式匯出,EXP並沒有發現錯誤。

由於我將T1表存放到了SYS Schema下了,直接用exp sys ...系統會報錯。因此,我編寫了一個引數檔案t1.par

userid="sys/oracle@study as sysdba"

file=t1.dmp

tables=(T1)

然後執行:

exp parfile=t1.par

Export: Release 10.2.0.1.0 - Production on Sat Jun 5 16:24:59 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set

About to export specified tables via Conventional Path ...

. . exporting table T1

EXP-00056: ORACLE error 1578 encountered

ORA-01578: ORACLE data block corrupted (file # 14, block # 16)

ORA-01110: data file 14: 'C:ORACLEPRODUCT10.2.0ORADATASTUDYTEST01.DBF'

Export terminated successfully with warnings.

table模式下,exp發現了塊錯誤。但很明顯,當exp發現了第一個塊異常後,就自動停止執行匯出操作了。

l analyze ...validate structure

sys@STUDY>analyze table t1 validate structure;

analyze table t1 validate structure

*

ERROR at line 1:

ORA-01578: ORACLE data block corrupted (file # 14, block # 16)

ORA-01110: data file 14: 'C:ORACLEPRODUCT10.2.0ORADATASTUDYTEST01.DBF'

Analyze也能檢驗出第一個錯誤塊,但其餘的資料塊無法得到。

l 小結

這裡我們採用了DBVRMAN...validateEXPAnalyze....validate structure四種工具來檢查資料塊錯誤。很明顯,DBV的功能是最強的,能夠查出所有4種錯誤;其次是RMAN...validate,在備份或映象的過程中進行校驗,對於重要的資料來說也是非常必要的,不過這種方式可能發生漏檢。EXPanalyze工具不適合進行壞塊的檢驗,最多可以作為發現壞塊的手段。

[@more@]《第07章 處理資料庫損壞》學習筆記.pdf

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20162/viewspace-1034192/,如需轉載,請註明出處,否則將追究法律責任。

相關文章