我想做的是将这些恢复中的每一个作为单个事务并行运行,所以如果一个失败,它们都会失败
属于同一事务的 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
--