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