有2種通用的辦法:
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供孝感企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、網(wǎng)站設(shè)計(jì)、H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為孝感眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
1 blockrecover
2 dbms_repair
注意:第二種辦法會(huì)丟棄壞塊中的所有數(shù)據(jù)。
所以事先確定邏輯壞塊中是否有數(shù)據(jù),數(shù)據(jù)是否有備份。
dbv工具可以用來(lái)驗(yàn)證數(shù)據(jù)文件的有效性,在數(shù)據(jù)庫(kù)恢復(fù)之前可以使用該命令對(duì)備份文件進(jìn)行有效性檢查,
防止因備份文件本身的問(wèn)題導(dǎo)致數(shù)據(jù)庫(kù)無(wú)法恢復(fù)。
當(dāng)然,dbv命令也可以對(duì)在線的數(shù)據(jù)文件進(jìn)行檢查。
注意,dbv工具只可以對(duì)數(shù)據(jù)文件進(jìn)行檢查,無(wú)法使用它完成控制文件和日志文件的檢查。
1.dbv命令語(yǔ)法
dbverify ::=
dbv [ USERID=username/password ]
FILE = filename
| { START = block_address | END = block_address }
| BLOCKSIZE = integer
| HIGH_SCN = integer
| LOGFILE = filename
| FEEDBACK = integer
| HELP = { Y | N }
| PARFILE = filename
End of description.
參考自O(shè)racle官方文檔
2.查看幫助文檔
從語(yǔ)法定義中我們看到“HELP = { Y | N }”選項(xiàng),我們可以使用它查看dbv的幫助信息。
ticket@secDB /home/oracle$ dbv help=y
DBVERIFY: Release 11.2.0.1.0 - Production on Wed Mar 31 19:47:36 2010
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Keyword Description (Default)
----------------------------------------------------
FILE File to Verify (NONE)
START Start Block (First Block of File)
END End Block (Last Block of File)
BLOCKSIZE Logical Block Size (8192)
LOGFILE Output Log (NONE)
FEEDBACK Display Progress (0)
PARFILE Parameter File (NONE)
USERID Username/Password (NONE)
SEGMENT_ID Segment ID (tsn.relfile.block) (NONE)
HIGH_SCN Highest Block SCN To Verify (NONE)
(scn_wrap.scn_base OR scn)
幫助信息中描述了dbv命令的使用方法,不贅述。
3.體驗(yàn)dbv工具的效果
1)查看系統(tǒng)中的數(shù)據(jù)文件名稱
sys@ticket col name for a60
sys@ticket select name from v$datafile;
NAME
------------------------------------------------------------
/oracle/ora11gR2/oradata/ticket/system01.dbf
/oracle/ora11gR2/oradata/ticket/sysaux01.dbf
/oracle/ora11gR2/oradata/ticket/undotbs01.dbf
/oracle/ora11gR2/oradata/ticket/users01.dbf
2)使用dbv工具對(duì)users01.dbf進(jìn)行檢查
(1)使用最簡(jiǎn)單的參數(shù)
sys@ticket !dbv file=/oracle/ora11gR2/oradata/ticket/users01.dbf
DBVERIFY: Release 11.2.0.1.0 - Production on Wed Mar 31 19:50:59 2010
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
DBVERIFY - Verification starting : FILE = /oracle/ora11gR2/oradata/ticket/users01.dbf
DBVERIFY - Verification complete
Total Pages Examined : 35520
Total Pages Processed (Data) : 33029
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 20
Total Pages Failing (Index): 0
Total Pages Processed (Other): 402
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 2069
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 9291961 (0.9291961)
在實(shí)際使用中重點(diǎn)關(guān)注以下信息:
Total Pages Failing (Data) : 0
Total Pages Failing (Index): 0
Total Pages Failing (Seg) : 0
Total Pages Marked Corrupt : 0
如果以上信息返回結(jié)果不為0,需要重點(diǎn)關(guān)注!及時(shí)排查原因。
(2)如果指定logfile參數(shù),檢查結(jié)果將只記錄在日志文件中,屏幕上不顯示
sys@ticket !dbv file=/oracle/ora11gR2/oradata/ticket/users01.dbf logfile=dbv_users01.log
DBVERIFY: Release 11.2.0.1.0 - Production on Wed Mar 31 19:52:20 2010
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
此時(shí)可以使用SQL*Plus的edit命令查看生成的日志文件內(nèi)容。
sys@ticket ed dbv_users01.log
如果數(shù)據(jù)庫(kù)是歸檔方式下,并且有完整的物理備份,就可以使用此方法來(lái)恢復(fù)。
步驟如下:
1) 先offline受影響的數(shù)據(jù)文件,執(zhí)行以下的語(yǔ)句:
ALTER DATABASE DATAFILE 'name_file' OFFLINE;
2) 保留有壞塊的數(shù)據(jù)文件,然后拷貝備份的數(shù)據(jù)文件。如果恢復(fù)的數(shù)據(jù)文件要求路徑不同,執(zhí)行以下的語(yǔ)句:
ALTER DATABASE RENAME FILE 'old_name' TO 'new_name';
3) 恢復(fù)數(shù)據(jù)文件,執(zhí)行以下語(yǔ)句:
RECOVER DATAFILE 'name_of_file';
4) Online恢復(fù)后的數(shù)據(jù)文件,執(zhí)行以下的語(yǔ)句:
ALTER DATABASE DATAFILE 'name_of_file' ONLINE;
? 只恢復(fù)壞的block(9i以上版本可用)
使用這種方法要求數(shù)據(jù)庫(kù)版本是9.2.0以上,要求配置了Rman的catalog數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)為歸檔方式,并且有完整的物理備份。
步驟如下:
使用RMAN的BLOCKRECOVER命令 :
Rmanrun{blockrecover datafile 5 block 11,16;}
也可以強(qiáng)制使用某個(gè)SCN號(hào)之前的備份,恢復(fù)數(shù)據(jù)塊。
Rmanrun{blockrecover datafile 5 block 11,16 restore until sequence 8505;}
? 通過(guò)ROWID RANGE SCAN 保存數(shù)據(jù)
1) 先取得壞塊中ROW ID的最小值,執(zhí)行以下的語(yǔ)句:
SELECT dbms_rowid.rowid_create(1,OBJ_ID,RFN,BL,0) from DUAL;
2)取得壞塊中的ROW ID的最大值,執(zhí)行以下的語(yǔ)句:
SELECT dbms_rowid.rowid_create(1,OBJ_ID,RFN,BL+1,0) from DUAL;
3)建議一個(gè)臨時(shí)表存儲(chǔ)那些沒(méi)有壞塊的數(shù)據(jù),執(zhí)行以下的語(yǔ)句:
CREATE TABLE salvage_table AS SELECT * FROM corrupt_tab Where 1=2;
4)保存那些不存在壞塊的數(shù)據(jù)到臨時(shí)表中,執(zhí)行以下的語(yǔ)句:
INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM owner.tablename A WHERE rowid 'low_rid';
INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM owner.tablename A WHERE rowid = 'hi_rid‘;
5) 根據(jù)臨時(shí)表中的數(shù)據(jù)重建表,重建表上的索引,限制。
? 使用10231診斷事件,在做全表掃描的時(shí)候跳過(guò)壞塊
可以在session級(jí)別設(shè)定:
ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';
也可以在數(shù)據(jù)庫(kù)級(jí)別上設(shè)定,在初始化參數(shù)中加入:event="10231 trace name context forever, level 10" ,然后重啟數(shù)據(jù)庫(kù)。
然后從存在壞塊的表中取出不存在壞塊的數(shù)據(jù),執(zhí)行以下的語(yǔ)句:
CREATE TABLE salvage_emp AS SELECT * FROM corrupt_table;
最后rename生成的corrupt_table為原來(lái)表的名字,并重建表上的索引和限制。
? 使用dbms_repair包進(jìn)行恢復(fù)
使用dbms_repair標(biāo)記有壞塊的表,在做全表掃描的時(shí)候跳過(guò)壞塊,執(zhí)行以下的語(yǔ)句:
Execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('schema','tablename');
然后使用exp工具或者createtable as select的方法取出沒(méi)有壞塊數(shù)據(jù),然后重建表,表上的索引和限制。
如何使用rman 檢查oracle數(shù)據(jù)庫(kù)壞塊
oracle檢測(cè)壞塊的方式:
1、利用oracle的RMAN工具
2、利用dbv工具檢測(cè)
3、利用 exp/imp工具檢測(cè)
oracle數(shù)據(jù)庫(kù)的壞塊問(wèn)題是個(gè)讓人比較頭痛的問(wèn)題,主要分為邏輯壞塊和物理壞塊,邏輯壞塊就是數(shù)據(jù)文件里的邏輯關(guān)系出現(xiàn)的混亂,這一般是由于數(shù)據(jù)庫(kù)的BUG導(dǎo)致的。物理壞塊就是數(shù)據(jù)文件中的數(shù)據(jù)不存在任何意義,沒(méi)有任何邏輯和結(jié)構(gòu),造成物理壞塊多因?yàn)榉?wù)器IO系統(tǒng)故障導(dǎo)致的。