Ich habe ein Programm geschrieben, dass die Wiederherstellung der Daten für unsere Anwendung durchführen soll. Zuerst wird die alte DB gelöscht, dann wird eine neue angelegt und die wiederherstellung mit pg_restore angestoßen. Um das ganze durchführen zu können, baue ich eine Verbindung zur “postgres”-DB und führe dann die befehle aus.
Bis jetzt hat das Programm mit Postgres 8.2.x richtig funktioniert. Jetzt versuche ich dieses mit der Version 9.1.1 und habe Probleme: die Befehle “Drop database” und “Create Database” funktionieren nicht mehr. Es kommt eine Meldung, dass diese Befehle nicht in einer Transaktion ausgeführt werden können, wobei ich ja eigentlich keine Transaktion mache.
Was könnte das sein und wie kann ich das Problem lösen?
Du rufst psql auf und übergibst die Befehle, oder? Und hast dabei ein .psqlrc, die u.a. enthält: “\set AUTOCOMMIT off”. Also, meine .psqlrc enthält dies z.B., und damit ist man erst mal in einer TX.
Kannst Du prüfen, ob Dein Client irgendwie sowas macht?
Nein, ich baue eine ODBC-Verbindung auf, in der allerdings extra Autocommit auf ON gesetzt wird. Ich habe aber schon beide Einstellungen für Autocommit ausprobiert, was leider nichts gebracht hat.
2011-10-25 10:11:29 CEST FEHLER: DROP DATABASE kann nicht in einem Transaktionsblock laufen
2011-10-25 10:11:29 CEST ANWEISUNG: BEGIN;DROP DATABASE IF EXISTS test;
2011-10-25 10:11:29 CEST LOG: Dauer: 0.000 ms Anweisung: ROLLBACK
Ich habe mir auch noch die Autocommit-Einstellung von dem Programm nach Verbindungsaufbau ausgeben lassen: es ist 0.
Von dem Programm wird definitiv nur “DROP DATABASE IF EXISTS test” übergeben.
ich habe gesehen, dass dazwischen ein “BEGIN” steht, was mich ja auch wundert.
Ich habe jetzt zum Testen einiges ausprobiert:
ich habe die Transaction-Einstellungen auf dem Server auf “read uncommitted” gesetzt.
ich habe festgestellt, dass der Befehl “SET AUTOCOMMIT TO OFF” von dem Server nicht mehr unterstützt wird!
FEHLER: SET AUTOCOMMIT TO OFF wird nicht mehr unterstützt
********** Fehler **********
FEHLER: SET AUTOCOMMIT TO OFF wird nicht mehr unterstützt
SQL Status:0A000
Hier ist noch ein Ausschnitt aus dem Protokoll:
2011-10-25 10:50:57 CEST LOG: Dauer: 0.000 ms Anweisung: BEGIN;set TRANSACTION_ISOLATION to ‘read uncommitted’
2011-10-25 10:50:57 CEST LOG: Dauer: 0.000 ms Anweisung: SAVEPOINT _EXEC_SVP_03DC9030
2011-10-25 10:50:57 CEST FEHLER: DROP DATABASE kann nicht in einem Transaktionsblock laufen
2011-10-25 10:50:57 CEST ANWEISUNG: DROP DATABASE IF EXISTS test;
2011-10-25 10:50:57 CEST LOG: Dauer: 0.000 ms Anweisung: ROLLBACK to _EXEC_SVP_03DC9030
2011-10-25 10:50:57 CEST LOG: Dauer: 0.000 ms Anweisung: RELEASE _EXEC_SVP_03DC9030
und mit einem Commit nach “SET”
2011-10-25 10:58:48 CEST LOG: Dauer: 0.000 ms Anweisung: BEGIN;set TRANSACTION_ISOLATION to ‘read uncommitted’
2011-10-25 10:58:48 CEST LOG: Dauer: 0.000 ms Anweisung: COMMIT
2011-10-25 10:58:48 CEST FEHLER: DROP DATABASE kann nicht in einem Transaktionsblock laufen
2011-10-25 10:58:48 CEST ANWEISUNG: BEGIN;DROP DATABASE IF EXISTS m1;
2011-10-25 10:58:48 CEST LOG: Dauer: 0.000 ms Anweisung: ROLLBACK