[OCP學習筆記]043-07-處理資料庫損壞--模擬實驗(1)
二、模擬實驗
該實驗我參照了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表塊號從12到67。
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 塊頭:長度不固定。主要包括:
第1個16位中:
Ø 第0位:type
Ø 第8-13位:scn
Ø 第14位:seq
第2個16位中:
Ø 第1-2位:chkval,校驗位
l 塊尾:長度為4個位元組
Ø 第1位:對應head中的seq
Ø 第2位:對應head中的type
為了達到較好的演示效果,我們選取12-67塊中第16,20,24,28這4個資料塊來模擬all zero,factured,checksum,logical這4種塊的錯誤。其中前三種為介質錯誤,後面一種為邏輯錯誤。此外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 運用DBV對TEST01.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 運用RMAN的validate,對資料塊進行檢驗
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 小結
這裡我們採用了DBV,RMAN...validate,EXP,Analyze....validate structure四種工具來檢查資料塊錯誤。很明顯,DBV的功能是最強的,能夠查出所有4種錯誤;其次是RMAN...validate,在備份或映象的過程中進行校驗,對於重要的資料來說也是非常必要的,不過這種方式可能發生漏檢。EXP和analyze工具不適合進行壞塊的檢驗,最多可以作為發現壞塊的手段。
[@more@]《第07章 處理資料庫損壞》學習筆記.pdf
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20162/viewspace-1034192/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Pandas學習筆記02】處理資料實用操作筆記
- 機器學習筆記---資料預處理機器學習筆記
- MySQL資料庫INNODB表損壞修復處理過程分享MySql資料庫
- 使用 seed 命令建立模擬資料(學習筆記)筆記
- Python深度學習(處理文字資料)--學習筆記(十二)Python深度學習筆記
- YOLOv3學習筆記之資料處理YOLO筆記
- 資料庫學習筆記1(資料管理歷史)資料庫筆記
- Proteus模擬學習筆記筆記
- 模擬退火學習筆記筆記
- 模擬退火 學習筆記筆記
- OpenCV影像處理學習筆記-Day1OpenCV筆記
- 資料庫學習筆記資料庫筆記
- 【Pandas學習筆記02】-資料處理高階用法筆記
- 學習筆記(1):Python零基礎入門到實戰-資料科學原理與資料處理流程筆記Python資料科學
- 達夢資料庫日常管理之問題處理筆記1資料庫筆記
- 控制檔案損壞處理
- 1029學習筆記 資料庫筆記資料庫
- python學習筆記:資料庫Python筆記資料庫
- MySQL資料庫學習筆記MySql資料庫筆記
- 資料庫學習與複習筆記--資料庫概念和不同類資料庫CRUD操作(1)資料庫筆記
- React學習筆記-事件處理React筆記事件
- 資料庫mysql學習筆記記錄資料庫MySql筆記
- MySQL資料庫InnoDB壞頁處理修復MySql資料庫
- OCP 複習筆記之PL/SQL (1)筆記SQL
- 資料結構學習筆記1資料結構筆記
- Redis學習筆記(七) 資料庫Redis筆記資料庫
- 達夢資料庫學習筆記資料庫筆記
- Vue學習筆記之事件處理Vue筆記事件
- 模擬積體電路學習筆記筆記
- 機器學習演算法筆記之6:資料預處理機器學習演算法筆記
- 一次ORACLE資料庫undo壞塊處理Oracle資料庫
- JSP筆記-XML 資料處理JS筆記XML
- RAC磁碟頭損壞問題處理
- swoft 學習筆記之資料庫操作筆記資料庫
- Oracle資料庫出現ORA-19566 LOB壞塊的處理記錄Oracle資料庫
- swoft 學習筆記之資料庫配置與實體定筆記資料庫
- swoft 學習筆記之異常處理筆記
- Flutter學習筆記(32)--PointerEvent事件處理Flutter筆記事件
- vue學習筆記3-事件處理Vue筆記事件