Восстановление нескольких схем в одной транзакции — Postgres

У меня довольно большая база данных с 5+ схемами. В настоящее время я создаю резервные копии, выполняя pg_dump для создания отдельных файлов .sql для каждой схемы. Когда я выполняю восстановление, мне приходится перебирать каждую схему и запускать команду восстановления по отдельности, что отнимает много времени, а также создает проблемы, если конкретная схема дает сбой. Я могу столкнуться с ситуацией, когда некоторые схемы обновляются, а другие после сбоя могут не обновляться.

Что я хотел бы сделать, так это запустить каждое из этих восстановлений параллельно как одну транзакцию, поэтому, если одна из них выйдет из строя, все они потерпят неудачу. Кроме того, я знаю, что простым ответом на это будет отказ от резервного копирования в виде отдельных файлов .sql, к сожалению, это требование, которое я не могу изменить.

Также я должен отметить, что я запускаю эти команды postgresql из базовой версии С#. Дополнительный вариант, который я исследовал, заключался в запуске новых потоков для каждого файла .sql при восстановлении, хотя это не решает мою проблему с одной транзакцией.


person Bagelstein    schedule 02.05.2016    source источник


Ответы (1)


Что я хотел бы сделать, так это запускать каждое из этих восстановлений параллельно как одну транзакцию, чтобы в случае сбоя одного из них все они терпели неудачу

Операторы SQL, принадлежащие одной и той же транзакции, не могут выполняться параллельно.

Чтобы получить режим отказа по принципу «все или ничего», вы можете просто запустить одну транзакцию, запустить все восстановления схемы в этой транзакции и один раз зафиксировать в конце.

Например, если у вас есть 3 схемы, полученные

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

Это можно восстановить в psql или эквивалентном коде C# с помощью:

\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;

Эта последовательность будет успешной или неудачной в целом. Это возможно потому, что файлы дампа, полученные выше, не содержат команды управления транзакциями. Например, для пустой схемы это будет:

--
-- 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
--
person Daniel Vérité    schedule 03.05.2016