1.什么是數(shù)據(jù)塊損壞:
所謂損壞的數(shù)據(jù)塊,是指塊沒有采用可識別的 Oracle 格式,或者其內(nèi)容在內(nèi)部不一致。通常情況下,損壞是由硬件故障或操作系統(tǒng)問題引起的。Oracle 數(shù)據(jù)庫將損壞的塊標識為“邏輯損壞”或“介質(zhì)損壞”。如果是邏輯損壞,則是 Oracle 內(nèi)部錯誤。Oracle 數(shù)據(jù)庫檢測到不一致之后,就將邏輯損壞的塊標記為損壞。如果是介質(zhì)損壞,則是塊格式不正確;從磁盤讀取的塊不包含有意義的信息。
通過恢復(fù)塊,或者刪除包含損壞塊的數(shù)據(jù)庫對象(或同時采用這兩種方式),可以修復(fù)介質(zhì)損壞的塊。如果介質(zhì)損壞是由硬件故障引起的,則只有修復(fù)了硬件故障后,才能徹底解決問題。
只要對塊執(zhí)行讀或?qū)懖僮鳎蜁?zhí)行下列一致性檢查:
--塊版本
--高速緩存中的 DBA(數(shù)據(jù)塊地址)值與塊緩沖區(qū)中的 DBA 值比較的結(jié)果
--塊校驗和(如果啟用)
損壞的塊被標識為以下類別:
--介質(zhì)損壞
--邏輯(或軟件)損壞
2.塊損壞故障現(xiàn)象:ORA-01578
ORA-01578 錯誤:“ORACLE data block corrupted (file # %s, block # %s)”:
--發(fā)現(xiàn)損壞的數(shù)據(jù)塊時生成此信息
--始終返回相對文件號和塊號
--返回到發(fā)出查詢的會話(該查詢在發(fā)現(xiàn)損壞時執(zhí)行)
--顯示在 alert.log 文件中
一般情況下,ORA-01578 錯誤是由硬件問題引起的。如果 ORA-01578 錯誤始終返回相同的參數(shù),則最可能的原因是塊介質(zhì)損壞。
如果返回的參數(shù)每次都有變化,則可能存在硬件問題。應(yīng)檢查內(nèi)存和頁面空間,并檢查 I/O 子系統(tǒng),以便查找有問題的控制器。
注:ORA-01578 會返回相對文件號,但隨之出現(xiàn)的 ORA-01110 錯誤會顯示絕對文件號。
3.如何處理損壞
--檢查預(yù)警日志和操作系統(tǒng)日志文件。
--使用可用的診斷工具,找出損壞的類型。
--多次運行檢查功能,確定錯誤是否持續(xù)存在。
--根據(jù)需要,從損壞的對象中恢復(fù)數(shù)據(jù)。
--解決硬件問題:
內(nèi)存條、
磁盤控制器、
磁盤
--根據(jù)需要,從損壞的對象中恢復(fù)或還原數(shù)據(jù)。
始終嘗試確定錯誤是否持續(xù)出現(xiàn)。多次運行 ANALYZE 命令;如果可能,可執(zhí)行關(guān)閉再啟動操作,然后再次嘗試早先發(fā)生故障的操作。查找是否有其它損壞。如果發(fā)現(xiàn)一個損壞的塊,則可能還存在其它損壞的塊。
硬件故障必須立即解決。遇到硬件問題時,應(yīng)與供應(yīng)商取得聯(lián)系,在檢查并修復(fù)了計算機后再繼續(xù)工作。此時應(yīng)運行一次全面的硬件診斷會話。
硬件故障的類型可能會有很多種:
--I/O 硬件或固件故障
--操作系統(tǒng)
--I/O 或高速緩存問題
--內(nèi)存或分頁問題
--磁盤修復(fù)實用程序
4.實時驗證塊完整性:DB_BLOCK_CHECKING :
可通過將 DB_BLOCK_CHECKING 初始化參數(shù)設(shè)置為 TRUE 啟用數(shù)據(jù)庫塊檢查。只要修改了數(shù)據(jù)塊或索引塊,此項檢查就會檢查數(shù)據(jù)塊和索引塊的內(nèi)部一致性。DB_BLOCK_CHECKING 是一個動態(tài)參數(shù),可使用 ALTER SYSTEM SET 語句修改此參數(shù)。對于系統(tǒng)表空間,將始終啟用塊檢查。塊檢查通常會產(chǎn)生 1% 到 10% 的開銷,具體取決于工作量。正在執(zhí)行的更新或插入操作越多,執(zhí)行塊檢查的開銷就會越高。DB_BLOCK_CHECKING 有以下四個可能的值:
--OFF:除 SYSTEM 之外的所有表空間都不執(zhí)行塊檢查。
--LOW:在內(nèi)存中塊的內(nèi)容發(fā)生更改之后(例如,在執(zhí)行 UPDATE 或 INSERT 語句以及在執(zhí)行磁盤上讀取后),執(zhí)行基本的塊頭檢查。
--MEDIUM:執(zhí)行所有 LOW 檢查, 對所有不是按索引組織的表塊執(zhí)行語義塊檢查。
--FULL:執(zhí)行所有 LOW 和 MEDIUM 檢查, 對索引塊執(zhí)行語義檢查。
初始化參數(shù) DB_BLOCK_CHECKING:
--在對每個塊執(zhí)行自我一致性檢查時,控制檢查的處理程度
--可防止內(nèi)存和數(shù)據(jù)損壞
--可使用 ALTER SESSION 命令或 ALTER SYSTEM DEFERRED 命令進行設(shè)置
5.塊介質(zhì)恢復(fù)
大多數(shù)情況下,第一次遇到損壞時,數(shù)據(jù)庫會將塊標記為介質(zhì)損壞,然后將其寫到磁盤上。在該塊得到恢復(fù)之前,不能對其執(zhí)行任何后續(xù)讀取操作。只能對標記為損壞或者未通過損壞檢查的塊執(zhí)行塊恢復(fù)??墒褂?RMAN RECOVER...BLOCK 命令執(zhí)行塊介質(zhì)恢復(fù)。默認情況下,RMAN 會在閃回日志中搜索好的塊副本,然后在完全備份或 0 級增量備份中搜索塊。如果 RMAN 找到了好的副本,則會還原這些副本,并對塊執(zhí)行介質(zhì)恢復(fù)。塊介質(zhì)恢復(fù)只能將重做日志用于介質(zhì)恢復(fù),不能使用增量備份。
V$DATABASE_BLOCK_CORRUPTION 視圖顯示由數(shù)據(jù)庫組件(如 RMAN 命令、ANALYZE、dbv、SQL 查詢等)標記為損壞的塊。對于以下類型的損壞此視圖會增加相應(yīng)的行:
--物理/介質(zhì)損壞:數(shù)據(jù)庫無法識別塊:校驗和無效、塊內(nèi)容全部為零或者塊頭不完整。默認情況下,物理損壞檢查處于啟用狀態(tài)。
--邏輯損壞:塊的校驗和有效,塊頭和塊尾也匹配,但是內(nèi)容不一致。塊介質(zhì)恢復(fù)不能修復(fù)邏輯塊損壞。默認情況下,邏輯損壞檢查處于禁用狀態(tài)。通過指定 BACKUP、RESTORE、RECOVER 和 VALIDATE 命令的 CHECK LOGICAL 選項,可以啟用邏輯損壞檢查。
塊介質(zhì)恢復(fù):
--降低平均恢復(fù)時間 (MTTR)
--提高介質(zhì)恢復(fù)期間的可用性
--恢復(fù)期間數(shù)據(jù)文件保持聯(lián)機狀態(tài)
--只有正在恢復(fù)的塊是不可訪問的
--使用 RMAN RECOVER...BLOCK 命令調(diào)用
--使用閃回日志以及完全備份或 0 級備份還原塊
--使用重做日志執(zhí)行介質(zhì)恢復(fù)
--V$DATABASE_BLOCK_CORRUPTION 視圖顯示標記為損壞的塊
6.塊介質(zhì)恢復(fù)的先決條件
--目標數(shù)據(jù)庫必須處于 ARCHIVELOG 模式
--包含損壞塊的數(shù)據(jù)文件的備份必須是完全備份或 0 級備份。
--要使用代理副本,必須先將它們還原到非默認位置
--RMAN 只能使用歸檔的重做日志進行恢復(fù)
--要使用閃回日志,必須啟用閃回數(shù)據(jù)庫
以下先決條件適用于 RECOVER ... BLOCK 命令:
--目標數(shù)據(jù)庫必須以 ARCHIVELOG 模式運行,并且必須是打開的,或是使用當前控制文件裝載的。
--包含損壞塊的數(shù)據(jù)文件備份必須是完全備份或 0 級備份,不能是代理副本。如果只存在代理副本備份,則可將它們還原到磁盤上的非默認位置;在這種情況下,RMAN 會認為它們是數(shù)據(jù)文件副本,在塊介質(zhì)恢復(fù)過程中會在其中搜索塊。
--RMAN 只能使用歸檔的重做日志進行恢復(fù)。RMAN 不能使用 1 級增量備份。塊介質(zhì)恢復(fù)不能恢復(fù)丟失或無法訪問的歸檔重做日志,但有時可以恢復(fù)丟失的重做記錄。
--必須在目標數(shù)據(jù)庫上啟用閃回數(shù)據(jù)庫,這樣 RMAN 才能在閃回日志中搜索損壞塊的好副本。如果啟用了閃回事件記錄,并且此事件記錄包含損壞塊的較舊但未損壞的版本,則 RMAN 可以使用這些塊,因而可能會提高恢復(fù)的速度。
7.RECOVER...BLOCK 命令
--確定包含要進行恢復(fù)的塊的備份
--讀取備份并將請求的塊累積到內(nèi)存緩沖區(qū)
--必要時,通過從備份中讀取歸檔日志來管理塊介質(zhì)恢復(fù)會話
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
恢復(fù)單個塊:
在進行塊恢復(fù)之前,必須確定損壞的塊。一般情況下,會在以下位置中報告塊損壞:
--LIST FAILURE、VALIDATE 或 BACKUP ...VALIDATE 命令的結(jié)果
--V$DATABASE_BLOCK_CORRUPTION 視圖
--標準輸出中的錯誤消息
--預(yù)警日志文件和用戶跟蹤文件(在 V$DIAG_INFO 視圖中標識)
--SQL ANALYZE TABLE 和 ANALYZE INDEX 命令的結(jié)果
--DBVERIFY 實用程序的結(jié)果
例如,可能會在用戶跟蹤文件中發(fā)現(xiàn)以下消息:
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事件進行處理:(塊損壞但沒有備份,沒辦法回復(fù)的情況下)
在sqlplus中執(zhí)行如下命令:
ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10';
然后導(dǎo)出該表:
exp test/test file=t.dmp tables=t;
在數(shù)據(jù)庫中刪除該表
drop table t;
然后導(dǎo)入
imp test/test file=t.dmp tables=t;
最后關(guān)閉10231事件:
所謂損壞的數(shù)據(jù)塊,是指塊沒有采用可識別的 Oracle 格式,或者其內(nèi)容在內(nèi)部不一致。通常情況下,損壞是由硬件故障或操作系統(tǒng)問題引起的。Oracle 數(shù)據(jù)庫將損壞的塊標識為“邏輯損壞”或“介質(zhì)損壞”。如果是邏輯損壞,則是 Oracle 內(nèi)部錯誤。Oracle 數(shù)據(jù)庫檢測到不一致之后,就將邏輯損壞的塊標記為損壞。如果是介質(zhì)損壞,則是塊格式不正確;從磁盤讀取的塊不包含有意義的信息。
通過恢復(fù)塊,或者刪除包含損壞塊的數(shù)據(jù)庫對象(或同時采用這兩種方式),可以修復(fù)介質(zhì)損壞的塊。如果介質(zhì)損壞是由硬件故障引起的,則只有修復(fù)了硬件故障后,才能徹底解決問題。

--塊版本
--高速緩存中的 DBA(數(shù)據(jù)塊地址)值與塊緩沖區(qū)中的 DBA 值比較的結(jié)果
--塊校驗和(如果啟用)
損壞的塊被標識為以下類別:
--介質(zhì)損壞
--邏輯(或軟件)損壞
2.塊損壞故障現(xiàn)象:ORA-01578
ORA-01578 錯誤:“ORACLE data block corrupted (file # %s, block # %s)”:
--發(fā)現(xiàn)損壞的數(shù)據(jù)塊時生成此信息
--始終返回相對文件號和塊號
--返回到發(fā)出查詢的會話(該查詢在發(fā)現(xiàn)損壞時執(zhí)行)
--顯示在 alert.log 文件中
一般情況下,ORA-01578 錯誤是由硬件問題引起的。如果 ORA-01578 錯誤始終返回相同的參數(shù),則最可能的原因是塊介質(zhì)損壞。
如果返回的參數(shù)每次都有變化,則可能存在硬件問題。應(yīng)檢查內(nèi)存和頁面空間,并檢查 I/O 子系統(tǒng),以便查找有問題的控制器。
注:ORA-01578 會返回相對文件號,但隨之出現(xiàn)的 ORA-01110 錯誤會顯示絕對文件號。
3.如何處理損壞
--檢查預(yù)警日志和操作系統(tǒng)日志文件。
--使用可用的診斷工具,找出損壞的類型。
--多次運行檢查功能,確定錯誤是否持續(xù)存在。
--根據(jù)需要,從損壞的對象中恢復(fù)數(shù)據(jù)。
--解決硬件問題:
內(nèi)存條、
磁盤控制器、
磁盤
--根據(jù)需要,從損壞的對象中恢復(fù)或還原數(shù)據(jù)。
始終嘗試確定錯誤是否持續(xù)出現(xiàn)。多次運行 ANALYZE 命令;如果可能,可執(zhí)行關(guān)閉再啟動操作,然后再次嘗試早先發(fā)生故障的操作。查找是否有其它損壞。如果發(fā)現(xiàn)一個損壞的塊,則可能還存在其它損壞的塊。
硬件故障必須立即解決。遇到硬件問題時,應(yīng)與供應(yīng)商取得聯(lián)系,在檢查并修復(fù)了計算機后再繼續(xù)工作。此時應(yīng)運行一次全面的硬件診斷會話。
硬件故障的類型可能會有很多種:
--I/O 硬件或固件故障
--操作系統(tǒng)
--I/O 或高速緩存問題
--內(nèi)存或分頁問題
--磁盤修復(fù)實用程序
4.實時驗證塊完整性:DB_BLOCK_CHECKING :
可通過將 DB_BLOCK_CHECKING 初始化參數(shù)設(shè)置為 TRUE 啟用數(shù)據(jù)庫塊檢查。只要修改了數(shù)據(jù)塊或索引塊,此項檢查就會檢查數(shù)據(jù)塊和索引塊的內(nèi)部一致性。DB_BLOCK_CHECKING 是一個動態(tài)參數(shù),可使用 ALTER SYSTEM SET 語句修改此參數(shù)。對于系統(tǒng)表空間,將始終啟用塊檢查。塊檢查通常會產(chǎn)生 1% 到 10% 的開銷,具體取決于工作量。正在執(zhí)行的更新或插入操作越多,執(zhí)行塊檢查的開銷就會越高。DB_BLOCK_CHECKING 有以下四個可能的值:
--OFF:除 SYSTEM 之外的所有表空間都不執(zhí)行塊檢查。
--LOW:在內(nèi)存中塊的內(nèi)容發(fā)生更改之后(例如,在執(zhí)行 UPDATE 或 INSERT 語句以及在執(zhí)行磁盤上讀取后),執(zhí)行基本的塊頭檢查。
--MEDIUM:執(zhí)行所有 LOW 檢查, 對所有不是按索引組織的表塊執(zhí)行語義塊檢查。
--FULL:執(zhí)行所有 LOW 和 MEDIUM 檢查, 對索引塊執(zhí)行語義檢查。
初始化參數(shù) DB_BLOCK_CHECKING:
--在對每個塊執(zhí)行自我一致性檢查時,控制檢查的處理程度
--可防止內(nèi)存和數(shù)據(jù)損壞
--可使用 ALTER SESSION 命令或 ALTER SYSTEM DEFERRED 命令進行設(shè)置
5.塊介質(zhì)恢復(fù)
大多數(shù)情況下,第一次遇到損壞時,數(shù)據(jù)庫會將塊標記為介質(zhì)損壞,然后將其寫到磁盤上。在該塊得到恢復(fù)之前,不能對其執(zhí)行任何后續(xù)讀取操作。只能對標記為損壞或者未通過損壞檢查的塊執(zhí)行塊恢復(fù)??墒褂?RMAN RECOVER...BLOCK 命令執(zhí)行塊介質(zhì)恢復(fù)。默認情況下,RMAN 會在閃回日志中搜索好的塊副本,然后在完全備份或 0 級增量備份中搜索塊。如果 RMAN 找到了好的副本,則會還原這些副本,并對塊執(zhí)行介質(zhì)恢復(fù)。塊介質(zhì)恢復(fù)只能將重做日志用于介質(zhì)恢復(fù),不能使用增量備份。
V$DATABASE_BLOCK_CORRUPTION 視圖顯示由數(shù)據(jù)庫組件(如 RMAN 命令、ANALYZE、dbv、SQL 查詢等)標記為損壞的塊。對于以下類型的損壞此視圖會增加相應(yīng)的行:
--物理/介質(zhì)損壞:數(shù)據(jù)庫無法識別塊:校驗和無效、塊內(nèi)容全部為零或者塊頭不完整。默認情況下,物理損壞檢查處于啟用狀態(tài)。
--邏輯損壞:塊的校驗和有效,塊頭和塊尾也匹配,但是內(nèi)容不一致。塊介質(zhì)恢復(fù)不能修復(fù)邏輯塊損壞。默認情況下,邏輯損壞檢查處于禁用狀態(tài)。通過指定 BACKUP、RESTORE、RECOVER 和 VALIDATE 命令的 CHECK LOGICAL 選項,可以啟用邏輯損壞檢查。
塊介質(zhì)恢復(fù):
--降低平均恢復(fù)時間 (MTTR)
--提高介質(zhì)恢復(fù)期間的可用性
--恢復(fù)期間數(shù)據(jù)文件保持聯(lián)機狀態(tài)
--只有正在恢復(fù)的塊是不可訪問的
--使用 RMAN RECOVER...BLOCK 命令調(diào)用
--使用閃回日志以及完全備份或 0 級備份還原塊
--使用重做日志執(zhí)行介質(zhì)恢復(fù)
--V$DATABASE_BLOCK_CORRUPTION 視圖顯示標記為損壞的塊
6.塊介質(zhì)恢復(fù)的先決條件
--目標數(shù)據(jù)庫必須處于 ARCHIVELOG 模式
--包含損壞塊的數(shù)據(jù)文件的備份必須是完全備份或 0 級備份。
--要使用代理副本,必須先將它們還原到非默認位置
--RMAN 只能使用歸檔的重做日志進行恢復(fù)
--要使用閃回日志,必須啟用閃回數(shù)據(jù)庫
以下先決條件適用于 RECOVER ... BLOCK 命令:
--目標數(shù)據(jù)庫必須以 ARCHIVELOG 模式運行,并且必須是打開的,或是使用當前控制文件裝載的。
--包含損壞塊的數(shù)據(jù)文件備份必須是完全備份或 0 級備份,不能是代理副本。如果只存在代理副本備份,則可將它們還原到磁盤上的非默認位置;在這種情況下,RMAN 會認為它們是數(shù)據(jù)文件副本,在塊介質(zhì)恢復(fù)過程中會在其中搜索塊。
--RMAN 只能使用歸檔的重做日志進行恢復(fù)。RMAN 不能使用 1 級增量備份。塊介質(zhì)恢復(fù)不能恢復(fù)丟失或無法訪問的歸檔重做日志,但有時可以恢復(fù)丟失的重做記錄。
--必須在目標數(shù)據(jù)庫上啟用閃回數(shù)據(jù)庫,這樣 RMAN 才能在閃回日志中搜索損壞塊的好副本。如果啟用了閃回事件記錄,并且此事件記錄包含損壞塊的較舊但未損壞的版本,則 RMAN 可以使用這些塊,因而可能會提高恢復(fù)的速度。
7.RECOVER...BLOCK 命令
--確定包含要進行恢復(fù)的塊的備份
--讀取備份并將請求的塊累積到內(nèi)存緩沖區(qū)
--必要時,通過從備份中讀取歸檔日志來管理塊介質(zhì)恢復(fù)會話
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
恢復(fù)單個塊:
在進行塊恢復(fù)之前,必須確定損壞的塊。一般情況下,會在以下位置中報告塊損壞:
--LIST FAILURE、VALIDATE 或 BACKUP ...VALIDATE 命令的結(jié)果
--V$DATABASE_BLOCK_CORRUPTION 視圖
--標準輸出中的錯誤消息
--預(yù)警日志文件和用戶跟蹤文件(在 V$DIAG_INFO 視圖中標識)
--SQL ANALYZE TABLE 和 ANALYZE INDEX 命令的結(jié)果
--DBVERIFY 實用程序的結(jié)果
例如,可能會在用戶跟蹤文件中發(fā)現(xiàn)以下消息:
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事件進行處理:(塊損壞但沒有備份,沒辦法回復(fù)的情況下)
在sqlplus中執(zhí)行如下命令:
ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10';
然后導(dǎo)出該表:
exp test/test file=t.dmp tables=t;
在數(shù)據(jù)庫中刪除該表
drop table t;
然后導(dǎo)入
imp test/test file=t.dmp tables=t;
最后關(guān)閉10231事件:
ALTER SYSTEM SET EVENTS='10231 trace name context off';


上一篇:延長硬盤壽命的一些方法