ORA-01555 lors d'un Export - Corruption des données LOB

Aujourd’hui j’ai rencontré une erreur  un peu particulière  lors d’un export d’une base 8.1.7 , voila un extrait :

. . exporting table PLFRQRS

EXP-00056: ORACLE error 1555 encountered

ORA-01555: snapshot too old: rollback segment number with name "" too small

ORA-22924: snapshot too old


A première vue j’ai soupçonné les RBS de la base j’ai ajouté un grand Rollback Segment (2 Go) et j’ai réessayé l’export en surveillant l’état d’utilisation des segments d’annulation, mais bizarrement rien ne se passe après un certain temps la taille utilisée sur les segments reste la même. Et l’erreur est la même.

En vérifiant l’erreur je remarque que le message d’erreur ne comporte aucun nom du segment d’annulation !! . charchant un peu sur Metalink je trouve la note suivante:

Export Fails With ORA-2354 ORA-1555 ORA-22924 and How To Confirm LOB Segment Corruption Using Export Utility? [ID 833635.1]

Et effectivement il y a bien une corruption dans la table, en lançant les scripts suivants :


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;
/

Enter value for lob_column : PLFCLOB
Enter value for table_owner : PLF
Enter value for table_with_LOB: PLFRQRS

SQL> select * from corrupted_lob_data;

CORRUPTED_ROWID
--------------------------------
AAABBvAAIAAA39VAAE

J’ai pu faire l’export en supprimant la ligne, une mise à jour de la colonne aurait suffit mais dans mon cas j’ai déjà cette ligne sur une autre table.