postgresql如何备份和覆盖特定的表

时间:2014-04-10 23:23:10

标签: postgresql database-restore

我需要能够以某种方式从我的dev db中获取一组表到我的生产数据库中。我刚刚从dev db创建了一个转储文件,并在生产数据库上使用了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>

BUt我收到以下错误

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

对于我正在尝试覆盖的表,似乎只是尝试追加数据并遇到麻烦,因为现在有重复的主键。任何想法如何做到这一点?感谢

1 个答案:

答案 0 :(得分: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进行自动化。