gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:10 25 4
gpt4 key购买 nike

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

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

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

最佳答案

What I would like to do is run each of these restores in parallel as a single transaction so if one fails they all fail

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

关于c# - 在单个事务中恢复多个模式 - Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36983755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com