ORA-19566 exceeded limit of 0 corrupt blocks数据坏块处理

排查思路:

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

 

上一篇:Limit讨论,K8s 使用 CPU Limit 后,服务响应变成龟速...


下一篇:Netty:NIO buffer 原理(附 示例代码)