Postgres容器跨版本升级小记(大版本17升级18)250928
约定
{$PWD}:应用目录,通常是compose.yaml或者dockercompose.yaml所在目录。
{$DBDIR}:当前数据库挂载目录
{$DBDIR}_old:原数据库备份目录
{$DBDIR}_new:升级后数据库挂载目录
{$DBDIR}_bak:导出数据库备份存储目录
{$PREVERSION}:当前数据库版本号
{$DBNAME}:数据库名称
{$DBUSER}:数据库用户名
{$DBPASSWORD}:数据库密码
第一步 准备环境
进入应用目录
cd {$PWD} 停止应用所有容器
sudo docker compose down 备份数据库目录
sudo cp -r ./{$DBDIR} ./{$DBDIR}_old 新建数据库备份目录
mkdir ./{$DBDIR}_bak ./{$DBDIR}_new 第二步 备份数据
新建老版本数据库容器1,挂载老数据库目录,挂载数据库备份目录,使用原用户名密码启动老数据库
sudo docker run -itd --name pgold -v ./{$DBDIR}:/var/lib/postgresql/data -v ./{$DBDIR}_bak:/root postgres:{$PREVERSION} postgres 进入容器日志查看是否启动成功
sudo docker logs pgold PostgreSQL Database directory appears to contain a database; Skipping initialization
LOG: starting PostgreSQL 16.8 (Debian 16.8-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
LOG: listening on IPv4 address "0.0.0.0", port 5432
LOG: listening on IPv6 address "::", port 5432
LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
LOG: database system was shut down at yyyy-M-dd hh:mm:ss UTC
LOG: database system is ready to accept connections 进入上述容器并备份所有数据
sudo docker exec -it pgold bash pg_dumpall -c -U {$DBUSER} > /root/dump.sql Ctrl+D退出容器
sudo docker stop pgold 第三步 恢复数据
!!!注意,PG18的容器目录结构有变化,不能直接挂载/var/lib/postgresql/data,否则会报错
创建新版本数据库容器2,创建新数据库目录,挂载数据库备份目录,使用!原用户名密码!启动并初始化新数据库
sudo docker run -itd --name pgnew -v ./{$DBDIR}_new:/var/lib/postgresql -v ./{$DBDIR}_bak:/root -e POSTGRES_DB={$DBNAME} -e POSTGRES_USER={$DBUSER} -e POSTGRES_PASSWORD={$DBPASSWORD} postgres:latest postgres 进入上述容器并恢复所有数据
sudo docker exec -t pgnew psql -U {$DBUSER} -d {$DBNAME} -f /root/dump.sql sudo docker stop pgnew 第四步 替换数据库目录
删除当前数据库目录
sudo rm -rf ./{$DBDIR} 复制升级后数据库目录为当前数据库目录
sudo cp -r ./{$DBDIR}_new ./{$DBDIR} 第五步 启动、验证、清理
!!!注意:PG18的挂载目录有变化,需要修改compose.yaml文件,将挂载地址/var/lib/postgresql/data改为/var/lib
启动应用所有容器
注意:PG18的挂载目录有变化,需要修改compose.yaml文件,将挂载地址/var/lib/postgresql/data改为/var/lib/postgresql,否则数据库起不来
sudo docker compose up -d 确认升级成功,删除过渡容器和数据库备份
sudo docker rm pgold pgnew sudo rm -rf ./{$DBDIR}_bak ./{$DBDIR}_old ./{$DBDIR}_new