【问题标题】:Restore Multiple Schemas in a Single Transaction - Postgres在单个事务中恢复多个模式 - Postgres
【发布时间】:2016-05-02 13:34:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# c postgresql pg-restore


    【解决方案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
    --
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 2019-12-30
      • 2018-05-11
      相关资源
      最近更新 更多