PostgreSQL 14升级至15时pg_upgrade执行失败问题求助
问题原因与解决办法
核心问题1:使用了错误版本的pg_upgrade
你第一次执行的是旧版本(14.9)的pg_upgrade,该版本工具仅支持升级至14.x系列集群,会强制校验新bin目录的PostgreSQL版本是否与自身同属14系列,因此才会出现“预期14.9,实际15.4”的报错——这是旧版工具的正常逻辑,它不支持跨大版本升级到15。
核心问题2:新数据目录状态异常
改用新版本(15.4)的pg_upgrade时,报错“只能升级到PostgreSQL 15”,说明你指定的--new-datadir目录已经是一个已初始化的15版本集群,或者未按要求准备空的新集群目录。正确的跨版本升级要求新数据目录必须是通过新版本initdb初始化的空集群。
正确操作步骤
- 停止新旧版本的PostgreSQL服务
- 用15.4版本的
initdb初始化全新的空数据目录(若未完成):/usr/local/Cellar/postgresql@15/15.4/bin/initdb -D /usr/local/var/postgres.15.new - 使用新版本的pg_upgrade执行升级:
/usr/local/Cellar/postgresql@15/15.4/bin/pg_upgrade \ --old-bindir /usr/local/Cellar/postgresql/14.9/bin/ \ --new-bindir /usr/local/Cellar/postgresql@15/15.4/bin/ \ --old-datadir /usr/local/var/postgres.14.9.backup \ --new-datadir /usr/local/var/postgres.15.new - 升级完成后,可将新数据目录替换为原
/usr/local/var/postgres(操作前务必备份原目录)
关键注意事项
- 跨大版本升级必须使用目标新版本的
pg_upgrade工具,旧版本工具不支持向更高大版本升级 - 新数据目录必须是未被使用过的空目录,或是刚用新版本
initdb初始化的目录,不能指向已运行过的集群目录
内容的提问来源于stack exchange,提问作者David Lazar
相关产品推荐
相关产品推荐

