我在aws的rds上有一个数据库,我使用来自数据库本地版本的pg_dump,然后使用适当的参数psql dbname > pg_dump_file
进行远程上传以填充数据库。
我想知道如果rds数据库已经包含数据,预计会发生什么。更具体地说:
- 本地转储中存在但在rds中不存在的数据
- rds上有数据,但本地数据中没有
- 两者均有但已修改的数据
我目前的理解是:
- 上传后将添加新数据并同时显示
- rds中的数据应该不受影响?
- 来自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在这种情况下是否有用。