Logo Oracle Deutschland   DBA Community  -  August 2011
Housekeeping der Oracle Datenbank: Freien Plattenplatz schaffen
von Ralf Durben, ORACLE Deutschland B.V. & Co. KG

Oracle Datenbanken haben in der Regel lange Laufzeiten, in denen sich viele nicht mehr benötigte Log- und Traceinformationen ansammeln. Das macht sich durch ein stetiges Wachstum von verbrauchtem Festplattenplatz bemerkbar und kann dazu führen, dass auf Storage-Ebene Konfigurationsanpassungen notwendig sind. Doch statt der Datenbank immer mehr Festplattenplatz zu gönnen ist es auch möglich, die nicht mehr benötigten Log- und Traceinformationen zu löschen.

Dieser Tipp zeigt, welche Dateien zur Laufzeit einer Oracle Datenbank stetig wachsen, bzw. wo Log- und Tracedateien stetig erzeugt werden. Des Weiteren wird gezeigt, wie Sie durch Löschen/Leeren dieser Dateien Festplattenplatz wieder frei bekommen. Dabei ist aber immer zu berücksichtigen, dass Log- und Traceinformationen ja auch ihre Berechtigung und Relevanz haben. Wenn in diesem Tipp also diese Informationen gelöscht werden, sollten Sie selbstverständlich immer prüfen, wie lange Sie diese Informationen aufheben wollen oder müssen.

Dieser Tipp berücksichtigt die Oracle Datenbank 11g.

Automatic Diagnostic Repository (ADR)

Mit Oracle Datenbank 11g wurde das Automatic Diagnostic Repository (ADR) eingeführt. Damit wurden die wichtigten Log- und Tracedateien in eine Verzeichnisstruktur zusammengeführt. Dieses vereinfacht das Housekeeping stark, dennoch gibt es weitere Orte, an denen man fündig wird. Doch betrachten wir zunächst das ADR näher.

