domingo, 9 de noviembre de 2008

ORA-00257 archiver error, ¿aún cuando ya hice espacio?

Conscientes de que Oracle9i está de salida, la empresa Acme finalmente hizo la actualización a la versión 10gR2; las cosas no podían ir mejor hasta que algunos usuarios empiezan a reportar que sus sesiones están suspendidas y otros que no pueden conectarse, obteniendo el error ORA-00257: archiver error. Connect internal only, until freed.

El problema resulta evidente, ya antes había pasado, se toma la rápida decisión de mover algunos archivelogs antiguos a otro directorio; ahora hay espacio pero el problema parece no resolverse, ¿qué puede estar pasando? Pues que ahora están usando Flash Recovery Area (FRA) y eso cambia las cosas.

Con Oracle 10g aparece Flash Recovery Area como un espacio en el cual se depositan por defecto los archivelogs y backups, Oracle se encarga de gestionarlo y exige que su mantenimiento se haga sin recurrir a comandos del Sistema Operativo.

Para este caso en particular, como la liberación de espacio se ha hecho mediante el traslado de archivelogs a otro directorio usando el Sistema Operativo, Oracle permanece sin ser notificado de tal cambio y por tanto asume que el problema de falta de espacio persiste, y así nos lo hace saber mediante mensajes en el alert.ora.

Sat Nov  8 13:58:46 2008
Thread 1 advanced to log sequence 26
Current log# 2 seq# 18 mem# 0: /u01/oradata/orcl/redo02.log
Sat Nov  8 13:58:46 2008
Errors in file /opt/oracle/admin/orcl/bdump/orcl_arc0_21093.trc:
ORA-19815: WARNING: db_recovery_file_dest_size of 209715200 bytes is 100.00% used, and has 0 remaining bytes available.
Sat Nov  8 13:58:46 2008
************************************************************************
You have following choices to free up space from flash recovery area:
1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,
then consider changing RMAN ARCHIVELOG DELETION POLICY.
2. Back up files to tertiary device such as tape using RMAN
BACKUP RECOVERY AREA command.
3. Add disk space and increase db_recovery_file_dest_size parameter to
reflect the new space.
4. Delete unnecessary files using RMAN DELETE command. If an operating
system command was used to delete files, then use RMAN CROSSCHECK and
DELETE EXPIRED commands.
************************************************************************
Sat Nov  8 13:58:46 2008
Errors in file /opt/oracle/admin/orcl/bdump/orcl_arc0_21093.trc:
ORA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 51228672 bytes disk space from 209715200 limit
ARC0: Error 19809 Creating archive log file to '/fra/ORCL/archivelog/2008_11_08/o1_mf_1_25_0_.arc'
ARC0: Failed to archive thread 1 sequence 25 (19809)
ARCH: Archival stopped, error occurred. Will continue retrying
Sat Nov  8 13:58:46 2008
ORACLE Instance orcl - Archival Error
Sat Nov  8 13:58:46 2008
ORA-16038: log 1 sequence# 25 cannot be archived
ORA-19809: limit exceeded for recovery files
ORA-00312: online log 1 thread 1: '/u01/oradata/orcl/redo01.log'

Como podemos observar, Oracle encuentra el problema y no solo lo reporta sino que también nos da un resumen de las acciones que podemos tomar para superar el problema. La alternativa (4) es reveladora, si queremos hacer espacio eliminando archivos debemos usar el comando delete de RMAN para lograrlo.

RMAN> list archivelog all;


List of Archived Log Copies
Key     Thrd Seq     S Low Time            Name
------- ---- ------- - ------------------- ----
18      1    23      A 08/11/2008 13:20:58 /fra/ORCL/archivelog/2008_11_08/o1_mf_1_23_4kdsx5y2_.arc
19      1    24      A 08/11/2008 13:31:33 /fra/ORCL/archivelog/2008_11_08/o1_mf_1_24_4kdsx6th_.arc
20      1    25      A 08/11/2008 13:45:11 /fra/ORCL/archivelog/2008_11_08/o1_mf_1_25_4kdc7vrd_.arc

RMAN> delete noprompt archivelog until sequence 24;

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=142 devtype=DISK

