postgresql log fragt einzelne Datenbank ab

7

Ich verwende PostgreSQL (8.3) mit mehreren Datenbanken ... Ich frage mich, ob es eine Möglichkeit gibt, die Abfragen zu protokollieren, die nur in einer der Datenbanken (nicht in allen) durchgeführt wurden.

Oder um eine Protokolldatei pro Datenbank zu haben ...

Ich weiß, dass ich log_line_prefix = "%d"den Namen der Datenbank protokollieren und dann filtern kann, aber das ist nicht das Problem.

Sollte ich vielleicht einen log_analyzer verwenden, um dies zu umgehen? Hast du irgendwelche Empfehlungen?

Vielen Dank

Eine Stange
quelle
soll ich das woanders posten? wo ?
Arod
Wenn Sie mit einer der Antworten, die Sie hier erhalten haben, nicht zufrieden sind, lassen Sie es mich wissen und ich kann sie auf unsere DBA-Site ( dba.stackexchange.com ) verschieben. Franks Antwort scheint genau das zu sein, wonach Sie suchen.
voretaq7

Antworten:

13

Ja, dies ist möglich. Sie können den Konfigurationsparameter log_statementpro Datenbank festlegen :

ALTER DATABASE your_database_name
SET log_statement = 'all';
Frank Heikens
quelle
Es ist mir peinlich zuzugeben, dass ich das noch nie gesehen habe - ist es schon eine Weile her?
voretaq7
Ich habe diese Antwort wirklich nicht ausprobiert, da ich sie nicht mehr sofort brauche. Aber wenn es funktioniert, ist es das Beste!
:)
1
Ja, er hat sich geirrt, überprüfen Sie das Handbuch: postgresql.org/docs/current/interactive/… Diese Einstellung kann vom Superuser jederzeit für jede Datenbank geändert werden.
Frank Heikens
1
@Stefano Yup, ich irre mich (oder zumindest im Fall der Verwendung eines extrem suboptimalen View / Log-Triggers ) - ich habe dies jedoch nicht selbst versucht, daher bin ich mir nicht sicher, ob der DB-Name in das Feld eingefügt wird Protokollzeile oder nicht - dies ist nur dann ein Problem, wenn Sie es für mehrere DBs aktivieren und dennoch weniger Nachbearbeitung erfordern als die Protokollierung jeder DB in einem ausgelasteten Cluster.
voretaq7
1
@Stefano Es macht mir nichts aus, wenn diese Antwort negative Stimmen sammelt - es ist eine Lösung, aber sicherlich nicht die beste. Ich würde viel lieber sehen, dass Franks Lösung mehr positiv bewertet wird - es sollte meine Antwort wirklich um viel mehr als eine Stimme übertreffen!
voretaq7
1

Wenn Sie Anweisungen über Postgres protokollieren, gibt es keine mir bekannte Möglichkeit, diese Datenbank zu erstellen (es sei denn, Sie schreiben eine Ansicht, die einen Protokollierungsauslöser für jede Tabelle aufruft - offensichtlich nicht realistisch).

Die beste verfügbare Lösung ist die von Ihnen beschriebene (stellen Sie jeder Zeile den Datenbanknamen voran) und geben Sie die Daten an eine Stelle weiter syslog-ng, um das Abfrageprotokoll pro Datenbank aufzuteilen.

Die Nachbearbeitung der Protokolldatei ist ebenfalls eine Option. Beachten Sie jedoch mögliche Probleme (maximale Dateigrößenbeschränkungen für Betriebssystem / Dateisystem, Erschöpfung des Speicherplatzes) für Datenbankcluster mit einer großen Anzahl von Abfragen.
Beachten Sie auch, dass Sie für die Protokollierung aller Abfragen eine Leistungsstrafe zahlen. Wie hoch eine Strafe ist, hängt davon ab, wie groß die Anfragen sind ...

voretaq7
quelle