在 Arch 下利用 pg_upgrade 执行 PostgreSQL 版本升级

版本检查

首先确认你正在使用的 PostgreSQL 是上一个版本,检查资料库版本以便进行下一步操作。

一般情况下,可以使用下列命令检查

# cat /var/lib/postgres/data/PG_VERSION

而后,检查你所新安装的包的版本,确认其是否不一致且始终仅大于一个版本。

这个升级方法理应对所有的传统资料库有效。对于非传统的资料库,比如说通过流复制或日志传送,可能需要查看文档1

准备工作

首先需要安装 postgresql-old-upgrade 这个包。

进行升级之前,您或许需要执行一次资料库备份。

开始升级

  1. 如果 postgresql 的实例仍然在运行,请收集 initdb 的参数。
  2. 停止 postgresql.service ,并检查其确实停止了。
  3. 可以在这个步骤操作升级,但是如果已经升级了,跳过这一步。
  4. 重命名旧实例的目录,然后创建新实例的目录和临时工作目录。
# mv /var/lib/postgres/data /var/lib/postgres/olddata
# mkdir /var/lib/postgres/data /var/lib/postgres/tmp
# chown postgres:postgres /var/lib/postgres/data /var/lib/postgres/tmp
[postgres]$ cd /var/lib/postgres/tmp
  1. 利用 initdb 初始化新实例的资料库(利用之前收集的 initdb 的参数)
[postgres]$ initdb -D /var/lib/postgres/data --locale=xy_XY.UTF-8 --encoding=UTF8 --data-checksums
  1. 利用 pg_upgrade 升级资料库,把 PG_VERSION 替换成之前的 PostgreSQL 版本 (例如 13)
[postgres]$ pg_upgrade -b /opt/pgsql-PG_VERSION/bin -B /usr/bin -d /var/lib/postgres/olddata -D /var/lib/postgres/data

如果需要的话,调整新资料库的配置文件 (例如: pg_hba.confpostgresql.conf) 以便和旧资料库符合。

如果遇到 pg_upgrade 失败且信息为: The source cluster was not shut down cleanly. 请参阅这个链接

  1. 重新启动 postgresql.service

  2. 如果一切正常,可删除 /var/lib/postgres/olddata/var/lib/postgres/tmp 目录

这里有指令被我忽略了,例如可以执行 /usr/bin/vacuumdb --all --analyze-in-stages --jobs=$(nproc) 来提升升级后的查询性能。