如何缓慢地将大量数据从一个PostgreSQL服务器迁移到另一个服务器



我有一个postgres数据库,它保存了大部分数据(约400 GB(。我需要将它转移到另一个在不同服务器上设置的postgres实例,我需要将数据迁移到该服务器。我有什么选择?

两个DB都位于AWS中的k8s pod中,pod使用相同的k8s实例进行编排,但在其他方面是独立的。此外,目标数据库正处于严重的写负载之下,所以我更喜欢缓慢地迁移数据,可能需要几天的时间,以将额外的写负载保持在最低限度。

我知道使用pg_dumpdblink有标准的方法,但如果我理解正确的话,pg_dump需要首先创建一个完整的导出文件,考虑到数据库大小,这是不可行的,而dblink会尝试选择属于SELECT * FROM ...查询的整个数据,所以它也会失败。

关于我需要迁移的数据,还有一点是它有一个timestamp字段,并且在很长的时间范围内或多或少地均匀分布。但我不知道是否有一种方法可以纯粹在PG服务器端运行,它可以在一小段时间内循环获取数据,将其存储在本地,然后转移到下一段时间。

如果其他一切都失败了,我只需要编写一个独立的特别服务,我将与这些DB服务一起部署它来实现这一点。但我更喜欢基于现有工具的解决方案。

我过去曾在创建两个PostgreSQL数据库之间的管道方面取得了巨大成功。这是可能的,因为pg_dump实际上创建了"馈送到"目标数据库的普通SQL:

$ pg_dump <from first database> | pgsql <to second database>

它不创建导出文件,而是将导出发送到另一个数据库。

我一次只做一个表,而且只对表数据做,但您可以告诉pg_dump是包括模式和表定义,还是只包括数据。

实际上,我建议先创建模式和表,然后单独运行以复制数据。这样,如果出现问题,您可以直接复制特定的表。它还让您有机会在复制数据(应该很慢(之前验证模式(应该很快(。

我在一台单独的计算机上运行了这个命令,所以它有效地运行了db -> computer -> db

您可以编写一个python脚本来完成它。实际上,这里已经有一个脚本,可以在github中找到。这是一个目标是在postgresql数据库之间快速移动大量数据的脚本,这与您的要求不一样,但我认为您可以很容易地自定义它,以引入一些逻辑来限制速率。希望这会有所帮助。

最新更新