在 Arch 下利用 pg_upgrade 执行 PostgreSQL 版本升级
版本检查
首先确认你正在使用的 PostgreSQL 是上一个版本,检查资料库版本以便进行下一步操作。
一般情况下,可以使用下列命令检查
# cat /var/lib/postgres/data/PG_VERSION
而后,检查你所新安装的包的版本,确认其是否不一致且始终仅大于一个版本。
这个升级方法理应对所有的传统资料库有效。对于非传统的资料库,比如说通过流复制或日志传送,可能需要查看文档1
准备工作
首先需要安装 postgresql-old-upgrade 这个包。
进行升级之前,您或许需要执行一次资料库备份。
开始升级
- 如果 postgresql 的实例仍然在运行,请收集
initdb的参数。 - 停止
postgresql.service,并检查其确实停止了。 - 可以在这个步骤操作升级,但是如果已经升级了,跳过这一步。
- 重命名旧实例的目录,然后创建新实例的目录和临时工作目录。
# 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
- 利用
initdb初始化新实例的资料库(利用之前收集的initdb的参数)
[postgres]$ initdb -D /var/lib/postgres/data --locale=xy_XY.UTF-8 --encoding=UTF8 --data-checksums
- 利用
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.conf 和 postgresql.conf) 以便和旧资料库符合。
如果遇到 pg_upgrade 失败且信息为: The source cluster was not shut down cleanly. 请参阅这个链接
-
重新启动
postgresql.service -
如果一切正常,可删除
/var/lib/postgres/olddata和/var/lib/postgres/tmp目录
这里有指令被我忽略了,例如可以执行 /usr/bin/vacuumdb --all --analyze-in-stages --jobs=$(nproc) 来提升升级后的查询性能。