Oracle資料庫壞塊(corruption)-物理壞塊
概述
-------------
資料庫壞塊(corruption) 的型別可以按照壞塊所屬物件的不同,分為使用者資料壞塊,資料字典壞塊,Undo壞塊,控制檔案壞塊,Redo壞塊,Lob壞塊,index壞塊等等;也可以按照壞塊產生的原因,分為物理壞塊(physical corruption)和邏輯壞塊(logical corruption )。
本文主要討論使用者資料發生物理壞塊(physical corruption)分析和解決方法。
物理壞塊
-------------
常見的物理壞塊(Physical Block Corruptions)有塊頭和塊尾資訊不一致(Fractured/Incomplete),checksum值無效,資料塊資訊全部為0等情況,並且可能伴隨錯誤ORA-1578和ORA-1110
為了及時發現物理壞塊和準確定位壞塊產生的原因,oracle建議設定初始化引數DB_BLOCK_CHECKSUM=TYPICAL(預設值)。一般情況下,物理壞塊是由於底層OS/disk系統錯誤/損壞,導致資料塊被修改,資料塊標誌為壞塊(corruption)。
Case分享
-------------
資料塊的Checksum值無效是一種常見的物理壞塊,當資料庫初始化引數DB_BLOCK_CHECKSUM=TYPICAL(預設值)時,DBWR程式將資料塊寫入disk時會計算資料塊的Checksum,並且將Checksum值記錄在資料塊的位置offset 16和17;當從disk讀取該資料塊時,oracle重新計算資料塊的Checksum,並且與記錄在資料塊中的Checksum做異或運算(Xor),如果異或結果為非0,說明資料塊被修改過,資料塊為壞塊(corruption)。
1. 當前資料庫初始化引數配置DB_BLOCK_CHECKSUM=TYPICAL,因此從disk讀取資料塊時校驗checksum:
SQL> show parameter DB_BLOCK_CHECKSUM
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_checksum string TYPICAL
2. 查詢表dept時發現有壞塊,報錯資訊ORA-1578和ORA-1110,壞塊為file # 4, block # 133
SQL> select * from dept;
select * from dept
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 4, block # 133)
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/users01.dbf'
3. 出現以上錯誤的同時在alert log中也有詳細錯誤資訊,這些錯誤資訊說明資料塊(file # 4, block # 133)損壞的原因是checksum無效。資料塊中記錄的checksum值為0x8167(這個值是上一次DBWR寫入磁碟時計算的),讀取資料塊時重新計算得到的checksum是0x8122,checksum值異或運算(Xor)的結果是0x45 (computed block checksum)。由於兩次checksum值不同(即異或結果為非0),說明資料塊被修改過,資料塊為壞塊(corruption)。
Alert log錯誤資訊:
Hex dump of (file 4, block 133) in trace file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_20892.trc
Corrupt block relative dba: 0x01000085 (file 4, block 133)
Bad check value found during multiblock buffer read <<<<<<<<<<<<<< 說明壞塊的原因是checksum無效
Data in bad block:
type: 6 format: 2 rdba: 0x01000085
last change scn: 0x0000.0023d69a seq: 0x5 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0xd69a0605
check value in block header: 0x8167 <<<<<<<<<<<<<< 資料塊中記錄的checksum值為0x8167
computed block checksum: 0x45 <<<<<<<<<<<<<< 0x8167與0x8122異或運算(Xor)的結果是0x45
Reading datafile '/u01/app/oracle/oradata/orcl/users01.dbf' for corruption at rdba: 0x01000085 (file 4, block 133)
Reread (file 4, block 133) found same corrupt data (no logical check)
Sun Mar 23 22:53:40 2014
Corrupt Block Found
TSN = 4, TSNAME = USERS
RFN = 4, BLK = 133, RDBA = 16777349
OBJN = 14343, OBJD = 14343, OBJECT = DEPT, SUBOBJECT =
SEGMENT OWNER = JAMES, SEGMENT TYPE = Table Segment <<<<<<<<<<<<<< 壞塊對應的object ID
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_20892.trc (incident=182595):
ORA-01578: ORACLE data block corrupted (file # 4, block # 133)
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/users01.dbf'
4.1 對應的orcl_ora_20892.trc中也有資料塊的資訊,其中資料塊上記錄的checksum值是0x8167(chkval)
Block dump from disk:
buffer tsn: 4 rdba: 0x01000085 (4/133)
scn: 0x0000.0023d69a seq: 0x05 flg: 0x06 tail: 0xd69a0605
frmt: 0x02 chkval: 0x8167 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
4.2 透過dd也檢視資料塊中記錄的checksum值, offset 16,17 對應的是checksum值0x8167
$ dd if=/u01/app/oracle/oradata/orcl/users01.dbf bs=8192 count=1 skip=133 of=/tmp/dd133.out
$ od -x /tmp/dd133.out
0000000 a206 0000 0085 0100 d69a 0023 0000 0605
0000020 8167 0000 0001 0000 3807 0000 2fef 000c
^^^^
5. 修復資料壞塊的方法可以透過備份恢復或者DBMS_REPAIR.SKIP_CORRUPT_BLOCKS跳過壞塊。
5.1 方法#1 RMAN資料塊恢復:
RMAN> run {blockrecover datafile 4 block 133;}
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING DALIAN
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
5.2 方法#2 DBMS_REPAIR.SKIP_CORRUPT_BLOCKS跳過壞塊,然後將dept表中的其他資料匯出重建表
SQL> alter session set db_file_multiblock_read_count=1;
SQL> execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('JAMES','DEPT');
SQL> create table dept_new as select * from dept;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12798004/viewspace-1561166/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫壞塊典型案例分析Oracle資料庫
- Oracle資料庫壞塊典型案例擴充Oracle資料庫
- oracle壞塊(二)Oracle
- 一次ORACLE資料庫undo壞塊處理Oracle資料庫
- [20190311]關於oracle物理與邏輯壞塊.txtOracle
- Oracle壞塊處理Oracle
- Oracle資料庫處理壞塊問題常用命令Oracle資料庫
- 如何處理Oracle資料庫中的壞塊問題(轉)Oracle資料庫
- oracle 普通表空間資料檔案壞塊Oracle
- Oracle日常問題-壞塊修復Oracle
- truncate操作消除ORACLE SEG壞塊解析Oracle
- Oracle資料庫出現ORA-19566 LOB壞塊的處理記錄Oracle資料庫
- 【BLOCK】Oracle壞塊處理命令參考BloCOracle
- 【資料庫資料恢復】Oracle資料庫檔案出現壞塊報錯的資料恢復案例資料庫資料恢復Oracle
- 學習這篇Oracle資料庫檔案壞塊損壞的恢復方法,擴充你的知識面Oracle資料庫
- 一個簡單易用的資料庫壞塊處理方案資料庫
- RMAN修復壞塊
- 伺服器Oracle資料庫損壞修復伺服器Oracle資料庫
- 【LINUX】Oracle資料庫 linux磁碟頭資料損壞修復LinuxOracle資料庫
- RMAN備份中發現壞塊
- PostgreSQL 恢復大法 - 恢復部分資料庫、跳過壞塊、修復無法啟動的資料庫SQL資料庫
- 案例:DG主庫未設定force logging導致備庫壞塊
- Oracle資料庫不同損壞級別的恢復詳解Oracle資料庫
- Oracle資料塊格式Oracle
- 【伺服器資料恢復】IBM儲存伺服器硬碟壞道離線、oracle資料庫損壞的資料恢復伺服器資料恢復IBM硬碟Oracle資料庫
- OceanBase 原始碼解讀(十二):宏塊的垃圾回收和壞塊檢查原始碼
- 一次壞塊的處理過程(一)
- 一次壞塊的處理過程(二)
- PostgreSQL資料庫toast表損壞解決SQL資料庫AST
- SQLite資料庫損壞及其修復探究SQLite資料庫
- ORACLE 資料塊格式深入解析Oracle
- [20190718]12c壞塊處理一例.txt
- 深入解析:段頭塊損壞bbed異常恢復
- ORACLE一體機pcie 快取卡損壞導致資料庫dang機Oracle快取資料庫
- 某公司伺服器raid陣列2塊硬碟損壞資料恢復成功案例伺服器AI陣列硬碟資料恢復
- MySQL資料庫InnoDB壞頁處理修復MySql資料庫
- OceanBase儲存層程式碼解讀(四):宏塊的垃圾回收和壞塊檢查
- 驗證ADG的壞塊檢測和自動修復
- 織夢資料庫配置檔案資料庫損壞:嘗試修復資料庫資料庫