一、问题说明
在备份数据库时发现reader不能正常备份,备份进行一段时间后报错并回滚,然后继续备份剩下的表,报错信息如下:
. . exporting table READER
EXP-00056: ORACLE error 1555 encountered
ORA-01555: snapshot too old: rollback segment number with name "" too small
ORA-22924: snapshot too old
二、解决办法
①全备份数据库。(如果可以肯定要备份数据库咯,但是不是备份不了吗,所以把有问题的列,即rdphoto先不要,重新复制一个reader表,算是备份了reader表了就)
②创建参照表---
create table corrupted_data (corrupted_rowid rowid);
③查询reader.rdphto的坏块,这里估计是rdphoto这个字段的事,不过也肯定是这孙子的事了---
declare
error_1578 exception;
error_1555 exception;
error_22922 exception;
pragma exception_init(error_1578,-1578);
pragma exception_init(error_1555,-1555);
pragma exception_init(error_22922,-22922);
n number;
begin
for cursor_lob in (select rowid r, rdphoto from interlib.reader) loop
begin
n:=dbms_lob.instr(cursor_lob.rdphoto,hextoraw('889911')) ;
exception
when error_1578 then
insert into corrupted_data values (cursor_lob.r);
commit;
when error_1555 then
insert into corrupted_data values (cursor_lob.r);
commit;
when error_22922 then
insert into corrupted_data values (cursor_lob.r);
commit;
end;
end loop;
end;
/
④看看有多少,然后进一步处理---
select * from corrupted_data;
⑤更新有问题的数据,使rdphoto为空。
update reader set rdphoto = empty_blob() where rowid in (select corrupted_rowid from corrupted_data);
commit;