我有时需要同步两个 PostgreSQL 数据库(一些表从开发数据库到生产数据库)。
因此我想出了这个脚本:
[...]
pg_dump -a -F tar -t table1 -t table2 -U user1 dbname1 | \
pg_restore -a -U user2 -d dbname2
[...]
问题是这只适用于新添加的行。当我编辑非 PK 列时,我收到约束错误,并且行未更新。对于每个转储的行,我需要检查它是否存在于目标数据库中(通过 PK),如果存在,则在 INSERT/COPY 之前将其删除。
谢谢你的建议。
(之前已发布在 stackoverflow.com 上,但恕我直言,这里是回答这个问题的更好的地方)。
答案1
答案2
在我见过的任何环境中,这通常不是逐个表地完成的。
任何行都有许多可能性:SELECT / INSERT / UPDATE / ALTER ...您需要考虑所有这些可能性。
表并不是数据库中唯一的东西,尤其是 PostgreSQL 数据库。序列、函数、聚合、视图等都可能需要复制。
如果我处于你的情况,我会转储整个数据库并用它来恢复干净的版本。
pg_dump --clean --no-owner --no-privileges dbname ## other pg_dump / psql options
答案3
也许使用 dblink 并仅从选择中插入您需要的内容?
http://www.postgresonline.com/journal/index.php?/archives/44-Using-DbLink-to-access-other-PostgreeSQL-Databases-and-Servers.html
http://www.postgresql.org/docs/current/static/dblink.html