PostgreSQL 18 已经出来挺久了,最近才抽空开始升级一下,今年升级又又又踩坑了。
这次从 postgres 17 升级到 postgres 18 又搞了一天,去年的教程,有用,但是还是遇到一些新的问题。
我们需要起3个容器,一个用于旧版的数据库,一个用于新版的数据库,一个用于迁移。
1 | version: '3.5' |
在 postgres17 容器中打包旧版的bin相关文件和停掉 postgres17 服务
1 | # 备份这个动态链接库,后续要用到 |
在 postgres18 启动完毕后并初始化完毕后停掉 postgres18 服务
1 | su - postgres |
在 postgres18-migrate 中把 postgres17 的bin相关文件解压,这个容器中需要同时存在 postgres17 和 postgres18 的bin相关文件
1 | # 解压 postgres17 的bin相关文件 |
启动 postgres18 容器,进入容器内部运行 /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages 命令,这时候依旧会有很多的警告。
警告内容类似:
1 | WARNING: database "postgres-test" has a collation version mismatch |
用数据库连接工具,连接到 postgres18 数据库,执行以下命令:
1 | -- 对每个数据库执行以下命令 |
然后再进入到 postgres18 容器,在容器内部运行 /usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages 命令,这时候就看到没有警告了,此时就可以正常使用 postgres18 服务了。
错误内容
遇到错误,可以去看一下去年 16 升级 17 的教程,应该会有一些帮助。
今年遇到的问题,一个是因为 18 默认启用了校验和,导致升级失败,一个是缺少一些动态链接库,导致旧版本命令执行失败,再有就是 18 启用了校验和,导致的一些问题。