[OCP學習筆記]043-07-處理資料庫損壞--基本知識

xuqingwei發表於2010-06-05

一、基本知識總結

1. 介質損壞(media corrupt)與邏輯損壞(logically corrupt

所謂“塊損壞”指塊沒有采用可識別的Oracle 格式,或者其內容在內部不一致。通常情況下,損壞是由硬體故障或作業系統問題引起的,包括介質損壞和塊損壞。Oracle 資料庫將損壞的塊標識為“邏輯損壞”或“介質損壞”。

介質損壞Oracle伺服器根本無法識別此塊,校驗和無效,塊的內容全部為零,或者塊頭和塊尾不匹配。通常由硬體引起,需要透過修復硬體來徹底解決問題。此時應執行一次全面的硬體診斷會話,來確定出錯的位置。

邏輯損壞:塊的校驗和有效,塊頭和塊尾也匹配,但是內容在邏輯上不一致。通常是由Oracle內部錯誤引發的,資料庫檢測到不一致後,會將邏輯損壞的塊標記為損壞(表和索引邏輯驗證的詳細介紹,參看analyze....validate structure)。

當損壞發生時,系統將在alert.log中寫入一個ORA-01578ORA-01110錯誤。:ORA-01578 會返回相對檔案號,隨之出現的ORA-01110 錯誤會顯示絕對檔案號。

ORA-01578: Oracle data block corrupted (file # 4, block $ 11)

ORA_01110: data file 4: '/db/oradata/study/user01.dbf'

2. 邏輯驗證和物理驗證工具

發現有資料塊壞,我們就需要使用工具來對資料檔案進行掃描,定位到發生損壞的資料塊的位置。暴露出來的資料塊壞可能只是冰山一角,也可能曇花一現,所以為了定位準確,需要多次掃描,仔細確定出錯的位置和性質,再決定解決問題的方案。

DBV

檢查塊的一致性

物理驗證

analyze ...validate structure

分析物件的邏輯結構

邏輯驗證

DB_BLOCK_CHECKING

透過讀取塊中的資料,執行自我一致性檢查

邏輯驗證

DB_BLOCK_CHECKSUM

在寫入磁碟前計算校驗,將其記錄到塊高速緩衝頭中。讀取前,重新計算校驗,確定無物理損壞。

物理驗證

EXP / EXPDP

常規匯出檢測損壞

物理驗證

Flashback

透過閃回查詢確定發生邏輯損壞的時間。運用閃回還原資料損壞。

邏輯驗證

DBMS_REPAIR

檢測並修復表和索引中損壞的塊

邏輯驗證

BMR (BlockRecover)

RMAN從備份集中還原個別資料塊。

所謂的邏輯驗證主要是分析物件的邏輯結構是否完整,類似於執行analyze...validate structure的操作;而物理驗證則在讀取資料塊時計算校驗碼,然後與塊快取記憶體中的進行比較,判斷其一致性。如果不一致,系統會報ORA-01578錯誤。

將上述工具強行分為邏輯驗證還是物理驗證,我覺得沒有必要。例如:select * from table_name這樣的全表掃描,也可以進行物理驗證。只要發生了checksum一類的校驗活動,發現其中可能存在的損壞都可以屬於物理驗證的範圍。而邏輯驗證,我認為主要是在頻繁發生插入、刪除操作後的索引與資料表間存在著差異,以及進行分割槽操作後的分割槽表、進行聚類操作的聚類表等比較複雜的資料塊組織結構中,可能發生的邏輯結構方面的問題。邏輯問題一般是由軟體操作引發的,透過修復可以一次性解決;介質問題則必須先進行硬體修復,否則即便把資料找回來了,也可能再次發生丟失。

對於索引,直接透過重建物件來解決;對於資料庫錯誤,如果系統執行在archive模式下,那麼運用BMR技術來進行塊級別的恢復是最佳的選擇;如果損壞的塊沒有找到相應的備份,那麼將損失降到最低限度是唯一的選擇。

在損壞的塊無法重建的情況下,如果問題發生的時間不長,丟失的資料可以在undo中找到的話,可以使用flashback來找回資訊;如果丟失的資料塊所在表對應的索引尚在,那麼透過DBMS_REPAIR定位到出錯的資料塊,然後將其標識為不可用,從而繼續使用這些物件。

3. DBV

l 主要使用者對備份檔案物理完整性進行檢驗,但不能進行修復

l DBV僅能檢查檔案,不能檢查其中包含的物件;

l DBV不能驗證線上重做日誌檔案和控制檔案的塊錯誤;

4. analyze....validate structure

資料來源:Oracle102server.102b14200statements_4005.htm#i2086320

對於堆表,Oracle將驗證每一個資料塊和記錄的完整性。

對於IOT,資料庫將為表中主鍵生成一個壓縮統計。

對於ClusterOracle將自動驗證群集表的結構。

對於分割槽表,資料庫同樣驗證每一行是否屬於正確的分割槽。如果某行沒有正確的分配,那麼他的rowid將插入到INVALID_ROWS表中。

SYS@ db1>@?/rdbms/admin/utlvalid.sql;

表已建立。

SYS@ db1>create public synonym invalid_rows for invalid_rows;

同義詞已建立。

SYS@ db1>grant insert, select on invalid_rows to public;

授權成功。

SYS@ db1>analyze table scott.emp validate structure into invalid_rows;

analyze table scott.emp validate structure into invalid_rows;

1 行出現錯誤:

ORA-14510: 只能為分割槽表指定 VALIDATE INTO 子句

對於臨時表,Oracle將驗證它在當前會話中的表和索引的結構。

對於索引,資料庫驗證其中每一個資料塊的完整性,並檢查可能存在的塊衝突。系統分析的結果,可以在XXX_IndexesIndex_statsIndex_Histogram資料字典檢視中找到。

SYS@ db1>analyze index pk_emp validate structure; --單獨驗證索引的邏輯完整性。

SYS@ db1>analyze table emp validate structure cascade; --級聯驗證與emp相關的索引的邏輯完整性。

此外,如果使用者需要分析其他schema中的物件,需要analyze any許可權。

analyze的功能還是有很大侷限性的,每條命令只能影響到一個table。如果想對整個schema進行驗證分析,建議使用dbms_utilityOracle8i之前)軟體包;進行統計分析,則dbms_statsOracle8i之後)軟體包功能更加強大。

