Logo Oracle Deutschland   DBA Community  -  März 2011
ADRCI: Automatic Diagnostic Repository Command Interpreter
von Sebastian Solbach, ORACLE Deutschland B.V. & Co. KG

Mit der Oracle Datenbank 11g wurde das Logverhalten der Oracle Datenbank umgestellt und die Trace, Log und Alert Informationen im Automatic Diagnostic Repository abgespeichert. Der primäre Grund, die Protokollierung der Datenbank von der alten Struktur unter $ORACLE_BASE/admin in die neue Struktur unter $ORACLE_BASE/diag/rdbms zu überführen, lag sicherlich auch an der Formatänderung in das XML Format, welches die gespeicherten Daten nun maschinell einfacher lesbar macht.

Damit einher gingen aber auch viele andere nützliche Funktionalitäten, wie das automatische Rollieren der Logfiles, das automatische Löschen derselben und die Möglichkeit der Erzeugung von sogenannten Incident Paketen, die alle notwendigen Informationen zu einem spezifischen Problem enthalten, um diese Informationen gesammelt an Oracle Support weiterzuleiten zu können.

Aber nicht nur die Oracle Datenbank protokolliert in die Struktur des Automatic Diagnostic Repositories. Immer mehr Oracle Tools nutzen diese Struktur zu Protokollierung. So findet man die Logfiles des Listeners und des Oracle Clients in dieser Struktur wieder - auch wenn dies, wie beim Client, nicht unter $ORACLE_BASE, sondern in dem Verzeichnis geschieht, aus dem zum Beispiel SQLPlus aufgerufen wurde. Selbst der neueste Enterprise Manager 12c Agent verwendet das ADR schon, es ist also nur noch eine Frage der Zeit, bis auch die Grid Infrastruktur ihre Logfiles dort ablegen wird.

Umso wichtiger ist es, sich das Command Line Interface zu diesem Automatic Diagnostic Repository mal genauer anzuschauen, das ADRCI.

Wo befindet sich eigentlich das ADR?

Das Automatic Diagnostic Repository findet man im Normalfall unter dem ORACLE_BASE Verzeichnis. Allerdings kann man über die Konfigurationsfiles der Datenbank, des Listeners oder der Datenbank selber steueren, wo die Daten des ADR gespeichert werden sollen.

Bei der Datenbank übernimmt dies der DIAGNOSTIC_DEST Parameter:
SQL> show parameter DIAG

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
diagnostic_dest                      string      /opt/oracle
Beim Listener wird das ADR mit Hilfe des ADR_BASE_listener_name in der Datei listener.ora unter $ORACLE_HOME/network/admin angegeben. Die Einstellungen für den Client steuert ADR_BASE in der SQLNET.ORA, sofern DIAG_ADR_ENABLED nicht explizit auf OFF gesetzt wurde (denn sonst gelten die Einstellungen für das Client Logging und Tracing wie in 10g). Der Default ist hierbei allerdings nicht das ORACLE_BASE, wie beim Listener, sondern das Verzeichnis <lokales Verzeichnis>/<user>_diag. Eine wichtiger Umstand, da hier auch das Tracing für den Client geschrieben wird, wenn es enabled wird.

Aufruf des Automatic Diagnostic Repository Command Interpreters

Das ADRCI befindet sich im 'bin' Verzeichnis der jeweiligen Oracle Installation und kann nach Setzen des ORACLE_HOMEs über $ORACLE_HOME/bin/adrci aufgerufen werden. Danach versucht das ADRCI zu ermitteln, wo die Diagnose Information resp. das Base Verzeichnis 'diag' des Automatic Diagnostic Repository zu finden ist. Hierzu wird erst im lokalen Verzeichnis bei Aufruf von ADRCI nachgeschaut und, ist dort kein diag Verzeichnis mit der entsprechenden Struktur vorhanden, das ORACLE_BASE Verzeichnis als Default eingestellt. Ist auch dieses nicht angegeben, so meldet ADRCI, dass kein ADR home gesetzt ist.
$ $ORACLE_HOME/bin/adrci

ADRCI: Release 11.2.0.2.0 - Production on Mon Mar 5 14:48:10 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
No ADR base is set
Das Base kann jederzeit über 'set base' verändert werden, genau wie die Navigation direkt in ein HOME über den Befehl 'set home' möglich ist. Die verfügbaren Homes innerhalb des ADRs lassen sich mit 'show homes' anzeigen.
adrci> set base /opt/oracle
adrci> show homes
ADR Homes:
diag/tnslsnr/bumucsvm1/listener
diag/asm/+asm/+ASM1
diag/rdbms/buvmrac/buvmrac_1
In die einzelnen Homes kann nun über 'set home' navigiert werden. Dabei ist es entweder möglich, den ganzen Pfad anzugeben oder einfach nur ein Verzeichnis (wie den Datenbank Namen):
adrci> set home diag/rdbms/buvmrac/buvmrac_1
adrci> set home rdbms
adrci> set home buvmrac
adrci> set home buvmrac_1
adrci> show home
ADR Homes:
diag/rdbms/buvmrac/buvmrac_1
Da es in meinem Falle nur ein Datenbank Home gibt, haben alle Befehle dieselbe Wirkung: Das aktive Home wird auf das RDBMS Home gesetzt.

