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