在单个事务中恢复多个模式 - Postgres

时间:2016-05-02 13:34:28

标签: c# c postgresql pg-restore

我有一个相当大的数据库,有5个以上的模式。目前我通过执行pg_dump来为每个模式生成单独的.sql文件来创建备份。当我进行恢复时,我不得不循环遍历每个模式并单独运行恢复命令,这非常耗时,并且如果特定模式失败也会出现问题。我可能遇到一些模式被更新而另一些模式失败的情况可能不会。

我想要做的是将每个恢复并行作为单个事务运行,因此如果一个失败,它们都会失败。另外,我知道对此的简单回答不是备份为单独的.sql文件,遗憾的是这是我无法改变的要求。

另外我应该注意我从c#baseline启动这些postgresql命令。我探索的另一个选项是在恢复中为每个.sql文件启动新线程,但这并不能解决我的单个事务问题。

1 个答案:

答案 0 :(得分:0)

  

我想要做的是将每个恢复并行作为单个事务运行,因此如果一个失败,它们都会失败

属于同一事务的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
--