Im ADR, welches üblicherweise im Verzeichnis $ORACLE_BASE liegt, wird für jede Komponente der installierten Oracle Datenbank Software ein eigener Bereich angelegt, wie das Beispiel zeigt.
[oracle@host]$ ls -l $ORACLE_BASE/diag
total 36
drwxrwxr-x 2 oracle oinstall 4096 Nov 30  2009 asm
drwxrwxr-x 3 oracle oinstall 4096 Dec  2  2009 clients
drwxrwxr-x 2 oracle oinstall 4096 Nov 30  2009 crs
drwxrwxr-x 2 oracle oinstall 4096 Nov 30  2009 diagtool
drwxrwxr-x 2 oracle oinstall 4096 Nov 30  2009 lsnrctl
drwxrwxr-x 2 oracle oinstall 4096 Nov 30  2009 netcman
drwxrwxr-x 2 oracle oinstall 4096 Nov 30  2009 ofm
drwxrwxr-x 3 oracle oinstall 4096 Nov 30  2009 rdbms
drwxrwxr-x 3 oracle oinstall 4096 Nov 30  2009 tnslsnr
Statt jetzt die Verzeichnisse einzeln zu durchsuchen, können Sie sich zum Beispiel unter Linux (Kommando für Solaris siehe weiter unten) einen schnellen Überblick über das ADR verschaffen mit
[oracle@host]$ ls -lahS $(find $ORACLE_BASE/diag -type f -size +1)
-rw-r----- 1 oracle oinstall 7.0M Aug  3 07:31 /oracle/installations/diag/rdbms/radu1/radu1/alert/log.xml
-rw-r----- 1 oracle oinstall 2.4M Aug  3 09:38 /oracle/installations/diag/tnslsnr/radu1/listener/alert/log.xml
-rw-r----- 1 oracle oinstall 944K Jun 29 14:12 /oracle/installations/diag/clients/user_oracle/host_521977988_11/alert/log.xml
-rw-r----- 1 oracle oinstall  64K Dec  2  2009 /oracle/installations/diag/clients/user_oracle/host_521977988_11/metadata/ADR_CONTROL.ams
-rw-r----- 1 oracle oinstall  64K Dec  2  2009 /oracle/installations/diag/clients/user_oracle/host_521977988_11/metadata/ADR_INVALIDATION.ams
-rw-r----- 1 oracle oinstall  64K Dec  2  2009 /oracle/installations/diag/clients/user_oracle/host_521977988_11/metadata/INC_METER_IMPT_DEF.ams
-rw-r----- 1 oracle oinstall  64K Dec  2  2009 /oracle/installations/diag/clients/user_oracle/host_521977988_11/metadata/INC_METER_PK_IMPTS.ams
-rw-r----- 1 oracle oinstall  64K Jul 31 11:38 /oracle/installations/diag/rdbms/radu1/radu1/metadata/ADR_CONTROL.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/ADR_INVALIDATION.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/AMS_XACTION.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/DDE_USER_ACTION.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/DDE_USER_ACTION_DEF.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/DDE_USER_ACTION_PARAMETER.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/DDE_USER_ACTION_PARAMETER_DEF.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/DDE_USER_INCIDENT_ACTION_MAP.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/DDE_USER_INCIDENT_TYPE.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/EM_DIAG_JOB.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/EM_TARGET_INFO.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/EM_USER_ACTIVITY.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/HM_FDG_SET.ams
-rw-r----- 1 oracle oinstall  64K Jul 31 11:38 /oracle/installations/diag/rdbms/radu1/radu1/metadata/HM_FINDING.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/HM_INFO.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/HM_MESSAGE.ams
-rw-r----- 1 oracle oinstall  64K Jul 31 11:38 /oracle/installations/diag/rdbms/radu1/radu1/metadata/HM_RECOMMENDATION.ams
-rw-r----- 1 oracle oinstall  64K Jul 31 11:38 /oracle/installations/diag/rdbms/radu1/radu1/metadata/HM_RUN.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/INCCKEY.ams
-rw-r----- 1 oracle oinstall  64K Jul 31 11:38 /oracle/installations/diag/rdbms/radu1/radu1/metadata/INCIDENT.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/INCIDENT_FILE.ams
-rw-r----- 1 oracle oinstall  64K Aug  3 09:06 /oracle/installations/diag/rdbms/radu1/radu1/metadata/INC_METER_CONFIG.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/INC_METER_IMPT_DEF.ams
-rw-r----- 1 oracle oinstall  64K Aug  3 09:06 /oracle/installations/diag/rdbms/radu1/radu1/metadata/INC_METER_INFO.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/INC_METER_PK_IMPTS.ams
-rw-r----- 1 oracle oinstall  64K Aug  3 09:06 /oracle/installations/diag/rdbms/radu1/radu1/metadata/INC_METER_SUMMARY.ams
-rw-r----- 1 oracle oinstall  64K Oct 28  2010 /oracle/installations/diag/rdbms/radu1/radu1/metadata/IPS_CONFIGURATION.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/IPS_FILE_COPY_LOG.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/IPS_FILE_METADATA.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/IPS_PACKAGE.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/IPS_PACKAGE_FILE.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/IPS_PACKAGE_HISTORY.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/IPS_PACKAGE_INCIDENT.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/IPS_REMOTE_PACKAGE.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/PROBLEM.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/SWEEPERR.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/tnslsnr/radu1/listener/metadata/ADR_CONTROL.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/tnslsnr/radu1/listener/metadata/ADR_INVALIDATION.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/tnslsnr/radu1/listener/metadata/INC_METER_IMPT_DEF.ams
-rw-r----- 1 oracle oinstall  64K Nov 30  2009 /oracle/installations/diag/tnslsnr/radu1/listener/metadata/INC_METER_PK_IMPTS.ams
-rw-r----- 1 oracle oinstall  64K Aug  3 09:38 /oracle/installations/diag/tnslsnr/radu1/listener/trace/listener.log
-rw-r----- 1 oracle oinstall  40K Nov 30  2009 /oracle/installations/diag/rdbms/radu1/radu1/metadata/ADR_INTERNAL.mif
-rw-r----- 1 oracle oinstall 1.5K Aug  3 09:20 /oracle/installations/diag/rdbms/radu1/radu1/trace/radu1_m000_32045.trc
-rw-r----- 1 oracle oinstall 1.5K Aug  3 09:30 /oracle/installations/diag/rdbms/radu1/radu1/trace/radu1_m000_1154.trc
-rw-r----- 1 oracle oinstall 1004 Aug  3 09:37 /oracle/installations/diag/rdbms/radu1/radu1/trace/radu1_lgwr_1692.trc
Das ADR hält eine Utility mit dem Namen ADRCI bereit, mit dem Sie im ADR auch "aufräumen" können. Diese Utility wird aufgerufen mit
[oracle@host]$ adrci
ADRCI: Release 11.1.0.7.0 - Production on Wed Aug 3 09:58:44 2011
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
ADR base = "/oracle/installations"
adrci>
Jede einzelne Komponente hat ein eigenes "ADR-Home" und Sie lassen sich alle ADR-Homes anzeigen mit
adrci> show homes
ADR Homes:
diag/rdbms/radu1/radu1
diag/tnslsnr/radu1/listener
diag/clients/user_oracle/host_521977988_11
Das ADR arbeitet mit zwei PURGE-Policies, nach denen bestimmte Daten automatisch gelöscht werden.
  • Die Short-Term-Policy ist zuständig für Tracedateien, Core Dumps und Paket-Informationen, die im Zusammenhang mit Incidents gebildet wurden. Der Default für diese Policy beträgt 720 Stunden (also 30 Tage).
  • Die Long-Term-Policy ist zuständig für Incident Informationen, Incident Dumps und Alert Logs. Der Default für diese Policy beträgt 8760 Stunden (also 365 Tage).
