客户突然报告数据库警告日志中出现ora-00600错误,不能进行冷备份的拷贝数据文件,造成日常备份不能正常进行。检查及解决过程如下:
1 用dbv工具检查出错的文件,但是报告I/O错误,dbv不能正常检测出结果。
2 用rman工具进行数据库热备份,结果在备份过程中报I/O错误,找到文件号和块号,用如下语句查询块的信息:
select * FROM dba_extents WHERE file_id='7' and block_id<=173494 and (block_id + blocks- 1) >= 173494
结果segment_type为lob型。在用下面语句检查:
SELECT * FROM dba_lobs WHERE segment_name='SYS_LOB0000054743C00004$$'
查询结果如下:
FNDCN_MESSAGE_BODY_TAB MESSAGE_VALUE SYS_LOB0000054743C00004$$ IFSAPP_LOB SYS_IL0000054743C00004$$ 8192 50 NO YES NO NOT APPLICABLE NO
发现是这个表。在应用系统中这个表只是记录消息日志的,即便清空,也不会对应用产生任何问题,但最为DBA,能尽量恢复就尽量恢复吧。继续往下做:
3 试着表迁移来做数据导出。
迁移lob类型的数据到另外一个表
ALTER TABLE FNDCN_MESSAGE_BODY_TAB MOVE LOB(message_value) STORE AS FNDCN_MESSAGE_BODY_TAB (
TABLESPACE ifsapp_data
DISABLE STORAGE IN ROW
CHUNK 16384
FREEPOOLS 1
NOCACHE
PCTVERSION 20);
但是还是报ora-01555的错误。
4 再用exp把这个表的数据倒出来,结果报
EXP-00056: ORACLE error 1115 encountered
ORA-01115: IO error reading block from file 7 (block # 173494)
ORA-27072: File I/O error
这个错误,修改这个表中的LOB存储参数,
ALTER TABLE ifsapp.FNDCN_MESSAGE_BODY_TAB STORAGE as (PCTVERSION 20)。在进行导出,还是报错,加大PCTVERSION 的值,还是报错。用dbms_repair来忽略坏块也还是不行。
无奈,只能用query参数来递增的导出数据。语句如下:
exp '"sys/oracle@prodzs as sysdba"' tables=ifapp.FNDCN_MESSAGE_BODY_TAB
file='/emc/data/hotbackup/table4000.dmp' log='/emc/data/hotbackup/table.log' query=\"where application_message_id\<5600\"
这个表最多有5664条记录,5600是导出的上限,5601都报ora-01555的错误。只能导出5600条记录了。
5 用内部事件来屏蔽全表扫描的时候忽略坏块。
alter system set events='10231 trace name context for ever,level 10'
6 做全数据库的导出,之所以作数据库的逻辑导出,是因为这个dbf文件既不能拷贝,也不能用备份的有效的文件来覆盖。所以我决定重新逻辑导出,在全库导入。我试过用rman来做热备的克隆,但是在rman备份过程中坏块始终过不去,即便设置了内部事件和用dbms_repair来忽略坏块。我想不明白。有明白的人可以告诉我原因,谢谢!!
7 创建新库,导入数据,然后再把FNDCN_MESSAGE_BODY_TAB的数据导进新创建的数据库。
遗留问题: 虽然解决了文件不能拷贝复制的问题,但毕竟还是丢了54条数据,不知哪位高手知道如何才能不丢失这54条数据呢。万一是业务表,我可就束手无策了。