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