Wir beginnen mit unserem Frühjahrsputz dieses Mal sehr früh :-) und räumen die alten Trace-Dateien der Datenbank auf.
Die Oracle Version 11g stellt uns dafür ein eigenes Tool zur Verfügung: ADRCI
ADRCI steht hierbei für ADR Command Interpreter, wobei ADR ganz klassisch für Automatic Diagnostic Repository steht.
ADRCI wird auf der Kommandozeile gestartet (liegt im ORACLE_HOME/bin Pfad) mit dem sprechenden Namen adrci:
dos/unix> adrci
Da im diag-Ordner mehrere Tools ihre Dateien ablegen können, muss zuerst angegeben werden, welcher Bereich administriert werden soll. Dafür verwendet man den Befehl:
adrci> show homes
ADR Homes:
diag\clients\user_marco\host_1186817538_11
diag\clients\user_marco\host_1186817538_76
diag\clients\user_system\host_1186817538_11
diag\rdbms\o11g\o11g
diag\rdbms\o11g2\o11g2
diag\tnslsnr\myserver\listener
adrci> set home diag\rdbms\o11g2\o11g2
Zuständig für das Löschen von alten Trace-Dateien ist der MMON Prozess.
Zwei verschiedene Policies existieren als Voreinstellung:
SHORTP_POLICY = Wird verwendet für Trace-Dateien. Default-Einstellung 720 Stunden = 30 Tage. Geändert wird dieser Wert durch:
adcri> set control (SHORTP_POLICY = 3600)
LONGP_POLICY = Wird verwendet für Metadaten. Default 8760 Stunden = 1 Jahr.
adcri> set control (LONGP_POLICY = 8760)
MMON führt die Aktion dann innerhalb von 7 Tagen einmal aus.
Mit show control kann die Einstellung geprüft werden. Bevor Show control verwendet werden kann, muss zuerst ein Home gesetzt werden, sonst erhält man folgenden Fehler:
adrci> show control
DIA-48448: This command does not support multiple ADR homes
In Windows Vista, Windows 7 und Windows 2008 muss das Dos Fenster als Administrator geöffnet werden, sonst erscheint folgender Fehler:
adrci> show control
DIA-48251: Failed to open relation due to following error
DIA-48122: error with opening the ADR block file [d:\oracle\diag\rdbms\o112\o112\metadata\ADR_CONTROL.ams] [0]
DIA-27041: Message 27041 not found; product=RDBMS; facility=DIA
OSD-04002: Datei kann nicht geöffnet werden
O/S-Error: (OS 5) Zugriff verweigert
Wenn die DB nicht permanent durchläuft, kann das Löschen auch über Monate ausfallen. Dann muss manuell gelöscht werden!
Folgendes Beispiel kann unter SQL*PLus und WINDOWS verwendet werden:
REM Lösche alle Trace-Datein älter als 2 Tage
DEFINE del_days=2
COL del_hours NEW_VALUE del_hours
SELECT &&del_days*24 as del_hours FROM dual;
REM Wie lautet der Name von Instanz und DB ?
COL db_name NEW_VALUE db_name
COL sid NEW_VALUE sid
SELECT lower(name) as db_name, lower(instance_name) as sid FROM v$instance,v$database;
Unter Windows mussten bei unseren Tests unter Win 7 64 Bit Doppelbackslashes verwendet werden!
host adrci exec="set homepath diag\\rdbms\\&&sid\\&&db_name;purge -age &&del_hours -type trace"
host adrci exec="set homepath diag\\rdbms\\&&sid\\&&db_name;purge -age &&del_hours -type incident"
host adrci exec="set homepath diag\\rdbms\\&&sid\\&&db_name;purge -age &&del_hours -type utscdmp"
Die Dokumentation drückt sich etwas schwammig aus, was mit der Alert-Datei passieren soll.
Fakt zum Zeitpunkt Januar 2011 ist:
- Es gibt zwei Alert-Dateien ab 11g (XML Variante unter ORACLE_BASE/diag/rdbms/<sid>/<db_name>/alert und Trace Datei mit Namen alert<sid>.log im ORACLE_BASE/diag/rdbms/<sid>/<db_name>/trace Ordner)
- Nur die XML Datei wird bereinigt, die Trace-Datei nicht (My Oracle Support Note: Doc ID 751082.1 Bug 6800147, der aber wohl nicht gefixt wird)
- Sie müssen/können die Alert.log Trace-Datei manuell ohne ADRCI verschieben/archivieren/löschen.
host adrci exec="set homepath diag\\rdbms\\&&sid\\&&db_name;purge -age &&del_hours -type alert"
Für UNIX verwenden Sie bitte folgendes Skript:
REM Lösche alle Trace-Datein älter als 2 Tage
DEFINE del_days=2
COL del_hours NEW_VALUE del_hours
SELECT &&del_days*24*60 as del_hours FROM dual;
REM Wie heisst Instanz und DB ?
COL db_name NEW_VALUE db_name
COL sid NEW_VALUE sid
SELECT name as db_name, lower(instance_name) as sid FROM v$instance,v$database;
host adrci exec="set homepath diag/rdbms/&&sid/&&db_name;purge -age &&del_hours -type trace"
host adrci exec="set homepath diag/rdbms/&&sid/&&db_name;purge -age &&del_hours -type incident"
host adrci exec="set homepath diag/rdbms/&&sid/&&db_name;purge -age &&del_hours -type utscdmp"
host adrci exec="set homepath diag/rdbms/&&sid/&&db_name;purge -age &&del_hours -type alert"
Oder wenn Sie bereits im ADRCI angemeldet sind und die Schritte manuell durchführen möchten (Trace-Dateien älter 10 Tage löschen):
adrci>set homepath diag\rdbms\o11g2\o11g2
adrci>purge -age 240 -type trace
Ach ja, es soll ja noch Oracle Kunden geben, die keine Oracle Version 11 einsetzen (habe ich gehört :-))
Für die ein paar Code Schnipsel:
UNIX:
Löschen aller Trace-Dateien (im aktuellen Ordner), die älter als 7 Tage sind:
find ./ -ctime +7 -name "*.trc" -exec rm -f {} \; -ls
Das gleiche für Logs:
find ./ -ctime +7 -name "*.log" -exec rm -f {} \; -ls
Windows:
Leider kann mit dem del Kommando nicht angegeben werden, aus welchem Zeitraum Dateien gelöscht werden sollen.
Verwenden Sie deshalb entweder vba/wsh oder die Power-Shell.
Alternativer Workaround:
Mit XCOPY neuere Dateien in Hilfsordner kopieren, dann Ordner löschen und Hilfsdateien zurückkopieren
Für die ganz Mutigen:
Ordnerinhalt immer komplett löschen. Dann kann natürlich auch kein älterer Fehler nachvollzogen werden, deswegen wird diese Vorgehensweise nur für unwichtige Test-Datenbanken empfohlen.
Weitere schöne Beispiele zum Aufräumen in der Datenbank erhalten Sie in unserem Reorg & Wartung Kurs.