洪毅強
Oracle數(shù)據(jù)庫壞塊是指在Oracle數(shù)據(jù)庫的數(shù)據(jù)塊內(nèi)出現(xiàn)內(nèi)容混亂的現(xiàn)象。壞塊的存在,將導(dǎo)致數(shù)據(jù)庫無法正常解析數(shù)據(jù)塊的內(nèi)容,進而使數(shù)據(jù)庫進程報錯乃至掛起,從而導(dǎo)致整個數(shù)據(jù)庫實例出現(xiàn)異常。研究壞塊的產(chǎn)生原因和恢復(fù)方式,對于數(shù)據(jù)庫的健康運行至關(guān)重要。
一.Oracle壞塊的產(chǎn)生原因
Oracle壞塊產(chǎn)生原因大致有如下幾種:
1.硬件問題:由于Oracle處理數(shù)據(jù)塊的過程中,首先將其讀入內(nèi)存,再計算處理完成后,經(jīng)特定進程寫入到磁盤等存儲設(shè)備中。若該過程中內(nèi)存出現(xiàn)故障,計算無法正常進行,導(dǎo)致內(nèi)存數(shù)據(jù)塊內(nèi)容混亂。同樣,在寫入存儲的過程中,若存儲系統(tǒng)出現(xiàn)異常,壞塊也就隨之出現(xiàn)。
2.Recover操作引起:當使用NOLOGING方式對數(shù)據(jù)對象進行操作,又對該對象所在的數(shù)據(jù)文件進行了Recover操作,該對象所對應(yīng)的數(shù)據(jù)塊將被標識為壞塊。
3.異常停庫,關(guān)機,掉電:其引起壞塊的原因與硬件問題類似。
二.Oracle壞塊的檢測方法
Oracle壞塊的檢測及定位步驟大致如下:
1.定期檢查alert.log和相應(yīng)的trace文件記錄的信息。壞塊的產(chǎn)生一般伴隨著ORA-01578錯誤的出現(xiàn),一旦出現(xiàn)壞塊,且數(shù)據(jù)庫還可正常運行的情況下,可以從alert.log中第一時間發(fā)現(xiàn)。
2.發(fā)現(xiàn)壞塊后,應(yīng)首先檢查數(shù)據(jù)庫所在操作系統(tǒng)的日志和報錯信息。同時,根據(jù)Oracle經(jīng)驗,操作系統(tǒng)報錯可能存在一定的滯后性。所以即便操作系統(tǒng)檢查正常,最好也應(yīng)對硬件設(shè)備進行充分檢查。
3.使用DBV工具進行檢測,DBV工具全稱為dbverify,主要目的是為了檢查數(shù)據(jù)文件的物理結(jié)構(gòu),包括數(shù)據(jù)文件是否損壞,是否存在邏輯壞塊,以及數(shù)據(jù)文件中包含何種類型的數(shù)據(jù)。DBV的詳細用法可使用dbv-help進行查詢,在一般情況下,我們使用file參數(shù)即可。同時需要注意的是,file后面要求跟的必須是一個文件擴展名,所以如果使用的是裸設(shè)備進行存儲,就必須使用ln命令,將裸設(shè)備鏈接到一個文件,然后再使用dbv file對這個鏈接文件進行檢測。
4.若只需檢測而不標記壞塊,可使用如下的analyze table命令:
ANALYZE TABLE tablename VALIDATE STRLJCTLIRE GASGADE
檢測的結(jié)果保存在用戶trace文件中。
三.Oracle壞塊的恢復(fù)
在恢復(fù)過程中,需根據(jù)壞塊所處的數(shù)據(jù)對象的類型以及影響范圍而采用不同的恢復(fù)方式。
1.若壞塊出現(xiàn)在少量的數(shù)據(jù)塊上:建議進行數(shù)據(jù)塊級的恢復(fù),相關(guān)命令如下:
blockrecover datafile 8 block 13:
Select * from v$database_block_cormption
blockrecover cormption list:
2.若壞塊出現(xiàn)在少量的數(shù)據(jù)文件上:建議進行數(shù)據(jù)文件及的恢復(fù),此處以user01.dbf為例,相關(guān)步驟和命令如下:
2.1.將壞塊所在的數(shù)據(jù)文件設(shè)置為離線:
ALTER DATABASE DATAFILE 'user01.dbf' OFFLINE;
2.2.使用cp命令或者其他備份軟件備份這些數(shù)據(jù)文件:
cp user01.dbf/backup/user01.dbf
2.3從RMAN備份中恢復(fù)數(shù)據(jù)文件:
set new name for datafile 1 to‘/oradata/user01.dbf':
restore datafile 1;
2.4使用DBV工具對恢復(fù)后的文件進行壞塊檢測:
dbv file=/oradata/user01.dbf,
2.5若不存在壞塊,則執(zhí)行recvoer操作:
recover datafile 1;
2.6恢復(fù)完成后,將數(shù)據(jù)文件設(shè)置為聯(lián)機
ALTER DATABASE DATAFILE 'user01.dbf' ONLINE;
3.若壞塊出現(xiàn)在大量的數(shù)據(jù)文件上,則考慮數(shù)據(jù)庫級的恢復(fù)。相關(guān)的步驟和命令如下:
3.1關(guān)閉數(shù)據(jù)庫:
shutdown immediate;
3.2從RMAN備份中恢復(fù)數(shù)據(jù)文件:
restore datafile 1;
3.3使用DBV工具對恢復(fù)后的文件進行壞塊檢測:
dbv file=/oradata/user01.dbf,
3.4啟動數(shù)據(jù)庫至mount狀態(tài):
startup mount;
3.5根據(jù)實際情況進行rename操作:
3.6將所有文件啟動到聯(lián)機狀態(tài):
ALTER DATABASE DATAFILE 'user01.dbf' ONLINE;
3.7對數(shù)據(jù)庫進行recover操作:
recover database;
3.8打開數(shù)據(jù)庫
alter database open;
四.結(jié)束語
Oracle壞塊的處理方式多種多樣,理解并找出壞塊產(chǎn)生的原因是解決問題的根本。在實際生產(chǎn)庫中處理該類故障,還需考慮該庫所允許的停機時間和數(shù)據(jù)丟失量。因恢復(fù)數(shù)據(jù)文件或數(shù)據(jù)庫需有最近的RMAN備份,所以日常做好生產(chǎn)庫的備份至關(guān)重要。若需快速恢復(fù)業(yè)務(wù),亦可考慮利用dbms_repair來標記和跳過壞塊。