oracle 壞塊問題急救

imlihj2007發表於2011-02-21

ALTER SYSTEM SET EVENTS ‘10231 trace name context forever,level 10’;
CREATE TABLE tg_bill03_tmp as select * from tg_bill03;

------------------
AlertSID.log:
Ora-1578 file# (RFN) block#
Ora-1110 file# (AFN) block#
Ora-600 file# (AFN) block#

其中RFN表示的是relative_fno
AFN表示的是file_id
Select file_name, tablespace_name, file_id “AFN”, relative_fno “RFN”
From dba_data_files;
Select file_name, tablespace_name, file_id, relative_fno“RFN”
From dba_temp_files;

¡¤具體處理方法的介紹
(1) 先offline受影響的資料檔案,執行以下的語句
ALTER DATABASE DATAFILE 'name_file' OFFLINE;
(2) 保留有壞塊的資料檔案,然後複製備份的資料檔案。如果恢復的資料檔案要求路徑不同,執行以下的語句:
ALTER DATABASE RENAME FILE 'old_name' TO 'new_name';
(3) 恢復資料檔案,執行以下語句:
RECOVER DATAFILE 'name_of_file';
(4) Online恢復後的資料檔案,執行以下的語句:
ALTER DATABASE DATAFILE 'name_of_file' ONLINE;

¡¤只恢復壞的block(9i以上版本可用)

使用這種方法要求資料庫版本是9.2.0以上,要求配置了Rman的catalog資料庫,資料庫為歸檔方式,並且有完整的物理備份。
步驟如下:

使用RMAN的BLOCKRECOVER命令 :
Rman>run{blockrecover datafile 5 block 11,16;}
也可以強制使用某個SCN號之前的備份,恢復資料塊。
Rman>run{blockrecover datafile 5 block 11,16 restore until sequence 8505;}


¡¤透過ROWID RANGE SCAN 儲存資料
(1) 先取得壞塊中ROW ID的最小值,執行以下的語句:
SELECT dbms_rowid.rowid_create(1,,,,0) from DUAL;
(2)取得壞塊中的ROW ID的最大值,執行以下的語句:
SELECT dbms_rowid.rowid_create(1,,,+1,0) from DUAL
(3)建議一個臨時表儲存那些沒有壞塊的資料,執行以下的語句:
CREATE TABLE salvage_table AS SELECT * FROM corrupt_tab Where 1=2;
(4) 儲存那些不存在壞塊的資料到臨時表中,執行以下的語句:
INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM A WHERE rowid < '';
INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM A WHERE rowid >= '‘;
(5) 根據臨時表中的資料重建表,重建表上的索引,限制


¡¤使用10231診斷事件,在做全表掃描的時候跳過壞塊
可以在session級別設定:
ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';
也可以在資料庫級別上設定,在初始化引數中加入:event="10231 trace name context forever, level 10" ,
然後重啟資料庫。

然後從存在壞塊的表中取出不存在壞塊的資料,執行以下的語句:
CREATE TABLE salvage_emp AS SELECT * FROM corrupt_table;
最後rename生成的corrupt_table為原來表的名字,並重建表上的索引和限制。


¡¤使用dbms_repair包進行恢復
使用dbms_repair標記有壞塊的表,在做全表掃描的時候跳過壞塊,執行以下的語句:
Execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('','');
然後使用exp工具或者createtable as select的方法取出沒有壞塊資料,然後重建表,表上的索引和限制。


如果只是對資料庫中比較重要的表進行壞塊檢查,
可以使用
ANALYZE TABLE tablename VALIDATE STRUCTURE CASCADE
的方法來檢測壞塊,它執行壞塊的檢查,但是不會標記壞塊為corrupt,
檢測的結果儲存在USER_DUMP_DEST目錄下的使用者trace檔案中。

使用Oracle的專門工具dbv來檢查壞塊,具體的語法如下

3. 確定壞塊的物件是什麼?

select tablespace_name, segment_type, segment_name, owner
from dba_extents
where file_id = 7
and 12 BETWEEN block_id AND block_id + blocks - 1;

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9879835/viewspace-1046286/,如需轉載,請註明出處,否則將追究法律責任。

相關文章