Die aktuelle Einstellung der PURGE-Policies können Sie in ADRCI für jedes einzelne HOME einsehen mit dem Kommando SHOW CONTROL, z.B mit
adrci> set homepath diag/rdbms/radu1/radu1
adrci> show control
ADR Home = /oracle/installations/diag/rdbms/radu1/radu1:
*************************************************************************
ADRID                SHORTP_POLICY        LONGP_POLICY         LAST_MOD_TIME                            LAST_AUTOPRG_TIME                        
-------------------- -------------------- -------------------- ---------------------------------------- ------------------------------------- 
2509119399           720                  8760                 2010-10-28 15:30:09.310921 +02:00        2011-07-31 11:38:03.080256 +02:00        


LAST_MANUPRG_TIME                        ADRDIR_VERSION       ADRSCHM_VERSION      ADRSCHMV_SUMMARY     ADRALERT_VERSION     CREATE_TIME
---------------------------------------- -------------------- -------------------- -------------------- -------------------- ------------
2011-08-03 10:02:11.401378 +02:00        1                    2                    65                   1                    2009-11-30 

1 rows fetched
Mit dem Kommando SET_CONTROL können Sie diese Policies ändern, wobei auch hier die Zeit in Stunden angegeben wird:
adrci> set homepath diag/rdbms/radu1/radu1
adrci> set control (SHORTP_POLICY = 240)
adrci> set control (LONGP_POLICY = 2400)
Sie können die alten Informationen aber auch direkt löschen mit dem Kommando PURGE, welches auch für ein einzelnes ADR-Home angewendet wird. Sie müssen auch hier für jeden PURGE-Durchgang vorher ein ADR-Home explizit auswählen:
adrci> set homepath diag/rdbms/radu1/radu1
adrci> purge -age 14400
adrci> set homepath diag/tnslsnr/radu1/listener
adrci> purge -age 14400
adrci> set homepath diag/clients/user_oracle/host_521977988_11
adrci> purge -age 14400
Im obigen Beispiel werden Log- und Tracedateien, die älter sind als 14400 Minuten (also 10 Tage), gelöscht. Der Parameter "-age" wird also in Minuten spezifiziert. Das PURGE-Kommando kann auch auf einzelne Datei- und Informationsarten eingeschränkt werden. Dieses wird detailliert im Handbuch "Oracle Database Utilities" beschrieben.

Eines macht das PURGE-Kommando aber nicht: Dateien verkleinern, die Daten über einen großen Zeitraum gesammelt haben. Es gibt Dateien im ADR, die stetig wachsen. Dazu gehören die Alert-Datei und vor allem die listener.log-Datei. Gerade Letztere kann über die Zeit bei regelmäßiger Nutzung der Datenbank über SQL*Net recht groß werden. Das PURGE-Kommando des ADRCI löscht aber keine Einträge aus dieser Datei. Daher empiehlt es sich auch hin und wieder die Datei zu leeren, zum Beispiel mit einem
echo 0 > $ORACLE_BASE/diag/tnslsnr/radu1/listener/trace/listener.log
Zuvor können Sie die Datei zur Sicherung der Informationen auf einen anderen Speicherort kopieren.

Audit-Daten

Die Oracle Datenbank 11g auditiert alle Datenbankanmeldungen, die mit SYSDBA-Rechten erfolgen. Pro Datenbankanmeldung mit SYSBDA-Rechten wird dabei eine eigene Datei erzeugt, die ungefähr 700 Byte groß ist. Sicherlich ist das für sich genommen keine relevante Größe, im Laufe der Zeit können aber sehr viele solcher Dateien zusammenkommen! Audit-Daten haben natürlich ihren Sinn und bevor daran manipuliert wird, sollte geklärt werden, ob und wie weit zurück diese analysiert werden. Auch die Aufbewahrung sollte klar geregelt sein. So empfiehlt es sich unter Umständen, den Speicherort dieser Dateien nicht auf dem Datenbankserver, sondern direkt an einer zentralen Stelle zu wählen.

