【问题标题】:postgresql how to backup and overwrite specific tablespostgresql如何备份和覆盖特定表
【发布时间】: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 中是否因为缺少约束而存在重复记录?
  • 我通常做的是将proddev 转储合并为一个(我在另一个测试数据库上测试)。然后停止对 prod 服务器的访问几分钟,导入数据库(我已经测试过并且证明可以正常工作),最后恢复对服务器的访问。当你合并你的开发数据时,你只需要小心生产数据。
  • @tftd 如何合并两个二进制转储?
  • @Vlad 有效点。我忽略了他在谈论二进制数据的部分..

标签: postgresql database-restore


【解决方案1】:

所以你需要重新分配主键?

您可以尝试恢复到临时表(例如,在失败的情况下:idx_desc_temp),然后执行以下操作:

with t as ( select * from idx_descs_temp )
insert into idx_descs
    select id + 100000 [or whatever], [other fields] from t;

之后您需要重置序列(如果适用——填写序列名称....):

select setval( 'idx_descs_id_seq'::regclass, 100000 + [suitable increment]);

如果您有大量的表,您可以尝试使用系统目录来自动化。

请注意,您还必须重新编号外键引用。首先在生产数据库中移动数据可能会减轻痛苦。如果您使用的是 ORM,您还可以通过应用程序 API 实现自动化。

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多