使用 pg_dumpall 备份迁移,适合数据量不大或跨版本跨度较大的情况(比如 16→18 ),需要停机升级,适合业务不大或者晚上不影响业务的时候操作。
以下是16和18的docker compose配置:
Postgres 16
docker-compose-16.yml
name: postgres16
services:
postgres16: # 服务名称
image: postgres:16.1-alpine
container_name: postgres16
restart: always
environment:
TZ: Asia/Shanghai
POSTGRES_USER: postgres
POSTGRES_DB: postgres
POSTGRES_PASSWORD: password
PGDATA: /var/lib/postgresql/data
ports: # 端口映射,这里需要修改下映射端口,避免与18冲突
- "5433:5432"
volumes: # 数据持久化的配置
- ./data:/var/lib/postgresql/data
- ./backup:/backup # 备份目录
logging:
options:
max-size: "10m"
max-file: "3"
Postgres 18
docker-compose-18.yml
name: postgres18
services:
postgres18: # 服务名称
image: postgres:18-alpine
container_name: postgres18
restart: always
environment:
TZ: Asia/Shanghai
POSTGRES_USER: postgres
POSTGRES_DB: postgres
POSTGRES_PASSWORD: password
PGDATA: /var/lib/postgresql/data
ports: # 端口映射
- "5432:5432"
volumes: # 数据持久化的配置
- ./pg18_data:/var/lib/postgresql
- ./backup:/backup
logging:
options:
max-size: "10m"
max-file: "3"
- 先启动pgsql 16的容器,然后执行以下命令备份全部数据库及用户配置:
# 启动容器
docker compose -f ./docker-compose-16.yml up -d
# 备份数据
docker exec -t postgres16 pg_dumpall -U postgres > /backup/dumpall.sql
- 然后启动pgsql 18的容器,执行以下命令恢复数据:
# 启动容器
docker compose -f ./docker-compose-18.yml up -d
# 备份数据
docker exec -i postgres18 psql -U postgres < /backup/dumpall.sql
注意其中映射的 backup 为同一个文件夹,及两个docker-compose.yml 需要在同一目录下(或者自行修改映射路径)

