【问题标题】:PostgreSQL database restore using pg_restore as incremental data without overwritten or drop existing tables使用 pg_restore 作为增量数据恢复 PostgreSQL 数据库,而不会覆盖或删除现有表
【发布时间】:2021-07-10 09:49:12
【问题描述】:

我有两个主机服务器 s1 和 s2。在这两个服务器中,我都有一个名为n1 的模式。现在,我对 s1 的架构 n1 中存在的一些表进行了一些更改。我希望对服务器 s2 的架构 n1 进行相同的更改。我打算做的是使用pg_dump 备份服务器s1 的架构n1,并使用pg_restore 在服务器s2 中恢复。

使用以下命令进行备份和恢复:

pg_dump -Fc -h XXXXX -U user -d dbname > test.dump

pg_restore  -h XXXXX -U user -d dbname < test.dump

但是当我使用pg_restore 恢复时,我得到了这个错误:

pg_restore: while PROCESSING TOC:
pg_restore: from TOC entry 200; 1259 16435 TABLE table_name database_name
pg_restore: error: could not execute query: ERROR:  relation "address" already exists
Command was: CREATE TABLE public.table_name (
    id integer NOT NULL,
    status character varying(1) NOT NULL,
   table_name1 character varying(80) NOT NULL,
   table_name2 character varying(80),
   table_name3 character varying(80),
    location_id integer NOT NULL
);

【问题讨论】:

    标签: postgresql restore pg-dump pg-restore


    【解决方案1】:

    你可以这样转储:

    pg_dump -Fc -h XXXXX -U user --inserts --on-conflict-do-nothing --data-only -n n1 dbname > test.dump
    

    恢复此类转储将跳过与现有行存在主键或唯一约束冲突的行。选项 --on-conflict-do-nothing 从 v12 开始可用。

    【讨论】:

    • 是的,转储已成功创建,但在我恢复 db pg_restore --exit-on-error -h XXXXXX -U user -d db_name
    • 如果没有恢复,那么所有插入的行都有冲突,即它们已经存在于目的地。这将执行“合并”,即更新目的地的行。 pg_dump 无法做到这一点。
    • 有没有办法使用 pg 实用程序将数据库恢复为增量数据?请建议
    • 不,您必须编写使用INSERT ... ON CONFLICT ... DO UPDATE 的代码。 pg_dump 不会那样做。也许有一些实用程序可以做到这一点,但我现在想不出任何工具,而且要求工具是题外话。
    猜你喜欢
    • 2016-12-07
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2017-09-26
    相关资源
    最近更新 更多