Die Navigation zwischen den Homes ist eine wichtige Funktion, da einige weiterführende Befehle nur innerhalb eines ADR Homes funktionieren. Andere dagegen, wie z.B. die Anzeige des Alert Logs, sind auch über mehrere Homes möglich, was gerade das Auffinden der Alert.logs in komplexen Umgebungen mit mehreren Datenbank Instanzen ungemein vereinfacht:
adrci> show alert

Choose the alert log from the following homes to view:

1: diag/tnslsnr/bumucsvm1/listener
2: diag/asm/+asm/+ASM1
3: diag/rdbms/buvmrac/buvmrac_1
Q: to quit

Please select option:

Hilfe beim ADRCI

Das ADRCI besitzt selber eine sehr gute Hilfe-Funktion, was einem häufig den Blick in die Dokumentation erspart. Zu jedem Befehl bekommt man auch weiterführende Informationen mit 'help <befehl>':
adrci> help

 HELP [topic]
   Available Topics:
        CREATE REPORT
        ECHO
        EXIT
        HELP
        HOST
        IPS
        PURGE
        RUN
        SET BASE
        SET BROWSER
        SET CONTROL
        SET ECHO
        SET EDITOR
        SET HOMES | HOME | HOMEPATH
        SET TERMOUT
        SHOW ALERT
        SHOW BASE
        SHOW CONTROL
        SHOW HM_RUN
        SHOW HOMES | HOME | HOMEPATH
        SHOW INCDIR
        SHOW INCIDENT
        SHOW PROBLEM
        SHOW REPORT
        SHOW TRACEFILE
        SPOOL

 There are other commands intended to be used directly by Oracle, type
 "HELP EXTENDED" to see the list

adrci> help set control

  Usage: SET CONTROL (=, ...)

  Purpose: Set the purging policy.

  Arguments:
    : The purging policy name. The current valid values are
    "SHORTP_POLICY" and "LONGP_POLICY".

    : The purging time value in hours.

  Examples:
    set control (SHORTP_POLICY = 1440)

Automatisches Housekeeping der Logfiles

Eine Besonderheit im ADR ist, dass Logfiles, wie das Alert.log, automatisch rollierend angelegt werden. Das Alert.log der Datenbank wird dabei nicht größer als 10MB und danach in alert_<nummer>.xml umbenannt. Dies gilt natürlich nicht für TRACE Dateien: Diese werden als eine vollständige Datei abgelegt.

Diese Form der Rollierung erlaubt es auch, dass Dateien, die älter als 365 Tage sind, automatisch gelöscht werden können. Hierzu kennt das ADR zwei Policies bzw. Zeiten: SHORTP_POLICY und LONGP_POLICY.

Die SHORTP_POLICY umfasst dabei Trace Files, Core Dumps und Packaging Informationen und ist per Default auf 720 Stunden gesetzt - also 30 Tage.

Die LONGP_POLICY steht auf 8760 Stunden (365 Tage) und besagt, wann die alten alert_<nummer>.xml Dateien gelöscht werden dürfen, bzw. ist das Zeitintervall für die Aufbewahrung von Incidents.

Diese Einstellungen können über 'show control' angezeigt, bzw. über 'set control' im jeweiligen ADR Home festgelegt werden:
adrci> set home diag/rdbms/buvmrac/buvmrac_1
adrci> show control

ADR Home = /opt/oracle/diag/rdbms/buvmrac/buvmrac_1:
************************************************************
ADRID       SHORTP_POLICY  LONGP_POLICY  LAST_MOD_TIME   
----------- -------------- ------------- -------------------
3744514972  720            8760          2012-02-16 18:33:43
1 rows fetched

adrci> set control (SHORTP_POLICY = 696)
adrci> show control

ADR Home = /opt/oracle/diag/rdbms/buvmrac/buvmrac_1:
************************************************************
ADRID       SHORTP_POLICY  LONGP_POLICY  LAST_MOD_TIME
----------- -------------- ------------- -------------------
3744514972  696            8760          2012-03-05 16:17:38
1 rows fetched
Besonders interessant ist diese Policy bei rdbms und ASM ADR Homes, da hier das automatische Löschen von der Datenbank-, bzw. ASM-Instanz übernommen wird und so eine automatische Logfilepflege stattfindet. Leider werden die Auditierungsdaten nicht im ADR abgelegt.

