(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;
