我想将生产中的转储合并到测试服务器数据库,以测试一些东西,直到现在我总是删除当前数据库,并从转储中恢复所有内容,但是问题是数据库每次执行此操作的容量都很大(数据库中的〜90gb ,以及〜25gb作为sql文件)
数据库有〜50个表,我想更新所有表,其中数据已更新或有新数据
im使用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知识来制定可以执行我想要的规则的规则,或者是否有其他方法可以做到这一点?
但是您可以避免在还原时删除所有数据。为此,请升级到PostgreSQL v12或更高版本,并使用带有--on-conflict-do-nothing
和--rows-per-insert=100
选项的pg_dump。然后,将跳过目标位置已存在的所有行。
无论如何您都应该升级,今年9.5将不再支持。