Der Speicherort für diese Auditdaten wird mit dem Instanzparameter AUDIT_FILE_DEST festgelegt
[oracle@host]$ sqlplus / as sysdba
:
SQL> show parameter audit

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------------------------------
audit_file_dest                      string      /oracle/installations/admin/radu1/adump
audit_sys_operations                 boolean     FALSE
audit_syslog_level                   string
audit_trail                          string      NONE
und mit
rm /oracle/installations/admin/radu1/adump/*
sind diese schnell gelöscht.

Database Control

Oracle Enterprise Manager Database Control dient zur Verwaltung einer dedizierten Datenbank. Dazu wird im Oracle Home der Datenbank eine OC4J-Instanz verwendet. Wenn mit DBCA eine Datenbank erstellt wird, ist im entsprechenden Dialog die Verwendung von Database Control als Default voreingestellt. Wenn dieses nicht verändert wird, wird für diese neue Datenbank eine eigene Database Control Instanz eingerichtet.

Database Control hat eigene Log-Dateien, die sich auch füllen, wenn auf Database Control selbst gar nicht groß zugegriffen wird.
  • em-application.log

  • Sie finden diese Datei im Verzeichnis
    $ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_<host>_<sid>/log
    
    und kann recht leicht geleert werden mit
    echo 0 > $ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_<host>_<sid>/log/em-application.log
    
    also zum Beispiel
    echo 0 > $ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_radu1.de.oracle.com_radu1/log/em-application.log
    
  • emoms.* und emagent.*

  • Sie finden diese Dateien im Verzeichnis
    $ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_<host>_<sid>/sysman/log
    
    Die Log- und Tracedateien werden automatisch geteilt, wenn eine gewisse Größe erreicht wird und so entstehen alte Log- und Tracedateien mit den Namen
    emoms.trc.*
    emoms.log.*
    emagent.trc.*
    emagent.log.*
    
    die dann einfach gelöscht werden können mit
    rm $ORACLE_HOME/<host>_<sid>/sysman/log/emoms.trc.* 
    rm $ORACLE_HOME/<host>_<sid>/sysman/log/emoms.log.* 
    rm $ORACLE_HOME/<host>_<sid>/sysman/log/emagent.trc.* 
    rm $ORACLE_HOME/<host>_<sid>/sysman/log/emagent.log.*
    
  • Core Dumps

  • Wenn Database Control Core Dumps erzeugt, finden sich diese in
    $ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_<host>_<sid>/sysman/emd
    
    und können gelöscht werden mit
    rm $ORACLE_HOME/<host>_<sid>/sysman/emd/core* 
    

Ein letzter prüfender Blick

Nachdem Sie die obigen Punkte geprüft haben, verschaffen Sie sich am besten noch einen globalen Blick auf ein Oracle Home. Schließlich können ja auch Fremdanwendungen aus der Datenbank heraus Dateien erzeugen. Im ersten Schritt lassen Sie sich alle Dateien, die größer sind als 10MB der Größe nach auflisten. Auf Linux-Systemen zum Beispiel gibt es dazu das Kommando
ls -lahS $(find $ORACLE_HOME -type f -size +10000k)
Und für Solaris-Systeme nutzen Sie
ls -lah $(find $ORACLE_HOME -type f -size +10000k) | sort +4rn
Das Ergebnis sollte überschaubar sein. Log- und Tracedateien erkennen Sie leicht an ihrer Endung. Auch Core-Dumps sind leicht auffindbar.

Im zweiten Schritt lassen Sie sich alle Dateien auflisten, die in den letzten 4 Tagen verändert wurden:
Linux:
ls -lahS $(find $ORACLE_HOME -type f -ctime -4)

Solaris:
ls -lah $(find $ORACLE_HOME -type f -ctime -4) | sort +4rn
Sollte es ein Verzeichnis geben, in dem ständig neue Dateien erstellt werden, können Sie dieses mit diesem Kommando leicht ausfindig machen.

Fazit

Die Oracle Datenbank erzeugt Log- und Tracedateien, die im Fehlerfall hilfreich sind, bei längerem Betrieb einer Datenbank aber auch signifikanten Festplattenplatz belegen können. Mit wenigen Schritten können Sie unter Umständen genügend Storage wiedergewinnen und damit eine Konfigurationsänderung vermeiden.

Zurück zur Community-Seite