Fragen zum Monitoring via psql (Windowsumgebung)

Hallo,
über ein Skript Activity.cmd mit dem Inhalt:
psql.exe -hServer01 -p5434 -Upostgres -LLogdatei.txt < Sqlaufruf.sql

…lese ich die aktuelle Datenbankaktivität aus:

Sqlaufruf.sql:
SELECT datname as database, usename as username, application_name as application, client_addr as client_address FROM pg_stat_activity;

Das Ergebnis ist leider zu viel zu viel Text:

_********* QUERY **********
SELECT datname as database,
usename as username,
application_name as application,
client_addr as client_address
FROM pg_stat_activity;


database | username | application | client_address
----------±---------±------------±----------------
postgres | postgres | psql | 192.168.169.116
(1 row)_

Bekomme ich das irgendwie so gekürzt, dass ich zumindest die Anzahl der rows und die Query nicht gelogged bekomme? Jemand eine Idee? Bei anderen DBMS geht das (z.B. durch die Ergänzung SET NOCOUNT ON im Sqlaufruf)

“bei anderen” DBMS… Also in Oracle gibt es kein “SET NOCOUNT …” :wink:

Ich denke Du suchst nach den Parametern --quiet --tuples-only und --echo-errors

Allerdings werden mit --tuples-only auch keine Spaltennamen mit ausgegeben.

Am besten gehst Du mal die vielen Optionen von psql durch (z.B. \pset): http://www.postgresql.org/docs/current/static/app-psql.html

Also… mit:
psql.exe -hServer01 -p5434 -Upostgres -LLogdatei.txt --tuples-only < Sqlaufruf.sql
verschwindet schon mal die Rows-Anzahl. Etappenziel erreicht.

Leider wird die Query immer noch in der oben gezeigten Ausführlichkeit in die Log-Datei geschrieben, was das Auswerten erheblich erschwert.
“–echo-errors” verursacht einen Fehler - “–quiet” hat keine merkbare Veränderung zur Folge.

Zu der \pset Geschichte - komme von einem Monitoringserver, der nicht PostgreSQL installiert hat, sondern lediglich eine psql.exe mit 3 dlls agiert und eine Verbindung mit meinen jeweiligen PostgreSQL-Servern aufbaut. Diese Konfigurationsdatei “My.psqlrc” habe ich nicht (gefunden).

Bei Oracle gibt es aber z.B. SET HEADING ON, SET TRIMSPOOL ON, COLUMN … FORMAT A8, was alles etwas übersichtlicher macht. :smiley:

Ah, sorry. Das gibt’s erst ab 9.5

Die heisst auch nicht My.psqlrc (wo hast Du denn das gefunden?).
Die heisst heisst psqlrc.conf und liegt unter liegt in %APPDATA%\postgresql.
Wo die Datei liegt kann auch über eine Umgebungsvariable konfiguriert sein: http://www.postgresql.org/docs/current/static/app-psql.html#AEN96566

Dass die Query mit ausgegeben wird, ist nicht das Standardverhalten. Ich vermute es gibt doch eine psqlrc.conf.

Versuch doch mal --no-psqlrc, damit wird die psqlrc.conf auf keinen Fall gelesen.

Habe gerade meinen Client des Monitoring-Servers von 9.34 auf 9.5 geupdated… die Fehlermeldung bei --echo-errors ist weg - das Ergebnis das selbe - die Query wird im Log angezeigt.

Ebenso bei dem Zusatz --no-psqlrc - die besagte psqlrc.conf ist auch auf keinem meiner Server 9.34/9.5 noch auf meinem Monitoring-Server zu finden. Unter dem besagten Pfad befinden sich 2 Dateien: pgadmin_histoqueries.xml und pgpass.conf, wobei ich bemerken muss, dass ich PostgreSQL mit der binary-version und somit ohne Installationsroutine installiert habe.

Aktueller Stand:
psql.exe -hServer01 -p5434 -Upostgres -LLogdatei.txt --tuples-only --no-psqlrc --echo-errors < Sqlaufruf.sql

