从生产到测试服务器的 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 合并转储;仅添加新记录的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 SQLite 切换到 PostgreSQL

我如何合并从dev到开始然后生产的git分支

浅谈 什么是JAVA开发环境测试环境及生产环境,及它的过程 (转)

git~分支管理规范

Git 分支 - 分支的新建与合并

3.2 Git 分支 - 分支的新建与合并