我需要能够以某种方式从我的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
对于我正在尝试覆盖的表,似乎只是尝试追加数据并遇到麻烦,因为现在有重复的主键。任何想法如何做到这一点?感谢
答案 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进行自动化。