使用dbv查看坏块,dbv file=xxx.dbf
DBVERIFY: Release 11.2.0.1.0 - Production on Tue Aug 16 11:31:47 2016
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)
1、执行以下语句看哪个段坏了
Select b.segment_name, b.segment_type
from dba_extents a, dba_segments b
where a.file_id =&FNO
and &BLOCK between a.block_id and a.block_id + a.blocks - 1
and a.segment_name = b.segment_name
and a.owner = b.owner;
这里的 &FNO 指的是 file#,&BLOCK 指的是 block#
2. 如果是物理坏块,分几种情况:
1)如果是文件系统且做了raid的,在messages里会显示具体哪个磁盘出问题了,更换磁盘,系统会自动恢复磁盘。
2)如果是文件系统且没做raid,但有备份和归档,在messages里会显示具体哪个磁盘出问题了,更换磁盘,然后用数据文件备份和归档、在线日志恢复到最后的时间点。
3)如果是文件系统且没做raid,没有备份,那么就要按下面的步骤3里的操作恢复好坏块后,再更换磁盘。
4)如果是asm管理磁盘阵列,将亮红灯的磁盘拔掉,换个新的,系统会自动恢复磁盘。
3. 如果是逻辑坏块,就看是索引坏块还是表坏块。
如果是索引坏块,那么直接删除索引,重建索引就好。
如果是表坏块,分三种情况:
1)有rman备份,利用rman备份恢复坏块。命令:blockrecover datafile file# block block# from backupset;
2)没有rman备份,只有exp备份,且备份可用,那么删除这个表,重新导入。
3)如果没有备份,以表tab03为例,按下面的步骤处理:
A、 以 tab03的 owner 连入 oracle
B、 使用诊断事件 10231,跳过坏块检查
SQL> ALTER SYSTEM SET EVENTS '10231 trace name context forever,level 10';
C 、创建一个临时表 tab_tmp 的表中除坏块的数据都检索出来
SQL>CREATE TABLE tab_tmp as select * from tab03;
SQL>ALTER SYSTEM SET EVENTS '10231 trace name context off';
D、 更名原表,并把 tab_tmp 更名为 tab03
SQL>alter table tab03 rename to tab03_bak;
SQL>alter table tab_tmp to tab03;
E、 在 tab03 上重新创建索引、约束、授权、 trigger 等对象
DBVERIFY: Release 11.2.0.1.0 - Production on Tue Aug 16 11:31:47 2016
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)
或者使用视图v$database_block_corruption;
1、执行以下语句看哪个段坏了
Select b.segment_name, b.segment_type
from dba_extents a, dba_segments b
where a.file_id =&FNO
and &BLOCK between a.block_id and a.block_id + a.blocks - 1
and a.segment_name = b.segment_name
and a.owner = b.owner;
这里的 &FNO 指的是 file#,&BLOCK 指的是 block#
2. 如果是物理坏块,分几种情况:
1)如果是文件系统且做了raid的,在messages里会显示具体哪个磁盘出问题了,更换磁盘,系统会自动恢复磁盘。
2)如果是文件系统且没做raid,但有备份和归档,在messages里会显示具体哪个磁盘出问题了,更换磁盘,然后用数据文件备份和归档、在线日志恢复到最后的时间点。
3)如果是文件系统且没做raid,没有备份,那么就要按下面的步骤3里的操作恢复好坏块后,再更换磁盘。
4)如果是asm管理磁盘阵列,将亮红灯的磁盘拔掉,换个新的,系统会自动恢复磁盘。
3. 如果是逻辑坏块,就看是索引坏块还是表坏块。
如果是索引坏块,那么直接删除索引,重建索引就好。
如果是表坏块,分三种情况:
1)有rman备份,利用rman备份恢复坏块。命令:blockrecover datafile file# block block# from backupset;
2)没有rman备份,只有exp备份,且备份可用,那么删除这个表,重新导入。
3)如果没有备份,以表tab03为例,按下面的步骤处理:
A、 以 tab03的 owner 连入 oracle
B、 使用诊断事件 10231,跳过坏块检查
SQL> ALTER SYSTEM SET EVENTS '10231 trace name context forever,level 10';
C 、创建一个临时表 tab_tmp 的表中除坏块的数据都检索出来
SQL>CREATE TABLE tab_tmp as select * from tab03;
SQL>ALTER SYSTEM SET EVENTS '10231 trace name context off';
D、 更名原表,并把 tab_tmp 更名为 tab03
SQL>alter table tab03 rename to tab03_bak;
SQL>alter table tab_tmp to tab03;
E、 在 tab03 上重新创建索引、约束、授权、 trigger 等对象
F、 利用表之间的业务关系,把坏块中的数据补足。
G,如果要删除之前的表空间,或者表
alter database datafile '/ora01/oradata/tbs_data01.dbf' offline drop;
alter tablespace tbs1 including contents;
删除表,drop table table1 pruge;