背景说明
- Photon 5 下的容器环境,系统内核 6.1
- Confluence 自定义容器版本 9.0.3
- 项目文件夹:/data/wiki
- 数据库:postgres:14.2-alpine
- 数据库目录:/data/wiki/pgsql
- 数据库空间:4.1G
Confluence 升级到 9.0.3 版本后,官方通告会在后续的版本结束 PGSQL-14 的版本支持。考虑本机另外的容器启用了不同版本的数据库就想趁此机会把数据库统一为15.2
未成功的尝试-pg_uggrade
网上大部分的建议是通过 pg_upgrade 的指令完成跨版本的升级操作,主要的操作流程如下:
- 复制 postgres:14.2-alpine 的命令文件到当前目录 pgsql
- 停止 postgres:14.2-alpine 的数据库容器
- 重命名数据库目录,将 pgsql 改为 pgsql.old
- 新建 15.2 的配置文件并启动该版本的数据库容器,数据库目录为 pgsql,确保数据库启动正常
- 停止 15.2 的数据库容器,重新配置,将 pgsql.old 目录增加到配置文件同时通过增加 command 指令确保不启动数据库
- 启动上述容器并进入容器内部
- 通过 pg_upgrade 的指令升级并迁移旧的目录(pgsql.old)到新文件夹(pgsql)
docker cp postgres:/usr/lib/postgresql/14 /docker/wiki/pgsql #该步骤操作就存在问题,alpine 是精简镜像,数据库相关文件存储在 /usr/loca/bin,非 alpine 版本的能正常操作 docker-compose -f docker-compose-wiki.yml down tar zcvf wiki-9.0.3-pg14-sql.tar.gz /data/wiki/pgsql # 备份数据库目录 mv /data/wiki/pgsql /data/wiki/pgsql.old docker-compose -f pgsql.yml up # 启动 15.2 数据库并生成对应的目录 docker-compose -f pgsql.yml down # 重新配置文件添加 command 指令 docker-compose -f pgsql.yml up docker exec -it wiki-pgsql bash /usr/lib/postgresql/15/bin/pg_upgrade -b /var/lib/postgresql/old/14/bin -B /usr/lib/postgresql/15/bin -d /var/lib/postgresql/old/ -D /var/lib/postgresql/data/ --check
pgsql.yml
version: '3' services: db: image: chaitin/safeline-postgres:15.2 # image: postgres:14.2-alpine # container_name: wiki-pg restart: always command: bash tty: true environment: - 'POSTGRES_USER=confluence' - 'POSTGRES_PASSWORD=password' - 'POSTGRES_DB=confluence' - 'POSTGRES_ENCODING=UTF8' - 'POSTGRES_COLLATE=C' - 'POSTGRES_COLLATE_TYPE=C' volumes: - /data/wiki/pgsql:/var/lib/postgresql/data - /data/wiki/pgsql.old:/var/lib/postgresql/old - /etc/localtime:/etc/localtime:ro
最后在执行升级操作时系统提示大量的 .so 链接库缺失,倒腾了多个版本的 lib 文件和目录后还提示 glibc 缺少,考虑到 alpine 版本的情况,决定换另一种升级方式。
未成功的尝试-直接应用新版本
在不更改目录和配置的情况下仅更换容器数据库的版本,将 postgres:14.2-alpine 更换为 chaitin/safeline-postgres:15.2
数据库启动会提示检测到存在记录,已有记录的版本是 pg14 和当前 15.2 版本不符,数据库无法正常启动
pg_dumpall 升级
通过 pg_dumpall 导出14.2 版本数据库文件然后在 15.2 环境中再导入实现版本升级
- 将环境恢复到正常的初始状态,确保旧环境下数据库 14.2 和应用能正常访问
- 通过 pg_dumpall 指令完成数据库的导出
- 停止容器,修改数据库文件夹为 pgsql.bak
- 启动 15.2 容器,数据库目录为 pgsql 。确保数据库正常启动
- 将导出的 sql 文件复制到 pgsql 目录
- 通过指令将 sql 文件导入到数据库
- 停止 15.2 容器
- 修改应用项目的配置文件,启用 15.2 的数据库镜像
- 正常启动应用和数据库(15.2)
- 清理备份文件和目录
docker-compsoe -f docker-compose-wiki.yml up docker exec postgres pg_dumpall -U confluence > dump.sql docker-compsoe -f docker-compose-wiki.yml down mv pgsql pgsql.bak docker-compose -f pgsql.yml up # 需要注释 command 指令,启动 15.2 并生成对应的文件目录 cp dump.sql /data/wiki/pgsql/ docker exec -it wiki-pgsql bash cd /var/lib/postgresql/data/ psql -U confluence < dump.sql exit
添加评论