排查思路:
1. 如果是物理坏块,需要更换磁盘,分几种情况: 1)如果是文件系统且做了raid的,在messages里会显示具体哪个磁盘出问题了,更换磁盘,系统会自动恢复磁盘。 2)如果是文件系统且没做raid,但有备份和归档,在messages里会显示具体哪个磁盘出问题了,更换磁盘,然后用数据文件备份和归档、在线日志恢复到最后的时间点。 3)如果是文件系统且没做raid,没有备份,那么就要按下面的步骤3里的操作恢复好坏块后,再更换磁盘。 4)如果是asm管理磁盘阵列,将亮红灯的磁盘拔掉,换个新的,系统会自动恢复磁盘。 2. 如果是逻辑坏块,就看是索引坏块还是表坏块。 如果是索引坏块,那么直接删除索引,重建索引就好。 如果是表坏块,分三种情况: 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; D、 更名原表,并把 tab_tmp 更名为 tab03 SQL>alter table tab03 rename to tab03_bak; SQL>alter table tab_tmp to tab03; E、 在 tab03 上重新创建索引、约束、授权、 trigger 等对象 F、 利用表之间的业务关系,把坏块中的数据补足。
解决方法:
1、当运行了rman后,会将坏块情况记录到该视图中。所以看准确的坏块还是通过RMAN或者DBV来查看
RMAN> backup validate check logical datafile 352;
select file#,block#,corruption_type from v$database_block_corruption;
dbv file=/d01/oracle/PROD/db/apps_st/data/system09.dbf