我有一个相当大的数据库,有5个以上的模式。目前,我正在通过执行pg_dump为每个模式生成单独的.sql文件来创建备份。当我进行恢复时,我必须循环浏览每个模式并单独运行一个恢复命令,这很耗时,而且在特定模式失败时也会出现问题。我可能会遇到这样的情况:一些模式被更新,而其他模式在失败后可能不会更新
我想做的是将这些恢复中的每一个作为单个事务并行运行,这样,如果其中一个失败,它们都会失败。此外,我知道这个问题的简单答案是不备份为单独的.sql文件,不幸的是,这是我无法更改的要求。
此外,我还应该注意,我是从c#基线启动这些postgresql命令的。我探索的另一个选项是为恢复中的每个.sql文件启动新线程,但这并不能解决我的单个事务问题。
我想做的是将这些恢复中的每一个作为单个事务并行运行,这样如果其中一个失败,它们都会失败
属于同一事务的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
--