之前从 postgres 15 升级到 postgres 16 搞了好久,但是没有把操作记录下来。
这次从 postgres 16 升级到 postgres 17 又搞了半天,学乖了,这次顺便把操作过程记录下来。
我们需要起3个容器,一个用于旧版的数据库,一个用于新版的数据库,一个用于迁移。
1 | version: '3.5' |
在 postgres16 容器中打包旧版的bin相关文件和停掉 postgres16 服务
1 | # 打包 postgres16 的bin相关文件 |
在 postgres17 启动完毕后并初始化完毕后停掉 postgres17 服务
1 | # 用以下命令停止 postgres17 服务 |
在 postgres170 中把 postgres16 的bin相关文件解压,这个容器中需要同时存在 postgres16 和 postgres17 的bin相关文件
1 | # 解压 postgres16 的bin相关文件 |
一切顺利的情况下控制台日志内容
1 | postgres@4c367e5fdc31:~$ /usr/lib/postgresql/17/bin/pg_upgrade -c -b /usr/lib/postgresql/16/bin -B /usr/lib/postgresql/17/bin -d /var/lib/postgresql/data_16 -D /var/lib/postgresql/data_17 |
启动 postgres17 容器,进入容器内部运行 /usr/lib/postgresql/17/bin/vacuumdb --all --analyze-in-stages
命令,之后就可以正常使用 postgres17 服务了。
错误内容
在执行 pg_upgrade 可能会报以下几个错误
错误一
1 | check for "xxxx" failed: incorrect version: found "postgres (PostgreSQL) 17.0", expected "postgres (PostgreSQL) 16.3" |
如果看到此错误,则可能是由于运行旧版本 (16) 而不是新版本 (17) 附带的 pg_upgrade 二进制文件造成的。使用版本 17 的 pg_upgrade 二进制文件的绝对路径来运行正确的二进制文件。
也有可能是 -b -B -d -D 的参数搞反了
错误二
1 | postgres@f14bfc4c19a3:~$ /var/lib/postgresql/data_17/17/bin/pg_upgrade -c -b /var/lib/postgresql/data_16/16/bin -B /var/lib/postgresql/data_17/17/bin -d /var/lib/postgresql/data_16 -D /var/lib/postgresql/data_17 |
这有可能是旧版本的 PostgreSQL 服务器在运行,或者没有正确关闭。
请使用
/usr/lib/postgresql/16/bin/pg_ctl -D /var/lib/postgresql/data_16 stop -s -m fast
命令关闭服务