如何将PostgreSQL中的dump合并到数据库中?

15

我正在不同机器上使用相同的数据库架构(PostgreSQL)。 我想知道如何从一台计算机合并数据到另一台计算机。 架构有许多表格(约10个)。 我想要实现什么?

  1. 从机器A转储数据到文件A.dmp
  2. 从文件A.dmp恢复数据到机器B
  3. 当记录已经存在于机器B中时,我想不将其插入到机器B中。

我试图从机器A转储数据到简单的SQL插入命令,但在尝试恢复它时,我遇到了重复键错误。 更重要的是,我想通过命令行还原数据(我必须导入250 MB数据),因为现在我正试图使用pgAdmin手动完成它。

最佳方法是什么?


最简单的方法可能是将其导入到一个(临时)新模式中,然后从那里合并。合并仍需要一些工作。(序列,FK约束...) - joop
那么如果我这样做,如何合并两个模式?你的意思是像这样 insert into schema1.table1 select * from schema2.table1 吗? - Dariusz Mydlarz
是的,但包括不存在:insert into schema1.table1 dst select * from schema2.table1 WHERE NOT EXISTS (SELECT * FROM schema2.table1 nx WHERE nx.pk = dst.pk); 此外,按正确的“拓扑”顺序进行排序,以便在引用之前填充FK。注意:可能有更聪明的方法来完成它,但对于只有十个表来说,这不算太多的工作。 - joop
1个回答

12

我终于用以下方法解决了这个问题:

  1. 使用以下命令导出转储文件:

    pg_dump -f dumpfile.sql --column-inserts -a -n <schema> -U <username> <dbname>
    
    为所有表设置跳过唯一性。
    CREATE OR REPLACE RULE skip_unique AS ON INSERT TO <table>
        WHERE (EXISTS (SELECT 1 FROM <table> WHERE users.id = new.id)) 
        DO INSTEAD NOTHING
    
    使用psql进行导入。
    \i <dumpfile.sql>
    

2
优秀的黑客技巧。(顺便提一下:注意序列!)别忘了之后要删除规则... - joop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接