将旧数据库数据回填到现有 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 数据库的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres多版本控制

BigQuery:回填时如何在查询中使用 run_date

如何将现有函数(包括聚合)包装到 Postgres 中的新函数中?

如何防止气流回填dag运行?

如何将docker容器添加到现有docker网络

如何回填 InfluxDB 中的连续查询?