有2種通用的辦法:

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供孝感企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、網(wǎng)站設(shè)計、H5頁面制作、小程序制作等業(yè)務(wù)。10年已為孝感眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計公司優(yōu)惠進行中。
1 blockrecover
2 dbms_repair
注意:第二種辦法會丟棄壞塊中的所有數(shù)據(jù)。
所以事先確定邏輯壞塊中是否有數(shù)據(jù),數(shù)據(jù)是否有備份。
dbv工具可以用來驗證數(shù)據(jù)文件的有效性,在數(shù)據(jù)庫恢復(fù)之前可以使用該命令對備份文件進行有效性檢查,
防止因備份文件本身的問題導(dǎo)致數(shù)據(jù)庫無法恢復(fù)。
當然,dbv命令也可以對在線的數(shù)據(jù)文件進行檢查。
注意,dbv工具只可以對數(shù)據(jù)文件進行檢查,無法使用它完成控制文件和日志文件的檢查。
1.dbv命令語法
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.查看幫助文檔
從語法定義中我們看到“HELP = { Y | N }”選項,我們可以使用它查看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.體驗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工具對users01.dbf進行檢查
(1)使用最簡單的參數(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)
在實際使用中重點關(guān)注以下信息:
Total Pages Failing (Data) : 0
Total Pages Failing (Index): 0
Total Pages Failing (Seg) : 0
Total Pages Marked Corrupt : 0
如果以上信息返回結(jié)果不為0,需要重點關(guān)注!及時排查原因。
(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.
此時可以使用SQL*Plus的edit命令查看生成的日志文件內(nèi)容。
sys@ticket ed dbv_users01.log
如果數(shù)據(jù)庫是歸檔方式下,并且有完整的物理備份,就可以使用此方法來恢復(fù)。
步驟如下:
1) 先offline受影響的數(shù)據(jù)文件,執(zhí)行以下的語句:
ALTER DATABASE DATAFILE 'name_file' OFFLINE;
2) 保留有壞塊的數(shù)據(jù)文件,然后拷貝備份的數(shù)據(jù)文件。如果恢復(fù)的數(shù)據(jù)文件要求路徑不同,執(zhí)行以下的語句:
ALTER DATABASE RENAME FILE 'old_name' TO 'new_name';
3) 恢復(fù)數(shù)據(jù)文件,執(zhí)行以下語句:
RECOVER DATAFILE 'name_of_file';
4) Online恢復(fù)后的數(shù)據(jù)文件,執(zhí)行以下的語句:
ALTER DATABASE DATAFILE 'name_of_file' ONLINE;
? 只恢復(fù)壞的block(9i以上版本可用)
使用這種方法要求數(shù)據(jù)庫版本是9.2.0以上,要求配置了Rman的catalog數(shù)據(jù)庫,數(shù)據(jù)庫為歸檔方式,并且有完整的物理備份。
步驟如下:
使用RMAN的BLOCKRECOVER命令 :
Rmanrun{blockrecover datafile 5 block 11,16;}
也可以強制使用某個SCN號之前的備份,恢復(fù)數(shù)據(jù)塊。
Rmanrun{blockrecover datafile 5 block 11,16 restore until sequence 8505;}
? 通過ROWID RANGE SCAN 保存數(shù)據(jù)
1) 先取得壞塊中ROW ID的最小值,執(zhí)行以下的語句:
SELECT dbms_rowid.rowid_create(1,OBJ_ID,RFN,BL,0) from DUAL;
2)取得壞塊中的ROW ID的最大值,執(zhí)行以下的語句:
SELECT dbms_rowid.rowid_create(1,OBJ_ID,RFN,BL+1,0) from DUAL;
3)建議一個臨時表存儲那些沒有壞塊的數(shù)據(jù),執(zhí)行以下的語句:
CREATE TABLE salvage_table AS SELECT * FROM corrupt_tab Where 1=2;
4)保存那些不存在壞塊的數(shù)據(jù)到臨時表中,執(zhí)行以下的語句:
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ù)據(jù)重建表,重建表上的索引,限制。
? 使用10231診斷事件,在做全表掃描的時候跳過壞塊
可以在session級別設(shè)定:
ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';
也可以在數(shù)據(jù)庫級別上設(shè)定,在初始化參數(shù)中加入:event="10231 trace name context forever, level 10" ,然后重啟數(shù)據(jù)庫。
然后從存在壞塊的表中取出不存在壞塊的數(shù)據(jù),執(zhí)行以下的語句:
CREATE TABLE salvage_emp AS SELECT * FROM corrupt_table;
最后rename生成的corrupt_table為原來表的名字,并重建表上的索引和限制。
? 使用dbms_repair包進行恢復(fù)
使用dbms_repair標記有壞塊的表,在做全表掃描的時候跳過壞塊,執(zhí)行以下的語句:
Execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('schema','tablename');
然后使用exp工具或者createtable as select的方法取出沒有壞塊數(shù)據(jù),然后重建表,表上的索引和限制。
如何使用rman 檢查oracle數(shù)據(jù)庫壞塊
oracle檢測壞塊的方式:
1、利用oracle的RMAN工具
2、利用dbv工具檢測
3、利用 exp/imp工具檢測
oracle數(shù)據(jù)庫的壞塊問題是個讓人比較頭痛的問題,主要分為邏輯壞塊和物理壞塊,邏輯壞塊就是數(shù)據(jù)文件里的邏輯關(guān)系出現(xiàn)的混亂,這一般是由于數(shù)據(jù)庫的BUG導(dǎo)致的。物理壞塊就是數(shù)據(jù)文件中的數(shù)據(jù)不存在任何意義,沒有任何邏輯和結(jié)構(gòu),造成物理壞塊多因為服務(wù)器IO系統(tǒng)故障導(dǎo)致的。
標題名稱:oracle如何查詢壞塊,oracle 邏輯壞塊
文章URL:http://chinadenli.net/article7/dsepcoj.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、微信小程序、搜索引擎優(yōu)化、網(wǎng)站改版、動態(tài)網(wǎng)站、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)