如果数据库的底层文件出现了坏块的情况,通过alert日志观察是否有大规模的坏块,以下讨论只有个别坏块的情况,处理思路是:首先定位坏块的文件,其次定位坏块的对象,将改文件上没有坏块的对象挪走,避免大规模故障,最后根据坏块的对象来补偿数据,可以业务侧补偿,或者通过备份和归档来恢复这个对象。
第一步:定位查看该文件上的对象:
SELECT OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME FROM dba_extents WHERE file_id = 2344;
SELECT OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME FROM dba_extents WHERE file_id = 2171;
第二步:定位文件上对应坏块上的对象,最大程度挽救数据:
SELECT tablespace_name, segment_type, owner, segment_name, partition_name
FROM dba_extents WHERE file_id = 2344 and 19 between block_id AND block_id + blocks - 1;--文件号,块号
第三步:将文件上的对象移走MOVE,REBUILD等
alter index UCR_USER.IND_TI_TABLE rebuild tablespace TBS_CRM_HDTRA3;
第四步:将文件OFFLINE
alter database datafile ‘/dev/rcrm1vg13_4_028’ offline
ALTER DATABASE RECOVER datafile ‘/dev/rcrm1vg13_4_028’
如果碰到大规模的坏块,可能磁盘出现故障,此时尽量从备份来恢复。