List of Archived Log Copies
Key     Thrd Seq     S Low Time            Name
------- ---- ------- - ------------------- ----
18      1    23      A 08/11/2008 13:20:58 /fra/ORCL/archivelog/2008_11_08/o1_mf_1_23_4kdsx5y2_.arc
19      1    24      A 08/11/2008 13:31:33 /fra/ORCL/archivelog/2008_11_08/o1_mf_1_24_4kdsx6th_.arc
deleted archive log
archive log filename=/fra/ORCL/archivelog/2008_11_08/o1_mf_1_23_4kdsx5y2_.arc recid=18 stamp=670289494
deleted archive log
archive log filename=/fra/ORCL/archivelog/2008_11_08/o1_mf_1_24_4kdsx6th_.arc recid=19 stamp=670289494
Deleted 2 objects

Volviendo a nuestro escenario, intentamos eliminar los archivelogs pero el esfuerzo es en vano.

RMAN> delete noprompt archivelog until sequence 24;

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=142 devtype=DISK

List of Archived Log Copies
Key     Thrd Seq     S Low Time            Name
------- ---- ------- - ------------------- ----
18      1    23      A 08/11/2008 13:20:58 /fra/ORCL/archivelog/2008_11_08/o1_mf_1_23_4kdsx5y2_.arc
19      1    24      A 08/11/2008 13:31:33 /fra/ORCL/archivelog/2008_11_08/o1_mf_1_24_4kdsx6th_.arc

RMAN-06207: WARNING: 2 objects could not be deleted for DISK channel(s) due
RMAN-06208:          to mismatched status.  Use CROSSCHECK command to fix status
RMAN-06210: List of Mismatched objects
RMAN-06211: ==========================
RMAN-06212:   Object Type   Filename/Handle
RMAN-06213: --------------- ---------------------------------------------------
RMAN-06214: Archivelog      /fra/ORCL/archivelog/2008_11_08/o1_mf_1_23_4kdsx5y2_.arc
RMAN-06214: Archivelog      /fra/ORCL/archivelog/2008_11_08/o1_mf_1_24_4kdsx6th_.arc

Nuevamente junto con el mensaje se nos proporciona la solución: hacer un crosscheck.

RMAN> crosscheck archivelog all;

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=142 devtype=DISK
validation failed for archived log
archive log filename=/fra/ORCL/archivelog/2008_11_08/o1_mf_1_23_4kdsx5y2_.arc recid=18 stamp=670288851
validation failed for archived log
archive log filename=/fra/ORCL/archivelog/2008_11_08/o1_mf_1_24_4kdsx6th_.arc recid=19 stamp=670288858
Crosschecked 2 objects

Finalmente removemos del catálogo de RMAN los archivelogs reportados como no encontrados en el paso anterior.

RMAN> delete noprompt expired archivelog all;

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=142 devtype=DISK

List of Archived Log Copies
Key     Thrd Seq     S Low Time            Name
------- ---- ------- - ------------------- ----
18      1    23      X 08/11/2008 13:20:58 /fra/ORCL/archivelog/2008_11_08/o1_mf_1_23_4kdsx5y2_.arc
19      1    24      X 08/11/2008 13:31:33 /fra/ORCL/archivelog/2008_11_08/o1_mf_1_24_4kdsx6th_.arc
deleted archive log
archive log filename=/fra/ORCL/archivelog/2008_11_08/o1_mf_1_23_4kdsx5y2_.arc recid=18 stamp=670288851
deleted archive log
archive log filename=/fra/ORCL/archivelog/2008_11_08/o1_mf_1_24_4kdsx6th_.arc recid=19 stamp=670288858
Deleted 2 EXPIRED objects

Revisamos el alert.log y el problema aparece como resuelto.

Sat Nov  8 14:21:03 2008
ARC1: Archiving not possible: No primary destinations
ARC1: Failed to archive thread 1 sequence 26 (4)
Sat Nov  8 14:21:04 2008
db_recovery_file_dest_size of 200 MB is 27.83% used. This is a
user-specified limit on the amount of space that will be used by this
database for recovery-related files, and does not reflect the amount of
space available in the underlying filesystem or ASM diskgroup.
Sat Nov  8 14:21:15 2008
Archiver process freed from errors. No longer stopped
Sat Nov  8 14:21:15 2008
Thread 1 advanced to log sequence 27
  Current log# 1 seq# 20 mem# 0: /u01/oradata/orcl/redo03.log