Bei den Logfiles des Listeners, Clients und anderer Homes fehlt allerdings ein aktiver Prozess, der das automatische Löschen in periodischen Abständen übernehmen könnte. Deswegen wird dies hier mit Hilfe des 'purge' Befehls manuell angestossen:
adrci> set home diag/tnslsnr/bumucsvm1/listener
adrci> purge
Mit dem gleichen Befehl ist es möglich, auch nur Trace Dateien zu löschen oder die Policies manuell zu überschreiben. Man sollte aber darauf achten, dass die Einheit beim Purge Befehl MINUTEN sind und nicht Stunden, wie bei den Policies. Ohne Angabe des Types werden alle Logfiles bis zum betreffenden Zeitpunkt gelöscht.
adrci> set home diag/tnslsnr/bumucsvm1/listener
adrci> purge -age 1440 -type trace
Nicht von dieser Funktionalität betroffen ist das aus Kompatibilitätsgründen immer noch mitgeführte "alte" alert.log. Dieses befindet sich im trace Unterverzeichnis des ADR und das Größenwachstum dieser Datei muss noch selber kontrolliert werden.

Von Problemen und Incidents

Eine weitere Besonderheit einer 11g Datenbank ist im Falle eines Fehlers (wie einem ORA-600) mehr Informationen in die Tracedateien zu schreiben. Ausserdem wird das Auftreten eines solchen Fehlers (welcher auch im Alert.log der Datenbank zu finden ist) als sogenanntes "Problem" bzw. "Incident" im ADR gekennzeichnet. Tritt ein und dasselbe Problem mehrmals auf, so ist jeder aufgetretene Fehler ein weiterer Incident, die aber vom ADR gemeinsam als ein einziges Problem gekennzeichnet werden.

Mit Hifle von SHOW PROBLEM bzw. SHOW INCIDENTS können die gesammelten Probleme aller Homes unterhalb des ADR Bases angezeigt werden. Dies schafft schnell einen guten Überblick auf den kompletten Datenbankserver (vorrausgesetzt alle Diagnose Informationen liegen in ein und demselben ADR Base/Oracle Base):
adrci> show problem

ADR Home = /opt/oracle/diag/tnslsnr/bumucsvm1/listener:
*************************************************************************
0 rows fetched

ADR Home = /opt/oracle/diag/asm/+asm/+ASM1:
*************************************************************************
0 rows fetched

ADR Home = /opt/oracle/diag/rdbms/buvmrac/buvmrac_1:
*************************************************************************
PROBLEM_ID   PROBLEM_KEY   LAST_INCIDENT        LASTINC_TIME
------------ ------------- -------------------- -------------------------
1            ORA 4031      40389                2012-03-05 17:27:09
1 rows fetched

adrci> set home rdbms
adrci> show incident

ADR Home = /opt/oracle/diag/rdbms/buvmrac/buvmrac_1:
*************************************************************************
INCIDENT_ID          PROBLEM_KEY                CREATE_TIME
-------------------- -------------------------- -------------------------
40385                ORA 4031                   2012-03-05 17:26:00.833000 +01:00
40386                ORA 4031                   2012-03-05 17:26:18.662000 +01:00
...
Genauere Details lassen sich mit show incident oder show problem ebenfalls anzeigen:
adrci> show incident -mode detail -p "incident_id=40389"

ADR Home = /opt/oracle/diag/rdbms/buvmrac/buvmrac_1:
*************************************************************************

**********************************************************
INCIDENT INFO RECORD 1
**********************************************************
   INCIDENT_ID                   40389
   STATUS                        ready
   CREATE_TIME                   2012-03-05 17:27:09.607000 +01:00
   PROBLEM_ID                    1
   CLOSE_TIME                    
   FLOOD_CONTROLLED              none
   ERROR_FACILITY                ORA
   ERROR_NUMBER                  4031
   ERROR_ARG1                    3981220
   ERROR_ARG2                    shared pool
   ERROR_ARG3                    unknown object
   ERROR_ARG4                    sga heap(1,0)
   ERROR_ARG5                    flashback generation buffer
...
Dies kann nun verwendet werden, um ein sog. Incident- bzw. Problem-Paket zu erzeugen, welches an Oracle Support hochgeladen werden kann.
adrci> set home rdbms
adrci> ips pack problem 1 in /tmp
Generated package 1 in file /tmp/ORA4031_20120305174817_COM_1.zip, mode complete
adrci> ips pack incident 40385 in /tmp
Generated package 2 in file /tmp/ORA4031_20120305174817_COM_1.zip, mode complete
Je nach angefallenen Logs, kann das Packen einige Zeit dauern. Die Support Workbench vom Enterprise Manager greift auf dieselben Informationen und Befehle zurück.

Scripting ADRCI

Wie die meisten Tools von Oracle kann auch ADRCI im Batch Mode aufgerufen werden. Dies ist insbesondere für das Housekeeping der Homes interessant, bei denen dies nicht, wie beim rdbms Home, automatisch abläuft. Die Befehle könnten natürlich auch in einem Script enthalten sein:
$ adrci exec="SET HOME listener;SHOW HOME;purge"

oder

$ adrci script=purge.txt

Nützliche Links und Referenzen

  • Oracle® Database Utilities 11g Release 2 (11.2): 16 ADRCI: ADR Command Interpreter
  • Oracle® Database 2 Day DBA 11g Release 2 (11.2): 11 Investigating, Reporting, and Resolving Problems
  • Zurück zur Community-Seite