使用 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"


1. 先启动pgsql 16的容器,然后执行以下命令备份全部数据库及用户配置:

# 启动容器
docker compose -f ./docker-compose-16.yml up -d
# 备份数据
docker exec -t postgres16 pg_dumpall -U postgres > /backup/dumpall.sql


1. 然后启动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 需要在同一目录下(或者自行修改映射路径)