在 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)
来提升升级后的查询性能。