miércoles, 25 de octubre de 2017

ADR: Si el Dr House fuera DBA, usaría esto

House M. D. (Medical diagnostic) era una serie de televisión estadounidense de la cadena FOX. El personaje central es el Dr. Gregory House, un genio médico, irónico, satírico y poco convencional e inconformista, que encabeza un equipo de diagnóstico en el Hospital Universitario Princeton-Plainsboro de Nueva Jersey.

Pero ahora entremos en detalles mas interesantes, en el contexto de este blog:

En la versión 11g, de la base de datos Oracle, se introdujo un nuevo concepto para el repositorio de los archivos de diagnostico de la base de datos, llamado ADR (Automatic Diagnostic Repository por sus siglas en ingles) 

En versiones anteriores (10g, sí, todavía hay bases de datos de esta versión por el mundo ) se utilizaban los parámetros:
  • BACKGROUND_DUMP_DEST
  • CORE_DUMP_DEST
  • USER_DUMP_DEST 

en estos lugares podíamos ver los archivos que nos ayudaban a hacer un diagnostico de errores de la base de datos. A partir de la versión 11g, se introdujo la variable DIAGNOSTIC_DEST, en donde Oracle esta tratando de estandarizar la estructura de directorios para manejar los archivos relacionados a fallas y alertas. La estructura del repositorio ADR para la base de datos, tanto en servidor como en el cliente, en la versión 12.1.0.2, es de la siguiente manera:

Estructura de directorios en servidor:


Estructura de directorios en cliente:



Un cambio muy importante que se da en 11g es que el formato del archivo de alertas de la base de datos es en formato .xml, ya que lo puedes ahora visualizar de una mejor manera en OEM, pero tambien lo puedes encontrar en su formato anterior. Si quieres ver como tienes la estructura en tu base de datos, lo puedes hacer con el siguiente query:

DBATEST> SELECT * FROM V$DIAG_INFO;

INST_ID NAME VALUE

1 Diag Enabled TRUE
1 ADR Base /mount/dump01/oracle/DBATEST
1 ADR Home /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST
1 Diag Trace /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/trace
1 Diag Alert /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/alert
1 Diag Incident /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/incident
1 Diag Cdump /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/cdump
1 Health Monitor /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/hm
1 Default Trace File /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/trace/DBATEST_ora_18035.trc
1 Active Problem Count 1

1 Active Incident Count 75

De la misma manera, Oracle trae ahora una herramienta muy util llamada adrci, esta herramienta te permite manejar el repositorio ADR,muy importante, es que antes de mandar a llamar a la herramienta, las variables de entorno ORACLE_HOME,PATH y ADR_HOME estén bien iniciadas. Puedes ver el archivo de alertas de la base de datos de la siguiente manera:


adrci> SHOW ALERT -TAIL 5
2011-07-17 18:04:41.207000 -04:00
Archived Log entry 4735 added for thread 1 sequence 4735 ID 0xffffffffb7363f82 dest 1:
2011-07-17 21:00:49.339000 -04:00
Thread 1 advanced to log sequence 4737 (LGWR switch)
Current log# 3 seq# 4737 mem# 0: /mount/u01/oracle/DBATEST/log/redo03a.log
Current log# 3 seq# 4737 mem# 1: /mount/u01/oracle/DBATEST/log/redo03b.log
Archived Log entry 4736 added for thread 1 sequence 4736 ID 0xffffffffb7363f82 dest 1:

También podemos ver un incidente de la siguiente manera, usando ADR:


adrci> show incident

ADR Home = /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST:
*************************************************************************
INCIDENT_ID PROBLEM_KEY CREATE_TIME
-------------------- ----------------------------------------------------------- ----------------------------------------
2041 ORA 4031 2016-11-14 05:58:35.042000 -05:00
2105 ORA 4031 2016-11-14 05:58:35.272000 -05:00
2017 ORA 4031 2016-11-14 05:58:35.272000 -05:00
1873 ORA 4031 2016-11-14 05:58:35.279000 -05:00
2153 ORA 4031 2016-11-14 05:58:35.280000 -05:00
37051 ORA 4031 2017-10-16 21:51:03.983000 -04:00
37027 ORA 4031 2017-10-16 21:51:04.239000 -04:00
36707 ORA 4031 2017-10-16 21:51:18.575000 -04:00
37019 ORA 4031 2017-106-16 21:51:22.650000 -04:00
37052 ORA 4031 2017-10-16 21:51:29.050000 -04:00
10 rows fetched

Una vez que visualizas los errores, puedes ver el detalle de ellos, así como la traza generada:


adrci> SHOW INCIDENT -MODE DETAIL -P "INCIDENT_ID=57052"

ADR Home = /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST:
*************************************************************************

**********************************************************
INCIDENT INFO RECORD 1
**********************************************************
INCIDENT_ID 37051
STATUS ready
CREATE_TIME 2017-10-16 21:51:03.9830000 -04:00
.
.
.
KEY_NAME Client ProcId
KEY_VALUE oracle@localhost.33449_1
KEY_NAME SID
KEY_VALUE 151.3
OWNER_ID 1
INCIDENT_FILE /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/incident/incdir_57051/DBATEST_dw03_13299_i57052.trc
OWNER_ID 1
INCIDENT_FILE /mount/dump01/oracle/DBATEST/diag/rdbms/dbatest/DBATEST/trace/DBATEST_dw03_66699.trc
1 rows fetched


Esta herramienta te permite crear un paquete y si así lo necesitas lo envias a Oracle, 
esto te evita el trabajo de andar buscando los archivos que necesitas enviar a Oracle Metalink, perdón  MOS.
Una vez, explicado el mecanismo y el uso de esta utilidad, espero que nos sirva para solucionar, 
alguno de esos errores terribles, que de vez en cuando aparecen en nuestras vidas  como DBA.