DROP Database

Hallo!

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?

Laß mich raten:

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?


Andreas

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.

Was passiert, wenn du die Autocommit Einstellung änderst?

Wenn ich die Autocommit-Einstellung ändere, passiert nicht. Ich bekomme den gleichen Fehler!

Kannst du mal das Query Logging anschalten?

log_min_duration_query=0

Und protokollieren, was alles ausgeführt wird?

Hier ist der Ausschnitt aus dem Protokoll:

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.

Nun ja, das LOG ist da anderer Meinung. Beachte doch mal, was zwischen ‘ANWEISUNG:’ und ‘DROP…’ noch so steht …

Kannst Du SQL PASS THROUGH irgendwo einstellen?

Andreas

Hallo Andreas,

ich habe gesehen, dass dazwischen ein “BEGIN” steht, was mich ja auch wundert.

Ich habe jetzt zum Testen einiges ausprobiert:

  1. ich habe die Transaction-Einstellungen auf dem Server auf “read uncommitted” gesetzt.
  2. 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

  1. 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


Wie kann ich es überhaupt machen?

ODBC-Treiber. Der setzt das BEGIN; da ein, bin ich mir recht sicher.


Andreas

Hallo Andreas,

weisst du veilleicht, wie es bei dem ODBC ausschalten kann?

Ich habe folgenden Connection-String mittlerweile zusammengestellt, wobei cConnection die Werte für Datenbank, Port, User und Kennwort enthält:

“Driver={PostgreSQL ANSI};” + cConnection + “sslmode=prefer;TextAsLongVarchar=0;”;

  • “MaxVarcharSize=8190;MaxLongVarcharSize=8190;BoolsAsChar=0;LFConversion=0;UpdatableCursors=0;UseDeclareFetch=0;”;
  • “ksqo=1;UniqueIndex=1;Optimizer=0;CommLog=1;MyLog=1;C2=‘dd_;’;A1=7.4;Parse=0;disable_optimizer=1;”

Ich habe schon mittlerweile alles reingepackt, was in der Doku oder Log-Dateien zu finden war!