verzwickte Situation… ich vermute, dass diese psqlrc.conf für mich eine Sackgasse ist. Nun frage ich mich, ob ich nicht auch die wichtigen SETs in den sqlaufruf.sql schreiben kann? So mache ich es bei meinem MonitoringServer auch bzgl. SQL-Server & Oracle mit dem gewünschten Ergebnis?

Hmm, komisch.

Das sollte keinen Unterschied machen, so machen wir das hier auch immer.

Das sollte auch gehen. Es ist aber \pset, nicht set

Die Lösung: (yeah!)
Die Weitergabe an die Log-Datei hat mit “-LLogdatei.txt” nicht ohne Ausgabe der Query geklappt - mit “>> %LOGDATEI%” klappt es tadellos.

Ein kleines Tutorial - falls jemand eine ähnliches Skriptgesteuertes Monitoring anstrebt wie wir:
Voraussetzung: Windows Umbebung - PostgreSQL 9.3.4 + 9.5
Ein Verzeichnis - hier D:\PostgreSQL\Server in dem Dateien SVPG01.txt, SVPG02.txt,… liegen mit dem Inhalt der entsprechenden Ports(z.B 5432).

Einmal pro Stunde ruf ein Windows-Job (Aufgabenplanung) eine cmd-Datei auf:

@echo off
set SQLNAME=activity
set PGPASSWORD=UNSERPASSWORT
set ORDNER=D:\PostgreSQL
set PSQLTOOL=%ORDNER%\PSQL\psql.exe
set SERVERDIR=%ORDNER%\Server
set SQLSKRIPT=%ORDNER%\SQLs%SQLNAME%.sql
set LOGDATEI=%ORDNER%\LOGs%SQLNAME%.log

del %LOGDATEI%

for %%g IN (%SERVERDIR%*.txt) do set “DBSERVER=%%~ng” &CALL :Schritt2
GOTO :EOF

:Schritt2

echo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo >>%LOGDATEI%
echo. >>%LOGDATEI%
@echo Datenbankserver: %DBSERVER% >>%LOGDATEI%

FOR /F %%F IN (%SERVERDIR%%DBSERVER%.txt) DO (
@echo Datenbank-Port: %%F >>%LOGDATEI%
%PSQLTOOL% -h%DBSERVER% -p%%F -Upostgres --tuples-only --no-psqlrc < %SQLSKRIPT% >> %LOGDATEI%
)
goto :eof
::Ende

Diese cmd-Datei bewirkt mit 2 verschachtelten Schleifen, dass er für alle Dateien in dem Verzeichnis “Server” die Servernamen ausliest und für die jeweiligen Ports (die in der Datei drinstehen) das gewünschte SQL-Statement (Ordner D:\PostgreSQL\SQL) ausführt:
Hier der Inhalt:
SELECT datname as database, usename as username, application_name as application, client_addr as client_address FROM pg_stat_activity;
(natürlich auch zig andere Varianten möglich)

Ergebnis der Logdatei zur Auswertung:

ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

Datenbankserver: SVPG01
Datenbank-Port: 5432
postgres | postgres | psql | 192.168.###.###

ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

Datenbankserver: SVPG02
Datenbank-Port: 5434
postgres | postgres | psql | 192.168.###.###

ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

Datenbankserver: SVPG03
Datenbank-Port: 5437
postgres | postgres | psql | 192.168.###.###
DATENBANKNAME | dbuser_rd | | 192.168.###.###
DATENBANKNAME | dbuser_rd | | 192.168.###.###
DATENBANKNAME | dbuser_rd | | 192.168.###.###
DATENBANKNAME | dbuser_rd | | 192.168.###.###

usw…

Bei Fragen - einfach reinschreiben…
Ich suche jetzt hilfreiche weitere SQL-Statements. Z.B. Größe der DBs, Backupzeiten und -status, Konfigurationen (WAL an/aus?), Eingerichtete User, … für Oracle, SQL-Server und MySQL habe ich entspr. Skripte. Bei Bedarf lasst es mich wissen.

Danke für die Hilfe

Schau mal hier: https://wiki.postgresql.org/wiki/Database_Administration_and_Maintenance