从生产到测试服务器的 postgresql 合并转储;仅添加新记录
Posted
技术标签:
【中文标题】从生产到测试服务器的 postgresql 合并转储;仅添加新记录【英文标题】:postgresql merge dump from production to test server; add only new records 【发布时间】:2020-05-11 11:48:05 【问题描述】:我想将生产中的转储合并到测试服务器数据库,以测试一些东西,直到现在我总是删除当前数据库,并从转储中恢复所有内容,但问题是每次执行此操作的数据库都很大(~90gb in数据库,约 25gb 作为 sql 文件)
数据库有大约 50 个表,我想更新所有表,其中数据已更新或有新数据
我使用 postgres 9.5,我用于转储的命令是
PGPASSWORD="mypassword" pg_dump -U $user -h $host -d $dbname | gzip > $dest_dir/postgres_backup_$DATE.gz
要恢复我使用任何一个
cat postgres_file | sudo -u postgres psql $dbname
#or
gunzip -c postgres.gz | pg_restore -U $user -h $host -d $dbname
但是当我在不删除当前数据库的情况下使用它们时,我得到了错误,因为方案和关系已经存在并且它给出了类似的错误
ERROR: duplicate key value violates unique constraint
DETAIL: Key (mykey)=(some_integer_value) already exists.
ERROR: multiple primary keys for table "table_name" are not allowed
ERROR: relation "some_relation" already exists
它不会更新数据库
我开始阅读有关规则的内容,但我缺乏 sql 知识来制定可以做我想做的规则,或者有其他方法可以做到吗?
【问题讨论】:
【参考方案1】:没有办法选择性地只转储新行,因为 PostgreSQL 无法知道哪些是新行。
但您可以避免在恢复时删除所有数据。为此,升级到 PostgreSQL v12 或更高版本,并使用带有选项 --on-conflict-do-nothing
和 --rows-per-insert=100
的 pg_dump。然后将跳过目的地中已存在的所有行。
无论如何你都应该升级,今年 9.5 将不再支持。
【讨论】:
以上是关于从生产到测试服务器的 postgresql 合并转储;仅添加新记录的主要内容,如果未能解决你的问题,请参考以下文章