一、问题描述
上周五现场某项目一数据库开发工程师向我反馈他们一个Oracle生产数据库刷新分区表JXH_SER_LOG_DETAILS统计信息出现坏块并提出数据库应急响应技术支持,由于上周五现场网络有问题,服务器远程频繁断开,我先让他们现场对接客户IT处理网络问题,已跟现场IT人员确认已开启了归档模式,如果是硬件坏块几乎只能换硬件了。如果未开归档模式修复会变的十分困难,所幸检测出的是逻辑坏块,掌握一些技巧处理还是相对比较简单的,以此案例分享给大家遇到同样的问题时可以借鉴避免及少走弯路。下面贴上坏块错误问题。是1号文件system表空间出现坏块号3345
二、问题重现
通过现场提供的向日葵远程到堡垒机连接到这台Oracle数据库实例检测坏块。
三、坏块定位
通过 ORA-01578:ORACLE data block corrupted (file #1 ,block # 3345)定位坏块损坏的数据库对象
SQL> select tablespace_name,segment_type,owner,segment_name from dba_extents where file_id=1 and 3345 between block_id and block_id+blocks-1; |
通过坏块定位找出损坏的数据库对象是SYS用户的system表空间一个名为I_MON_MODS$_OBJ索引损坏。
四、坏块修复
- 先尝试用RMAN 备份集修复坏块
由于该坏块是索引坏块并且是system数据字典坏块无法通过RMAN备份集进行恢复。这个方法跳过。只能使用重建索引进行恢复对象。
- 重建索引I_MON_MODS$_OBJ
在线重建索引:
Alter index sys.I_MON_MODS$_OBJ rebuild online;
五、检查坏块是否消除
SQL> select tablespace_name,segment_type,owner,segment_name from dba_extents where file_id=1 and 3345 between block_id and block_id+blocks-1; |
这里可以看出坏块已消除。
六、回到现场初始问题执行ALANYZE TABLE正常
刷新分区表JXH_SER_LOG_DETAILS统计信息
SQL> ANALYZE TABLE JXH.JXH_SER_LOG_DETAILS PARTITION(PART_202012) COMPUTE STATISTICS; Table analyzed. |