无需停机即可在生产服务器上更新 Postgres

Bar*_*rmi 7 postgresql data-loss upgrade

我有一台运行 Postgres 9.4 的生产服务器。数据库 > 10 GB。是否可以在不停机和不丢失数据的情况下升级到 Postgres 9.5?

升级教程建议在执行时停止 Postgres sudo pg_upgradecluster 9.4 main,但这可能需要很长时间。更新一个 10 GB 的集群可能需要几个小时!

我也试过了pg_dump mydb > db.sql。删除数据库并在 PG 9.4 ( psql -d mydb -f db.sql) 中再次插入转储大约需要 50 分钟。

但是在 PG 9.5 中插入转储仅在 7 个多小时后才完成。特别是创建索引真的很慢......

2016-07-18 00:13:55 CEST [60358-5] ERROR:  canceling autovacuum task
2016-07-18 00:13:55 CEST [60358-6] CONTEXT:  automatic analyze of table ...
2016-07-18 00:36:20 CEST [60366-1] ERROR:  canceling autovacuum task
2016-07-18 00:36:20 CEST [60366-2] CONTEXT:  automatic analyze of table ...
2016-07-18 04:21:40 CEST [60361-1] ERROR:  canceling autovacuum task
2016-07-18 04:21:40 CEST [60361-2] CONTEXT:  automatic analyze of table ...
2016-07-18 07:55:19 CEST [61316-1] ERROR:  canceling autovacuum task
2016-07-18 07:55:19 CEST [61316-2] CONTEXT:  automatic analyze of table ...
Run Code Online (Sandbox Code Playgroud)

所以既不是pg_upgradecluster也不pg_dump是可接受的解决方案。即使使用 PG 4,您也会有至少 50 分钟的停机时间。因此:如何在不停机和不丢失数据的情况下在生产服务器或大型主从集群上升级数据库?

sho*_*hok 7

如果没有一些集群魔法,就不可能完全没有停机时间。

其他一些可能性:

  1. pg_upgrade--link选项一起使用。使用此选项,不会复制原始 DB 文件,而是将它们硬链接到新目录,从而大大加快了过程。请注意,这将永久更改源数据库文件。
  2. pg_dump在新数据库上使用和恢复。您可以通过在新数据库(fsync = false在新 PG 实例的配置文件中)禁用同步写入来大大缩短所需时间
  3. 侧面安装一个新的 PG 实例并让它在不同的端口上运行。然后,使用pg_dump通过网络将转储加载到新实例。完成后,交换端口并使用新实例。