Las sesiones vuelven a la vida y los usuarios pueden iniciar nuevas conexiones, todo ha regresado a la normalidad; podemos finalmente respirar con alivio y nos queda la enseñanza de que si bien usar Flash Recovery Area es altamente recomendado, debemos tener presente no manipular sus contenidos por medios ajenos a los proporcionados por Oracle.

Si deseas profundizar en el tema, te recomiendo leer el Note 278308.1 How to Resolve ORA-00257: Archiver is Stuck Error in 10g? y el Note 315098.1 How is the space pressure managed in the Flash Recovery Area - An Example.

Posts Relacionados:

¿Te pareció interesante este artículo?, ¿te quedaron algunas dudas?, ¿quieres sugerirme un tema a tratar?, pues déjame tus comentarios o envíame un email y para que NO te pierdas ningún Post, suscríbete por email ahora mismo!

9 comentarios, agrega el tuyo!

[ [EBP]] dijo...

Enrique,

Antes que nada felicitarte por tu presentación en el pasado PEOUG day, estuvo muy interesante y amena (lo cual le da un punto extra)..

Y ahora con respecto al post, tengo algunas preguntas..

¿Cual es la función específica de la FRA?

Si el oracle guarda por defecto los archive logs y los backups en la FRA, ¿esto quiere decir entonces que los archive logs y los backups se guardan dos veces?

Enrique Orbegozo dijo...

Hola EBP, el FRA es un espacio gestionado por Oracle donde podemos depositar los archivos relacionados al backup y recovery. Allí se crean los archive logs y los flashback logs, al igual que los backupsets que obtenemos con RMAN. No es obligatorio usarlo, no es la idea que dupliques los archivos, sino que reemplaces los directorios sueltos que tenias por éste, que al ser gestionado por Oracle, te simplifica la vida. Mayor referencia en la documentacion desde luego.
Saludos, y gracias por participar!

[ [EBP]] dijo...

Muchas gracias por la respuesta Enrique..

Mira.. yo tengo las siguientes carpetas en mi servidor linux:

arch -> aqui se depositan mis achive logs
backup -> aqui se guardan los backups

Y la carpeta:

flash_recovery_area -> la cual contiene una carpeta archivelog y otra autobackup

Según lo que me indicas, la carpeta "archivelog" contiene lo mismo que "arch" y la carpeta "autobackup" lo mismo que "backup" ??

Mil disculpas por tanta pregunta, pero es que estoy dando mis primeros pasos en esto de DBA..

Gracias!

Enrique Orbegozo dijo...

Hola EBP, si ya tienes una carpeta para el FRA entonces puedes deshacerte de las carpetas "arch" y "backup", salvo que desees mantener una copia adicional de los archive logs en cuyo caso podrías mantener la carpeta "arch", en este caso no olvides de tener ambos destinos registrados con los parámetros "log_archive_dest_n" respectivos.
Saludos.

[ [EBP]] dijo...

Y como hago para que ya no se generen los backups y los archive logs en esas carpetas?

Enrique Orbegozo dijo...

Hola nuevamente EBP, tú eres el que controla donde van los archive logs mediante los parámetros log_archive_dest_n, así como donde van los backups obtenidos con RMAN, mediante el uso de la cláusula format. Te recomiendo leer la documentación respectiva.
Saludos.

Germán dijo...

Gracias...muy útil la explicación. Ya me suscribí...este fin desemana encontre 2 respuestas por acá y me hizo respirar profundo, remitirme a la documentación y hacer algo que usualmente no hacemos...leer.
Gracias, un abrazo.

Enrique Orbegozo dijo...

Hola "1", hay tanto por leer y siempre estamos justos de tiempo, pero la lectura es un hábito que no debemos romper.
Saludos.

Anónimo dijo...

a este error ora-00257 adiciono este mensaje del alert.log:ORA-16038: log 1 sequence# 337 cannot be archived
ORA-19809: limit exceeded for recovery files. lo que hice fué ingresar al rman target / y ejecutar : delete archivelog until time 'trunc(sysdate-7)'; este menos siete es antes de mi ultimo respaldo en frio.