BAD Block 坏块的處理

一.坏块的发现
----------------------------------------------------
1.检查整个数据库中所有表,可以利用Exp工具导出整个数据库,
 存在缺陷:
a.HWM以上的坏块不会发现;
b.索引中存在的坏块不会发现;
c.数据字典中的坏块不会了现;

2.比较重要表做坏块检查,可以使用ANALYZE TABLE tablename VALIDATE STRUCTURE CASCADE
执行了坏块检查,但不会标记为corrupt,检测的结果保存在USER_DUMP_DEST目录下的用户trace文件中.

3.Oracle专门工具DBV来检查坏块

[@more@]關鍵字 說明 (預設)
----------------------------------------------------
FILE 要驗證的檔案 (NONE)
START 起始區塊 (檔案第一個區塊)
END 結束區塊 (檔案最後的區塊)
BLOCKSIZE 邏輯區塊大小 (8192)
LOGFILE 輸出日誌 (NONE)
FEEDBACK 顯示進度 (0)
PARFILE 參數檔 (NONE)
USERID 使用者名稱/密碼 (NONE)
SEGMENT_ID 區段 ID (tsn.relfile.block) (NONE)
HIGH_SCN 要驗證的最高區塊 SCN (NONE)
(scn_wrap.scn_base OR scn)

例:
E:oracleproduct>dbv file=SBD01.dbf

DBVERIFY: Release 10.2.0.1.0 - Production on 星期二 12月 14 14:27:53 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
DBVERIFY - 驗證開始 : FILE = SBD01.dbf

DBVERIFY - 驗證結束
檢查總頁數 : 12800
處理總頁數 (資料) : 65
失敗總頁數 (資料) : 0
處理總頁數 (索引) : 47
失敗總頁數 (索引) : 0
已處理過的總頁數 (其他): 219
總共處理的頁數 (區段) : 0
總共失敗的頁數 (區段): 0
空的總頁數 : 12469
標記為損毀的總頁數 : 0
匯集總頁數 : 0
最高區塊 SCN : 1094832 (0.1094832)

二.坏块发现后的处理:
-------------------------------------------------
1. 先收集相应的关于坏块的信息,从AlertSID.log文件或者从trace文件中查找,
例如以下的一些信息:
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 ,relative_fno “RFN”
From dba_data_files
Union All
Select file_name,tablespace_name,file_id, relative_fno“RFN”
From dba_temp_files;

2. 确定存在坏块的对象是什么:
SELECT tablespace_name,segment_type,owner,segment_name, partition_name
FROM dba_extents
WHERE file_id =
AND between block_id AND block_id + blocks – 1;
通过上面这个查询语句就可以查出当前存在坏块的对象是什么,是什么类型的对象。需要注意的是如果是temp文件中出现坏块,是没有记录返回的。

3. 根据2中查询出来的对象类型,确定相应的处理方法
出现坏块的常见对象有:
 Sys用户下的对象
 回滚段
 临时段
 索引或者分区索引
 表
常用的处理方法有:
 恢复数据文件
 只恢复坏的block(9i以上版本可用)
 通过ROWID RANGE SCAN 保存数据
 使用DBMS_REPAIR
 使用EVENT
4. 具体处理方法的介绍
 恢复数据文件方法:
如果数据库是归档方式下,并且有完整的物理备份,就可以使用此方法来恢复。
步骤如下:
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,,,,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诊断事件,在做全表扫描的时候跳过坏块

1) 可以在session级别设定:

ALTER SESSION SET EVENTS ‘10231 TRACE NAME CONTEXT FOREVER, LEVEL 10′;

也可以在数据库级别上设定:
在初始化参数中加入:event=”10231 trace name context forever, level 10″,然后重启数据库。

2) 然后从存在坏块的表中取出不存在坏块的数据,执行以下的语句:
CREATE TABLE salvage_emp AS SELECT * FROM corrupt_table;

3) 最后rename生成的corrupt_table为原来表的名字,并重建表上的索引和限制。

 使用dbms_repair包进行恢复(待测试)
使用dbms_repair标记有坏块的表,在做全表扫描的时候跳过坏块,执行以下的语句:

Execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(’’,'’);

然后使用exp工具或者createtable as select的方法取出没有坏块数据,然后重建表,表上的索引和限制。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/678020/viewspace-1043081/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/678020/viewspace-1043081/

你可能感兴趣的:(BAD Block 坏块的處理)