【发布时间】:2014-04-10 23:23:09
【问题描述】:
我需要能够以某种方式从我的开发数据库中获取一组表到我的生产数据库中。我刚刚从开发数据库创建了一个转储文件,并在生产数据库上使用了 pg_restore。现在的问题是我需要在生产数据库上保留一个表(称为用户),同时替换其他表
我想我已经从这个命令正确地转储了
pg_dump -Fc --no-acl --no-owner -h localhost -U <USER> --exclude-table=users* --data-only <DB NAME> > test.dump
但我无法让恢复部分正常工作。我尝试了以下命令
pg_restore -Fc --no-acl --no-owner -h <PROD HOST> -U <USER> -d <DB NAME> -p <PORT> <FILE LOCATION>
但我收到以下错误
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2009; 0 121384 TABLE DATA idx_descs Jason
pg_restore: [archiver (db)] COPY failed for table "idx_descs": ERROR: duplicate key value violates unique constraint "idx_descs_pkey"
DETAIL: Key (id)=(6) already exists.
CONTEXT: COPY idx_descs, line 1
似乎对于我试图覆盖的表,它只是试图附加数据并遇到麻烦,因为现在有重复的主键。任何想法如何做到这一点?谢谢
【问题讨论】:
-
我运行 pg_restore 并使用 clean 和 disable 触发器选项来恢复到我现有的包含数据的表并得到相同的错误...
-
能否检查一下 dev 中是否因为缺少约束而存在重复记录?
-
我通常做的是将
prod和dev转储合并为一个(我在另一个测试数据库上测试)。然后停止对 prod 服务器的访问几分钟,导入数据库(我已经测试过并且证明可以正常工作),最后恢复对服务器的访问。当你合并你的开发数据时,你只需要小心生产数据。 -
@tftd 如何合并两个二进制转储?
-
@Vlad 有效点。我忽略了他在谈论二进制数据的部分..
标签: postgresql database-restore