Oracle Live

18/04/2016

ORA-01555 de una tabla con BLOB

Filed under: Backup & Recovery,Troubleshooting — mogukiller @ 1:50 pm

Recientemente me ha ocurrido estar lanzando un export de una tabla de unos 200GB con un campo LOB. Tanto el expdp como exp fallaban por ORA-015555. Al principio intenté solucionarlo de forma directa añadiendo mas espacio al tablespace de UNDO y modificando el parámetro de UNDO_RETENTION. Pero el export seguia fallando. Me di cuenta que el proceso de export aunque con duraciones diferentes, fallaba siempre en el mismo tamaño del fichero. Por lo que empece a sospechar qeu no era asunto del UNDO.

Siguiendo la nota:

IF: ORA-1555 Error During Export on LOB Data (Doc ID 1950937.1)

Pase el script de validación a la tabla:


create table corrupted_lob_data (corrupt_rowid rowid, err_num number);

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, DES_MENSAJE from MOG.AC_MAIL) loop
begin
n := dbms_lob.instr (cursor_lob.DES_MENSAJE, hextoraw ('889911')) ;
exception
when error_1578 then
insert into corrupted_lob_data values (cursor_lob.r, 1578);
commit;
when error_1555 then
insert into corrupted_lob_data values (cursor_lob.r, 1555);
commit;
when error_22922 then
insert into corrupted_lob_data values (cursor_lob.r, 22922);
commit;
WHEN OTHERS THEN
insert into corrupted_lob_data values (cursor_lob.r, 00000);
commit;
end;
end loop;
end;
/

Despues de unas 20 horas de ejecución obtenemos que si tenemos corrupción en los segmentos de LOB.

SQL>select * from corrupted_lob_data;

CORRUPT_ROWID         ERR_NUM
------------------ ----------
AABHt/AEfAAJQ8iAAH       1555

Si probamos a hacer el export unicamente de ese registro vemos que falla al instante.

>cat >exp_LOB_corrupt.par
userid='/ as sysdba'
dumpfile=exp_BLOCK_%U.dmp
filesize=20G
logfile=exp_LOB_corrupt.log
directory=MIGRACION
QUERY='WHERE COD_CORREO IN ('16076988')'
TABLES=MOG.AC_MAIL

>expdp parfile=exp_LOB_corrupt.par
/*
ORA-31693: Fallo del objeto de datos de tabla 'CRC'.'AC_CORREOS' al cargarse/descargarse y se está saltando debido al error:
ORA-29913: error al ejecutar la llamada de ODCIEXTTABLEPOPULATE
ORA-01555: instantánea demasiado antigua: número de segmento de rollback  con nombre '' demasiado pequeño
ORA-22924: instantánea demasiado antigua
La tabla maestra 'SYS'.'SYS_EXPORT_TABLE_04' se ha cargado/descargado correctamente
*/

Solución, exportamos la tabla excluyendo ese registro e importamos el resgistro con un insert/select por dblink con el valor del campo lob a NULL

cat >exp_AC_MAIL.par
userid='/ as sysdba'
dumpfile=exp_AC_MAIL.dmp
logfile=exp_AC_MAIL.log
directory=MIGRACION
QUERY='WHERE COD_CORREO<>'16076988''
TABLES=MOG.AC_MAIL

nohup expdp parfile=exp_AC_MAIL.par &amp;

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: