Backup / drop Database / aktive Connection

Hallo Allerseits,

weiss nicht, ob meine Frage hier hin oder eher ins Lazarusforum gehört. Da sich aber im deutschen Lazarusforum nicht so arg viele mit PostgreSQL auskennen, versuche ich hier mal mein Glück :slight_smile:

Ich nutze in einem mit Lazarus erstellten Programm eine Postgres-Datenbank. Soweit so gut. Nun möchte ich gerne ein Backup machen können (mit pg_dump und psql), funktioniert soweit auch.

Nun möchte ich gern, dass ein Nutzer (mit administrativen Rechten - er weiss dann, was er tut) mit meinem Programm, ein Backup erstellen kann (dies geht problemlos) und ein Backup wieder einspielen kann (hier das Problem).

Meine bisherige Vorgehensweise ist:

Sichern:

  • mit “pg_dump --host=localhost --port=5432 -w --username=postgres --file=Dateiname”

Wieder einspielen:

  • vorhandene Datenbank “vigema” löschen, um dem Problem doppelter Inhalte aus dem Weg zu gehen
  • Datenbank wieder erstellen
  • Datenbank füllen mit “psql --host=localhost --port=5432 -w --username=postgres vigema < Dateiname”

Zum Problem:
Greife ich zuvor mit einer Connection (TPQConnection) auf meine Datenbank zu, wird der Nutzer (Login-Rolle), der in der Connection eingetragen ist, Postgres übermittelt. D.h. wenn ich die Connection trenne (TPQConnection.Connected:=false) bleibt die Login-Rolle scheinbar als “aktiv” in Postgres stehen. Versuche ich dann die Datenbank zu löschen, kommt es immer zum Abbruch mit der Meldung, dass noch aktive Verbindungen zu der Datenbank bestehen!

Daher meine Frage, ob mein Vorgehen mit dem Backup fachlich richtig ist?
Wenn ja, gibt es eine Möglichkeit einen Nutzer (Login-Rolle) von außen “hart” abzumelden (am besten mit einem SQL-Befehl) oder gibt es sogar einen Befehl, der alle Nutzer abmeldet, sodaß sich alle neu anmelden müssten?
Wenn nein, wie dann?

Bin für alle sachdienlichen Hinweise dankbar!

Michael

Klingt danach als würdest Du die Verbindung nicht wirklich (sauber) trennen.
Taucht die Verbindung noch in pg_stat_activity auf? Falls ja, dann liegt der Fehler in der Art wie Du die Verbindung in Lazarus trennst.

Ja, habe ich eben getestet. Hatte ich ja auch schon vermutet.

Das bedeutet, das ist eher ein Problem von Freepascal/Lazarus und ich muss sehen, wie ich hier die TPQConnection ordentlich abgemeldet bekomme (TPQConnection.Connected:=false reicht offensichtlich nicht).

Werde mal die TPQConnection untersuchen, mal sehen, ob ich was finde.

Danke erstmal für den Denkanstoß! :slight_smile:

Für andere Lazarus/PG - Nutzer: Es ist ein Fehler von der TPQConnection oder TSQLQuery. Es werden beim Zugriff auf die Datenbank 2 Zugänge erstellt, beim Freigeben nur einer gelöscht. Ist also kein Problem von PostgreSQL.

Ich habe für mich die Lösung gefunden, dass ich die ZEOS-Komponenten für den Zugriff von Lazarus auf die Datenbank nutze, damit funktioniert das Backup ohne Probleme. :slight_smile:

Da die TPQConnection Probleme macht, hatte ich im Lazarusforum nach einer Lösung gefragt. Siehe: http://www.lazarusforum.de/viewtopic.php?f=17&t=7218 bzw. http://forum.lazarus.freepascal.org/index.php/topic,22080.0.html