2009-11-26 37 views
1

有时我需要同步两个PostgreSQL数据库(从开发数据库到生产数据库的一些表)。PostgreSQL,使用pg_restore更新现有行

所以我想出了这个脚本:

[...] 
pg_dump -a -F tar -t table1 -t table2 -U user1 dbname1 | \ 
pg_restore -a -U user2 -d dbname2 
[...] 

的问题是,这个工程只是新添加的行。当我编辑非PK列时,我得到约束错误并且行未更新。对于每个转储的行,我需要检查它是否存在于目标数据库(通过PK),如果是这样,请在INSERT/COPY之前将其删除。

感谢您的建议。

回答

1

这样做:

pg_dump -t table1 production_database > /tmp/old_production_database_table1.sql 
pg_dump -t table1 devel_database > /tmp/devel_database_table1.sql 
psql production_database 
truncate table1 
\i /tmp/devel_database_table1.sql 
\i /tmp/old_production_database_table1.sql 

你会得到很多关于第二\i重复主键错误的,但它会做你想要什么:从devel的所有行会被更新,所有的行不devel不会被更新或删除。

如果您有任何对table1的引用,那么您必须先删除它们,然后在导入后重新创建它们。特别检查on delete cascadeset nullset default对table1的引用 - 如果您有其他表,则会丢失其他表中的数据。

+0

谢谢,就是这样。然而,我将不得不备份许多'连接表'(''在删除级联'FKs上),但这不应该成为问题。 – woky 2009-11-27 14:59:15

+0

不要备份连接表 - 只是暂时删除此表中的所有FK。否则,您将不得不备份引用表,引用这些表的表等。很容易错过重要的事情。我真的建议将所有FK转换为“on delete no action”或“on delete restrict”。 – Tometzky 2009-11-27 17:42:20