现场报了一个问题,说是做逻辑备份时出现错误,导致备份的数据不完整,一张数十G数据量的表只导出了不到1G。错误信息如下:
EXP-00056: 遇到 ORACLE 错误 1555
ORA-01555: snapshot too old: rollback segment number with name "" too small
ORA-22924: snapshot too old
查了MOS,官方给出如下说明:
原因为LOB段损坏,使用如下方法来定位损坏的LOB值所在记录的rowid
create table corrupted_lob_data (corrupted_rowid rowid); set concat off declare error_1555 exception; pragma exception_init(error_1555,-1555); num number; begin for cursor_lob in (select rowid r, &&lob_column from &table_owner.&table_with_lob) loop begin num := dbms_lob.instr (cursor_lob.&&lob_column, hextoraw ('889911')) ; exception when error_1555 then insert into corrupted_lob_data values (cursor_lob.r); commit; end; end loop; end; /
执行完以后,根据表中存储的rowid值到出错的表中查出对应的记录。如果使用PL/SQL Developer,能看到对应的LOB字段值显示value error。将该值清空或删除这条记录可以解决,比如:update TABLE1 set COL1=empty_blob() where rowid='xxxxxxx';
本文详细介绍了在使用Oracle进行逻辑备份时遇到LOB段损坏导致备份数据不完整的问题,并提供了通过创建特定表和使用PL/SQL脚本来定位损坏LOB值所在记录的方法。包括使用`instr()`函数查找损坏数据的特定位置,以及如何通过更新记录来解决此问题。
904

被折叠的 条评论
为什么被折叠?



