Das Problem
In großen Datenbankserverinstallationen mit Grid-Infrastruktur werden die Verbindungsaufbauversuche aller Datenbank-Clients von der Listener-Infrastruktur zentral entgegengenommen und verarbeitet.
Diese besteht im allgemeinen aus einem VIP-Listener und SCAN-Listenern. Hinzu kommen eventuell noch andere Listener
mit Spezialaufgaben. Jeder Listener produziert zwei Logdateien, eine in XML-Format im Unterverzeichnis "alert" der Diagnostic Destination
und eine zeilenbasierte Version im Unterverzeichnis "trace" der Diagnostic Destination.
Auf einem Datenbank-Cluster mit Dutzenden oder Hunderten Datenbank-Services und entsprechend vielen Clients kommen in sehr kurzer
Zeit erhebliche Mengen an Listener-Logeinträgen zusammen.
Wenn der Cluster-Administrator kein Housekeeping konfiguriert, führt das unweigerlich sehr schnell zu einem vollen Logfilesystem.
Die Lösung
Oracle bietet eine sehr einfache Lösungsmöglichkeit dafür an, die sich Logfile Segmentation nennt.
Folgende Parameter können in der listener.ora konfiguriert werden:
DIAG_ADR_ENABLED_<LISTENER_NAME>=ON # Default
LOG_FILE_NUM_<LISTENER_NAME>=... # Anzahl der Listener Log Segmente, es existiert kein Default
LOG_FILE_SIZE_<LISTENER_NAME>=... # Log-Segment Größe in MB (Default: 300 MB)
LOGGING_<LISTENER_NAME>=ON # Default
Wie funktionert es?
Setzen wir als Beispiel:
LOG_FILE_NUM_LISTENER=2
LOG_FILE_SIZE_LISTENER=10
Sobald die Datei log.xml im alert-Folder 10 MB an Größe erreicht, wird sie segmentiert. Sie wird in log_1.xml umbenannt und neue Einträge
werden in log.xml geschrieben. Sobald log.xml wieder 10 MB Größe erreicht, wird sie in log_2.xml umbenannt, neue Einträge wandern wieder in log.xml.
Zu diesem Zeitpunkt haben wir im Verzeichnis "alert":
log_1.xml # 10 MB
log_2.xml # 10 MB
log.xml # aktuelles Segment
Wenn nun log.xml wieder 10 MB Größe erreicht, wird das älteste Segment log_1.xml gelöscht, log.xml in log_3.xml umbenannt und neue Einträge wandern, wie gehabt, in ein neues log.xml.
Wir haben nun
log_2.xml # 10 MB
log_3.xml # 10 MB
log.xml # aktuelles Segment
usw.
Zu jedem Zeitpunkt haben wir also in diesem Beispiel höchstens 3 Segmente mit der spezifizierten maximalen Größe von 10 MB im “alert”-Ordner vorliegen.
Bemerkungen
Die zeilenbasierte Version des Listener Logs listener.log wird jeweils zur gleichen Zeit wie das xml-formatierte Segment segmentiert und
ältere Segmente werden auch hier in analoger Weise gelöscht.
Wird der Parameter LOG_FILE_NUM_<LISTENER_NAME> nicht gesetzt, werden ältere Segmente nicht gelöscht.
Man kann auch den Parameter LOGGING_<LISTENER_NAME>=OFF setzen, um das Listener Logging komplett zu deaktivieren, wenn es nicht gewünscht oder benötigt wird.
Resümee
Im eingeschwungenen Systemzustand, kenne ich die ungefähre Anzahl von Verbindungsversuchen pro Zeiteinheit und kann, abhängig von der Dauer, in der ich die Listener Logs auf Platte halten muss (bis zum Beispiel eine Sicherung erfolgt ist), die Größe des Filesystems abschätzen, welches in der Lage ist, alle anfallenden Log-Dateien zu puffern, ohne dass es überläuft.
Referenz
Matthias Mann
Co-Themenverantwortlicher Datenbankadministration


