Blog

SQL im Hintergrund
 
Manchmal laufen SQL-Queries sehr lange, z.B. die Nachbearbeitung beim Einlesen von ALKIS NAS-Dateien. Um diese auszuführen möchte man nicht die ganze Zeit den Client offen haben und auf eine Rückmeldung warten. Solche Prozesse sollen im Hintergrund laufen. Außerdem möchte man sich ab und an ansehen wie weiter der Prozess ist und ob vielleicht Fehler aufgetreten sind.
Das läßt sich unter Linux leicht machen. Dennoch mußte ich immer wieder nachsehen wie das noch ging.
Hier fasse ich das mal kurz zusammen.

SQL-Befehl im Hintergrund ausführen:
PGPASSWORD=geheim; psql -U pguser -f langlaufendesqlanweisungen.sql datenbankname > langlaufendesqlanweisungen.log 2> langlaufendesqlanweisungen.err &

Dadurch, dass man die Umgebungsvariable PGPASSWORD zusammen auf die Zeile mit dem psql Query schreibt, wird das Passwort für die Anmeldung bei Postgres verwendet ohne, dass man noch mal das Passwort eingeben muss. Das wäre in einem Hintgergrundprozess, der durch das Zeichen & erzeugt wird nicht gegangen. psql hätte im Hintergrund auf das Passwort gewartet und nix gemacht. Hier werden die Ausgaben auf die Datei .log umgeleitet und die Fehler auf die Datei .err.

Ausgeben was im Prozess passiert:
tail -f langlaufendesqlanweisungen.log

Wenn man die Anzeige der Logdatei abbrechen möchte, einfach Ctr.-C.

Wenn man vielleicht einen lang laufenden Prozess abbrechen möchte, kann man diesen killen. Dazu fragt man erstmal die Prozess ID ab mit:
ps ux | grep langlaufendesqlanweisungen

und dann
kill -9 id

Das sollte man jedoch nur machen wenn man weiß was man tut. Vorzugsweise nur, wenn das gesamte SQL in einer Transaktion ausgeführt wird oder die Anweisungen rückgängig gemacht werden können oder bei einer Wiederholung der Ausführung auch das richtige Ergebnis rauskommt.

Welche SQL-Befehle gerade in der Datenbank abgearbeitet werden kann man sich auch ansehen mit dem SQL-Befehl:
SELECT * FROM pg_stat_activity;

  Datensatz auswählen
Blog alle auswählen
  • als Diagramm ausgeben