使用 psql 数据库名称< pg_dump_file的现有数据会发生什么情况



我在aws的rds上有一个数据库,我使用来自数据库本地版本的pg_dump,然后使用适当的参数psql dbname > pg_dump_file进行远程上传以填充数据库。

我想知道如果rds数据库已经包含数据,预计会发生什么。更具体地说:

  1. 本地转储中存在但在rds中不存在的数据
  2. rds上有数据,但本地数据中没有
  3. 两者均有但已修改的数据

我目前的理解是:

  1. 上传后将添加新数据并同时显示
  2. rds中的数据应该不受影响?
  3. 来自pg_dump的数据将同时出现在两个文件中(假设pk相同,但字段不同)

大致正确吗?我一直在阅读这篇文章,但它对实际执行恢复的方式了解得有点少,所以我很难弄清楚这一点。谢谢。

编辑:在@wildplasser注释之后,通过查看pg_dump文件,似乎发生了以下情况:

CREATE TABLE [....]
ALTER TABLE [setting table owner]
ALTER SEQUENCE [....]

对于db中的每个表。然后,还是一次一个表:

COPY [tablename] (list of cols) FROM stdin;
[data to be copied]

最后,更多的ALTER语句来设置约束,外键等

所以我想最终的答案是"视情况而定"。如果已经创建了CREATE TABLE [...],ALTER TABLE,ALTER SEQUENCE语句,我想可以删除它们。我还不能肯定,如果一个人尝试用一个已经存在的表创建TABLE,会发生什么(可能会抛出错误?)。

那么我猜COPY语句会覆盖已经存在的内容。或者抛出一个错误。我得检验一下。一旦我想明白了,我会写一个答案。

所以答案有点枯燥。事实证明,即使在复制之前删除初始语句,如果表作为主键(因此唯一性约束),那么它将不起作用:

ERROR: duplicate key value violates unique constraint

所以很快就关闭了。我猜有人会将转储重写为UPDATE语句列表,但我猜还不如编写一个脚本来这样做。不确定pg_dump在这种情况下是否有用。

相关内容

最新更新