将200GB的Postgres数据从9.0迁移到9.6

时间:2017-03-27 07:12:52

标签: postgresql database-migration

我们有一个只有5个表的简单数据库。但是1个表格很大,本身大约有100GB的数据,而且这些指数几乎是这个数字的两倍。服务器是带有PG 9.0的旧CentOS 5服务器。我正在转向使用SSD硬盘,CentOS 7和PG 9.6的更现代化的设置。

问题:什么是以简单方式迁移数据的最佳方式。 pg_dump它在旧服务器上,通过rsync或其他东西移动到新服务器和pg_restore?我可以使用-Fc选项执行pg_dump,这样我们就可以轻松地pg_restore(否则它是一种文本格式,我们必须使用psql -f)。但试运行表明,虽然pg_dump没问题,但目标服务器上的pg_restore会更快,继续运行。我们做了pg_restore --verbose,但根本没有冗长。也许服务器卡在做IO?

我们对pg_restore的pg.conf设置如下:

maintenance_work_mem = 1500MB 
fsync = off
synchronous_commit = off
wal_level = minimal
full_page_writes = off
wal_buffers = 64MB
max_wal_senders = 0
wal_keep_segments = 0
archive_mode = off
autovacuum = off

我们应该怎样做才能确保pg_restore有效?现在两个服务器都处于脱机状态,因此我可以做任何需要的事情 - 任何设置都可以更改。

更多背景信息 -

旧服务器:CentOS 5,SCSI RAID 1磁盘,4GB RAM(不多),PG 9.0

新服务器:CentOS 7(最新版),SSD磁盘,16GB RAM,PG 9.6

感谢您提供有关以最佳方式移动大型表格的任何指示。通常的PG文档似乎没有帮助。我们尝试了文本转储方式和-Fc方式。

1 个答案:

答案 0 :(得分:2)

我强烈建议你pg_upgrade

  • 在新服务器上安装9.0.23。如有必要,请从中获取。
  • 使用pg_basebackup和合适的recovery.conf在新服务器上设置流式副本。启用WAL归档和restore_command,以防它因任何原因失去同步。
  • 同时在新服务器上安装9.6
  • 通过停止副本并尝试pg_upgrade到9.6来执行升级测试。重启副本,修复所有问题并重复,直至成功。
  • 如果您确信pg_upgrade会成功,请计划一个切换时间。停止9.0 master并停止副本。 pg_upgrade复制品。启动新的9.6服务器。

有关详细信息,请参阅pg_upgrade文档。

记住:保持备用。

如果您想要简单,只需pg_dumpall,然后输入psql。但是这样做会很慢,如果你的恢复失败到中途,你会尝试恢复等等,这会导致问题。

更好:

如果您不想使用复制,那么如果您希望快速完成任务,请使用并行模式pg_dumppg_restore directory格式输入/输出。

  • 配置9.0数据库以接受来自9.6主机的连接,并确保有高性能网络连接(千兆或更好)。
  • 使用9.6主机,运行9.6版pg_dumppg_dumpall
    • 使用pg_dumpall --globals-only -f globals.sql
    • 转储全局对象
    • 使用pg_dump -Fd -j4 -d dbname -f dbname.dumpdir或类似内容转储您的数据库。 -j是并行作业的数量。如果有多个数据库,则需要单独转储每个数据库。
  • 干净initdb一个新的PostgreSQL 9.6安装,删除你以前做过的任何尝试(因为我不知道是什么/不存在)。或者,DROP任何创建的角色,数据库等,将其返回到干净状态。
  • 使用psql运行全局脚本:psql -v ON_ERROR_STOP=1 --single-transaction -f globals.sql -d postgres
  • 使用pg_restore加载数据库转储:pg_restore --create -d template1 -j4 template1 dbname.dump,重复每个转储的数据库。您可以同时还原多个DB。

是的,我知道全局对象的处理很糟糕。是的,如果所有这些都包含在一个简单的命令中,那就太好了。但事实并非如此。如果您想尝试改进此设计,欢迎设计和经过深思熟虑的补丁。到目前为止,没有人愿意做足够的工作。