標籤:nbsp 編號 off 初始化 deferred 條件 對象 提高 視圖
1.什麼是塊損壞:
所謂損壞的資料區塊,是指塊沒有採用可識別的 Oracle 格式,或者其內容在內部不一致。
通常情況下,損壞是由硬體故障或作業系統問題引起的。Oracle 資料庫將損壞的塊標識為“邏輯損壞”或“介質損壞”。
假設是邏輯損壞,則是 Oracle 內部錯誤。
Oracle 資料庫檢測到不一致之後,就將邏輯損壞的塊標記為損壞。假設是介質損壞,則是塊格式不對;從磁碟讀取的塊不包括有意義的資訊。
通過恢複塊,或者刪除包括損壞塊的資料庫物件(或同一時候採用這兩種方式)。能夠修複介質損壞的塊。
假設介質損壞是由硬體故障引起的,則僅僅有修複了硬體故障後,才幹徹底解決這個問題。
僅僅要對塊運行讀或寫操作。就會運行下列一致性檢查:
--塊版本號碼
--快速緩衝中的 DBA(資料區塊地址)值與塊緩衝區中的 DBA 值比較的結果
--塊校正和(假設啟用)
損壞的塊被標識為下面類別:
--介質損壞
--邏輯(或軟體)損壞
2.塊損壞故障現象:ORA-01578
ORA-01578 錯誤:“ORACLE data block corrupted (file # %s, block # %s)”:
--發現損壞的資料區塊時產生此資訊
--始終返回相對檔案號和塊號
--返回到發出查詢的會話(該查詢在發現損壞時運行)
--顯示在 alert.log 檔案裡
普通情況下。ORA-01578 錯誤是由硬體問題引起的。
假設 ORA-01578 錯誤始終返回同樣的參數,則最可能的原因是塊介質損壞。
假設返回的參數每次都有變化,則可能存在硬體問題。應檢查記憶體和頁面空間。並檢查 I/O 子系統,以便尋找有問題的控制器。
註:ORA-01578 會返回相對檔案號,但隨之出現的 ORA-01110 錯誤會顯示絕對檔案號。
3.怎樣處理損壞
--檢查預警日誌和作業系統記錄檔。
--使用可用的診斷工具,找出損壞的類型。
--多次執行檢查功能,確定錯誤是否持續存在。
--依據須要。從損壞的對象中恢複資料。
--解決硬體問題:
記憶體條、
磁碟控制卡、
磁碟
--依據須要。從損壞的對象中恢複或還原資料。
始終嘗試確定錯誤是否持續出現。多次執行 ANALYZE 命令;假設可能,可執行關閉再啟動操作,然後再次嘗試早先發生問題的操作。尋找是否有其他損壞。假設發現一個損壞的塊。則可能還存在其他損壞的塊。
硬體故障必須馬上解決。
遇到硬體問題時,應與供應商取得聯絡,在檢查並修複了電腦後再繼續工作。此時應執行一次全面的硬體診斷會話。
硬體故障的類型可能會有非常多種:
--I/O 硬體或韌體故障
--作業系統
--I/O 或快速緩衝問題
--記憶體或分頁問題
--磁碟修複有用程式
4.即時驗證塊完整性:DB_BLOCK_CHECKING :
可通過將 DB_BLOCK_CHECKING 初始化參數設定為 TRUE 啟用資料庫塊檢查。
僅僅要改動了資料區塊或索引塊,此項檢查就會檢查資料區塊和索引塊的內部一致性。
DB_BLOCK_CHECKING 是一個動態參數。可使用 ALTER SYSTEM SET 語句改動此參數。對於系統資料表空間,將始終啟用塊檢查。塊檢查一般會產生 1% 到 10% 的開銷,詳細取決於工作量。正在啟動並執行更新或插入操作越多,運行塊檢查的開銷就會越高。DB_BLOCK_CHECKING 有下面四個可能的值:
--OFF:除 SYSTEM 之外的全部資料表空間都不運行塊檢查。
--LOW:在記憶體中塊的內容發生更改之後(比如。在運行 UPDATE 或 INSERT 語句以及在運行磁碟上讀取後)。運行主要的塊頭檢查。
--MEDIUM:運行全部 LOW 檢查, 對全部不是按索引組織的表塊運行語義塊檢查。
--FULL:運行全部 LOW 和 MEDIUM 檢查, 對索引塊運行語義檢查。
初始化參數 DB_BLOCK_CHECKING:
--在對每一個塊運行自我一致性檢查時,控制檢查的處理程度
--可防止記憶體和資料損毀
--可使用 ALTER SESSION 命令或 ALTER SYSTEM DEFERRED 命令進行設定
5.塊介質恢複
大多數情況下。第一次遇到損壞時,資料庫會將塊標記為介質損壞。然後將其寫到磁碟上。
在該塊得到恢複之前,不能對其運行不論什麼興許讀取操作。
僅僅能對標記為損壞或者未通過損壞檢查的塊運行塊恢複。
可使用 RMAN RECOVER...BLOCK 命令運行塊介質恢複。預設情況下,RMAN 會在閃回日誌中搜尋好的塊副本。然後在全然備份或 0 級增量備份中搜尋塊。假設 RMAN 找到了好的副本。則會還原這些副本,並對塊運行介質恢複。
塊介質恢複僅僅能將重做日誌用於介質恢複,不能使用增量備份。
V$DATABASE_BLOCK_CORRUPTION 視圖顯示由資料庫組件(如 RMAN 命令、ANALYZE、dbv、SQL 查詢等)標記為損壞的塊。對於下面類型的損壞此視圖會添加對應的行:
--物理/介質損壞:資料庫無法識別塊:校正和無效、塊內容所有為零或者塊頭不完整。預設情況下。物理損壞檢查處於啟用狀態。
--邏輯損壞:塊的校正和有效,塊頭和塊尾也匹配。可是內容不一致。塊介質恢複不能修複邏輯塊損壞。預設情況下,邏輯損壞檢查處于禁用狀態。通過指定 BACKUP、RESTORE、RECOVER 和 VALIDATE 命令的 CHECK LOGICAL 選項。能夠啟用邏輯損壞檢查。
塊介質恢複:
--減少平均恢復 (MTTR)
--提高介質恢複期間的可用性
--恢複期間資料檔案保持聯機狀態
--僅僅有正在恢複的塊是不可訪問的
--使用 RMAN RECOVER...BLOCK 命令調用
--使用閃回日誌以及全然備份或 0 級備份還原塊
--使用重做日誌運行介質恢複
--V$DATABASE_BLOCK_CORRUPTION 視圖顯示標記為損壞的塊
6.塊介質恢複的先決條件
--目標資料庫必須處於 ARCHIVELOG 模式
--包括損壞塊的資料檔案的備份必須是全然備份或 0 級備份。
--要使用代理副本,必須先將它們還原到非預設位置
--RMAN 僅僅能使用歸檔的重做日誌進行恢複
--要使用閃回日誌。必須啟用閃回資料庫
下面先決條件適用於 RECOVER ... BLOCK 命令:
--目標資料庫必須以 ARCHIVELOG 模式執行。而且必須是開啟的。或是使用當前控制檔案裝載的。
--包括損壞塊的資料檔案備份必須是全然備份或 0 級備份,不能是代理副本。假設僅僅存在代理副本備份。則可將它們還原到磁碟上的非預設位置。在這樣的情況下。RMAN 會覺得它們是資料檔案副本,在塊介質恢複過程中會在當中搜尋塊。
--RMAN 僅僅能使用歸檔的重做日誌進行恢複。
RMAN 不能使用 1 級增量備份。塊介質恢複不能恢複丟失或無法訪問的歸檔重做日誌。但有時能夠恢複丟失的重做記錄。
--必須在目標資料庫上啟用閃回資料庫。這樣 RMAN 才幹在閃回日誌中搜尋損壞塊的好副本。假設啟用了閃回事件記錄,而且此事件記錄包括損壞塊的較舊但未損壞的版本號碼,則 RMAN 能夠使用這些塊,因而可能會提高恢複的速度。
7.RECOVER...BLOCK 命令
--確定包括要進行恢複的塊的備份
--讀取備份並將請求的塊累積到記憶體緩衝區
--必要時。通過從備份中讀取歸檔日誌來管理塊介質恢複會話
RECOVER DATAFILE 6 BLOCK 3; Recover a single block
RECOVER Recover multiple blocks
DATAFILE 2 BLOCK 43 in multiple data files
DATAFILE 2 BLOCK 79
DATAFILE 6 BLOCK 183;
RECOVER CORRUPTION LIST; Recover all blocks logged in V$DATABASE_BLOCK_CORRUPTION
恢複單個塊:
在進行塊恢複之前,必須確定損壞的塊。普通情況下,會在下面位置中報告塊損壞:
--LIST FAILURE、VALIDATE 或 BACKUP ...VALIDATE 命令的結果
--V$DATABASE_BLOCK_CORRUPTION 視圖
--標準輸出中的錯誤訊息
--預警記錄檔和使用者追蹤檔案(在 V$DIAG_INFO 視圖中標識)
--SQL ANALYZE TABLE 和 ANALYZE INDEX 命令的結果
--DBVERIFY 有用程式的結果
比如,可能會在使用者追蹤檔案裡發現下面訊息:
ORA-01578: ORACLE data block corrupted (file # 7, block # 3)
ORA-01110: data file 7: ‘/oracle/oradata/orcl/tools01.dbf‘
ORA-01578: ORACLE data block corrupted (file # 2, block # 235)
ORA-01110: data file 2: ‘/oracle/oradata/orcl/undotbs01.dbf‘
--確定了塊以後,在 RMAN 提示符下執行 RECOVER ...BLOCK 命令。指定損壞塊的檔案號和塊編號。
RECOVER
DATAFILE 7 BLOCK 3
DATAFILE 2 BLOCK 235;
8.使用10231事件進行處理:
(塊損壞但沒有備份,沒辦法回複的情況下)
在sqlplus中運行例如以下命令:
ALTER SYSTEM SET EVENTS=‘10231 trace name context forever,level 10‘;
然後匯出該表:
exp test/test file=t.dmp tables=t;
在資料庫中刪除該表
drop table t;
然後匯入
imp test/test file=t.dmp tables=t;
最後關閉10231事件:
ALTER SYSTEM SET EVENTS=‘10231 trace name context off‘;
Oracle 資料區塊損壞與恢複具體解釋