5. DB_BLOCK_CHECKING系統引數

透過設定該引數,系統自動進行塊邏輯完整性掃描,即系統自動在後臺執行analyze....validate structure的操作。

系統執行插入、刪除的次數越多,系統執行塊檢查的開銷越高。系統將依據引數設定的級別來決定analyze操作的物件範圍。

FULL > MEDIUM > LOW > OFF(FALSE)

l OFF僅檢查SYSTEM表空間中的物件;

l LOW增加記憶體中發生改變的塊;

l MEDIUM增加資料表(除IOT之外,因為其資料存放在索引段中)的檢查

l FULL增加對索引塊的檢查

因為此操作比較耗CPU,預設系統設定為關閉。即使關閉了此選項,也始終對SYSTEM 表空間執行塊檢查。

DB_BLOCK_CHECKING=OFF

6. DBMS_REPAIR軟體包

使用DBMS_REPAIR軟體包,嘗試透過從索引中檢索資料來修復損壞的資料塊。整個修復的基本過程是:

l 透過admin_tables過程建立一個repair_table來記錄物件損壞的狀況和修復指令的資訊,建立orphan_key_table來存放指向損壞資料塊中的行的索引條目。

l 呼叫check_object來檢測壞塊,呼叫fix_corrupt_blocks將壞塊存放到repair_table中。

l 呼叫dump_orphan_keys來保持壞塊中的索引鍵值(即孤鍵),將其存放到orphan_key_table中。

l 如果該表空間採用手工管理的方式,那麼需要呼叫rebuild_freelists來修改freelists。(透過freelists來記錄空塊的技術,在系統採用ASSM進行段管理後不再有用)。

l 執行skip_corruption_blocks,使後續的DML操作跳過壞塊。

任何工具都不是萬能的,使用這個包的同時會帶來資料丟失、表和索引返回資料不一致,完整性約束破壞等其他問題。因此當出現錯誤時,應當首先從物理備份或邏輯備份恢復,使用dbms_repair只是在沒有備份的情況下使用的一種手段,這種方式一般都會造成資料的丟失。

7. 使用RMAN的塊介質恢復(BMR

BMR 將介質恢復的最小可恢復單位從資料檔案縮小到塊,可以降低MTTR,並在恢復的過程中將資料檔案繼續保持在聯機狀態。BMR運用redo流(線上重做日誌和歸檔重做日誌)從相應的備份中還原個別資料塊。

BMR恢復的過程很簡單,難點在如何定位所需恢復的資料塊的位置。當系統報ORA-01578錯誤時,僅僅表示指定的塊存在錯誤。但錯誤往往會發生擴散,或者存在不確定性,例如某些硬體引發的塊錯誤並不穩定。所以需要多次對資料檔案進行掃描,查詢可能存在的錯誤的位置。定位出錯資料塊的方法如下:

l 透過DBV掃描確定:

Corrupt表明當前塊為介質損壞;influx表明當前塊第一次讀首尾不匹配,重讀後匹配。引發influx的原因未必是資料塊壞,當資料庫正處於開啟狀態,DBV將對資料塊進行多次讀取操作,多次讀取的結果可能存在不同。

Influx: number of blocks that are being read and written to at the same time. If the database is open when DBVERIFY is run, DBVERIFY reads blocks multiple times to get a consistent image. But because the database is open, there may be blocks that are being read and written to at the same time (INFLUX).

資料來源:/oracle102/server.102/b14215/dbverify.htm#sthref1837

下面是一個DBV掃描的錯誤塊,Oracle根本無法識別此塊,校驗和無效,塊的內容全部為零(Data in bad block)。dba: 0x00000267指明壞塊的地址(database address),地址為16進位制。file 0, block 615指明壞塊的相對位置。這兩個都可以作為blockrecover進行恢復的依據。

Page 615 is influx - most likely media corrupt

Corrupt block relative dba: 0x0040006C (file 1, block 615)

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: 0x00000000

check value in block header: 0x0

block checksum disabled

透過DBV的提示資訊,可以在RMAN中執行進行修復。

RMAN> BLOCKRECOVER DATAFILE 1 BLOCK 615

或者

RMAN> BLOCKRECOVER TABLESPACE users DBA 4194405

l RMAN驗證

在備份和複製過程中,如果增加validate子句,RMAN會進行塊的校驗。

RMAN> backup validate tablespace users;

RMAN> backup as copy validate tablespace users;

校驗的結果在以下檢視中得到體現。

V$Database_Block_Corruption

V$Backup_Corruption

V$Copy_Corruption

RMAN可以透過使用CORRUPTION LIST 子句,可以恢復V$DATABASE_BLOCK_CORRUPTION 中列出的塊。

RMAN> BLOCKRECOVER CORRUPTION LIST;

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

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

相關文章