将旧数据库数据回填到现有 Postgres 数据库的最佳方法是啥?
Posted
技术标签:
【中文标题】将旧数据库数据回填到现有 Postgres 数据库的最佳方法是啥?【英文标题】:What is the best way to backfill old database data to an existing Postgres database?将旧数据库数据回填到现有 Postgres 数据库的最佳方法是什么? 【发布时间】:2020-01-02 18:03:47 【问题描述】:最近建立了一个新的 docker 镜像来替换现有的 postgres 数据库。在旧实例关闭之前,使用以下命令对数据库进行了转储:
pg_dump -h localhost -p 5432 -d *dbname* -U postgres > *dbname*.pgdump
我们希望将此数据连接或附加到新数据库中,以便“回填”一些较旧的历史数据。两个数据库的数据库名称和架构是相同的。最简单、最安全的方法是什么?其次,在这个过程中需要关闭postgres吗?
【问题讨论】:
这将取决于如何进行转储。 pg_dump 有很多选项,它们都有不同的结果。pg_dump -h localhost -p 5432 -d <dbname> -U postgres > <dbname>.pgdump
是我使用的命令。
【参考方案1】:
如果已将重叠的主键或唯一列分配给新数据,那么如果不进行一些工作来清理它们,就没有干净的方法来合并它们。假设这没有发生......
当前转储文件将包含所有已存在对象的创建语句。如果将该文件重播到当前数据库中,所有这些对象都会出现一堆错误。如果您没有在一个事务中全部运行,那么您可以简单地忽略这些错误。但是,您也可能以错误的顺序加载数据并获得外键违规。这些错误将与现有对象的所有其他错误混合在一起,因此很容易被忽略。
所以我要做的是建立一个空的数据库服务器,然后将您当前的转储重播到其中。然后重新获取 pg_dump,但使用 -a
或 --section=data
。然后您应该能够将该转储加载到您的新数据库中。这有两个优点,它不会转储不需要的 CREATE 语句并抛出需要忽略的错误,并且它应该以不会导致外键违规的顺序转储表。
【讨论】:
以上是关于将旧数据库数据回填到现有 Postgres 数据库的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章