2016-05-02 11 views
0

Ich habe eine ziemlich große Datenbank mit 5 + Schemas. Momentan erstelle ich Backups, indem ich einen pg_dump mache, um individuelle .sql-Dateien für jedes Schema zu generieren. Wenn ich eine Wiederherstellung durchführe, muss ich jedes Schema durchlaufen und einen Wiederherstellungsbefehl einzeln ausführen, was zeitaufwendig ist und Probleme verursacht, wenn ein bestimmtes Schema fehlschlägt. Ich könnte in eine Situation geraten, in der einige Schemas aktualisiert werden, während andere nach einem Fehler möglicherweise nicht sind.Mehrere Schemas in einer einzigen Transaktion wiederherstellen - Postgr.

Was ich tun möchte, ist, jede dieser Wiederherstellungen parallel als eine einzige Transaktion auszuführen, so dass bei einem Fehlschlag alle fehlschlagen. Außerdem weiß ich, dass die einfache Antwort darauf wäre, nicht als einzelne .sql-Dateien zu sichern, das ist leider eine Anforderung, die ich nicht ändern kann.

Auch ich sollte beachten, dass ich diese postgresql Befehle von einer C# Basislinie starten werde. Eine weitere Option, die ich untersucht habe, war, neue Threads für jede .sql-Datei in der Wiederherstellung zu starten. Dies löst jedoch nicht mein einziges Transaktionsproblem.

Antwort

0

Was würde ich tun möchte, ist jeder dieser Wiederherstellungen in parallel als einzelne Transaktion laufen, so dass, wenn einer ausfällt sie alle scheitern

SQL-Anweisungen zu derselben Transaktion gehören, können nicht parallel laufen .

Um einen Alles-oder-Nichts-Modus des Fehlers zu erhalten, können Sie einfach eine einzelne Transaktion starten, alle Schema-Wiederherstellungen in dieser Transaktion ausführen und einmal am Ende committen.

Zum Beispiel, wenn Sie 3-Schemata von

pg_dump -n schema1 dbname >s1.sql 
pg_dump -n schema2 dbname >s2.sql 
pg_dump -n schema3 dbname >s3.sql 

Diese erhalten haben könnte in psql wiederhergestellt werden, oder das Äquivalent in C# -Code, mit:

\set ON_ERROR_STOP on 
BEGIN; -- start transaction 
\i s1.sql -- run all commands in s1.sql 
\i s2.sql -- run all commands in s1.sql 
\i s3.sql -- run all commands in s1.sql 
COMMIT; 

Diese Sequenz Erfolg haben wird oder scheitern als Ganzes. Dies ist möglich, weil die oben erhaltenen Dump-Dateien keinen Transaktionskontrollbefehl enthalten. Zum Beispiel für ein leeres Schema:

-- 
-- PostgreSQL database dump 
-- 

SET statement_timeout = 0; 
SET client_encoding = 'UTF8'; 
SET standard_conforming_strings = on; 
SET check_function_bodies = false; 
SET client_min_messages = warning; 

-- 
-- Name: schema1; Type: SCHEMA; Schema: -; Owner: postgres 
-- 

CREATE SCHEMA schema1; 


ALTER SCHEMA schema1 OWNER TO postgres; 

-- 
-- PostgreSQL database dump complete 
--