[OCP學習筆記]043-07-處理資料庫損壞--基本知識
一、基本知識總結
1. 介質損壞(media corrupt)與邏輯損壞(logically corrupt)
所謂“塊損壞”指塊沒有采用可識別的Oracle 格式,或者其內容在內部不一致。通常情況下,損壞是由硬體故障或作業系統問題引起的,包括介質損壞和塊損壞。Oracle 資料庫將損壞的塊標識為“邏輯損壞”或“介質損壞”。
介質損壞:Oracle伺服器根本無法識別此塊,校驗和無效,塊的內容全部為零,或者塊頭和塊尾不匹配。通常由硬體引起,需要透過修復硬體來徹底解決問題。此時應執行一次全面的硬體診斷會話,來確定出錯的位置。
邏輯損壞:塊的校驗和有效,塊頭和塊尾也匹配,但是內容在邏輯上不一致。通常是由Oracle內部錯誤引發的,資料庫檢測到不一致後,會將邏輯損壞的塊標記為損壞(表和索引邏輯驗證的詳細介紹,參看analyze....validate structure)。
當損壞發生時,系統將在alert.log中寫入一個ORA-01578和ORA-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,資料庫將為表中主鍵生成一個壓縮統計。
對於Cluster,Oracle將自動驗證群集表的結構。
對於分割槽表,資料庫同樣驗證每一行是否屬於正確的分割槽。如果某行沒有正確的分配,那麼他的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_Indexes、Index_stats、Index_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_utility(Oracle8i之前)軟體包;進行統計分析,則dbms_stats(Oracle8i之後)軟體包功能更加強大。
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;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20162/viewspace-1034186/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [OCP學習筆記]043-07-處理資料庫損壞--模擬實驗(2)筆記資料庫
- [OCP學習筆記]043-07-處理資料庫損壞--模擬實驗(1)筆記資料庫
- 機器學習學習筆記——基本知識機器學習筆記
- 資料庫學習筆記 - MySQL基礎知識資料庫筆記MySql
- 資料庫MySQL需要學習基本知識資料庫MySql
- Java學習筆記之----------Java基本知識Java筆記
- vue學習筆記1-基本知識Vue筆記
- 學習這篇Oracle資料庫檔案壞塊損壞的恢復方法,擴充你的知識面Oracle資料庫
- Python學習筆記020——資料庫知識概述Python筆記資料庫
- Java學習筆記--資料庫初識Java筆記資料庫
- 資料庫壞塊處理資料庫
- 處理塊損壞
- MySQL資料庫INNODB表損壞修復處理過程分享MySql資料庫
- RMAN學習-資料檔案損壞
- YOLOv3學習筆記之資料處理YOLO筆記
- SpringMVC 學習筆記(四) 處理模型資料SpringMVC筆記模型
- Python深度學習(處理文字資料)--學習筆記(十二)Python深度學習筆記
- MySQL資料庫基本知識MySql資料庫
- 資料庫學習筆記資料庫筆記
- 【Pandas學習筆記02】-資料處理高階用法筆記
- 【Pandas學習筆記02】處理資料實用操作筆記
- 資料庫損壞解決:資料庫已損壞,無法分配空間資料庫
- 基礎知識學習筆記筆記
- 資料庫理論知識資料庫
- MySQL資料庫學習筆記MySql資料庫筆記
- ORACLE資料庫壞塊的處理 (處理無物件壞快的方法)Oracle資料庫物件
- 段頭損壞的處理
- React學習筆記-事件處理React筆記事件
- 【原創】sqlserver2005 資料庫表損壞處理一例:SQLServer資料庫
- Oracle資料庫塊的物理損壞與邏輯損壞Oracle資料庫
- ORACLE資料庫壞塊的處理 (一次壞快處理過程)Oracle資料庫
- 資料庫mysql學習筆記記錄資料庫MySql筆記
- RxJava 學習筆記 -- 基礎知識RxJava筆記
- React學習筆記知識點整理React筆記
- mysql資料庫學習基礎知識整理MySql資料庫
- Redis學習筆記(七) 資料庫Redis筆記資料庫
- 達夢資料庫學習筆記資料庫筆記
- python學習筆記:資料庫Python筆記資料庫