一、数据库备份

方法一:使用 pg_dumpall(推荐备份整个集群)

# 进入当前运行的容器备份
docker exec -it your_db_container_name pg_dumpall -U postgres > full_backup_$(date +%Y%m%d_%H%M%S).sql

# 或者使用环境变量中的用户名
docker exec -it your_db_container_name pg_dumpall -U ${POSTGRES_USER:-postgres} > full_backup_$(date +%Y%m%d_%H%M%S).sql

方法二:备份特定数据库

# 备份 dify 数据库
docker exec -it your_db_container_name pg_dump -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-dify} > dify_backup_$(date +%Y%m%d_%H%M%S).sql

方法三:使用 volume 直接备份数据文件(快速但需要停机)

# 停止容器
docker stop your_db_container_name

# 备份数据目录
tar -czvf postgres_data_backup_$(date +%Y%m%d_%H%M%S).tar.gz ./volumes/db/data/

# 重新启动容器
docker start your_db_container_name

验证备份文件

# 检查备份文件是否有效
head -n 10 full_backup_*.sql
# 应该看到 PostgreSQL 的版本信息和 SQL 语句

二、重新构建容器

1.停止并删除旧容器

docker stop your_db_container_name
docker rm your_db_container_name

2.创建 docker-compose.yml 文件

version: '3.8'

services:
  db:
    image: postgres:15-alpine
    container_name: postgres_db
    restart: always
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_DB_PASSWORD:-密码}
      POSTGRES_DB: ${POSTGRES_DB:-dify}
      PGDATA: /var/lib/postgresql/data/pgdata ###必须是挂载的数据卷目录
      POSTGRES_MAX_CONNECTIONS: ${POSTGRES_MAX_CONNECTIONS:-100}
      POSTGRES_SHARED_BUFFERS: ${POSTGRES_SHARED_BUFFERS:-128MB}
      POSTGRES_WORK_MEM: ${POSTGRES_WORK_MEM:-4MB}
      POSTGRES_MAINTENANCE_WORK_MEM: ${POSTGRES_MAINTENANCE_WORK_MEM:-64MB}
      POSTGRES_EFFECTIVE_CACHE_SIZE: ${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB}
    command: >
      postgres -c max_connections=$${POSTGRES_MAX_CONNECTIONS:-100}
               -c shared_buffers=$${POSTGRES_SHARED_BUFFERS:-128MB}
               -c work_mem=$${POSTGRES_WORK_MEM:-4MB}
               -c maintenance_work_mem=$${POSTGRES_MAINTENANCE_WORK_MEM:-64MB}
               -c effective_cache_size=$${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB}
    volumes:
      - ./volumes/db/data:/var/lib/postgresql/data  ###挂载的数据卷
    ports:
      - "5432:5432"
    healthcheck:
      test: [ "CMD", "pg_isready", "-h", "localhost", "-U", "$${POSTGRES_USER:-postgres}", "-d", "$${POSTGRES_DB:-dify}" ]
      interval: 10s
      timeout: 5s
      retries: 5
    user: "999:999"  # 使用 postgres 用户ID运行,增强安全性

3.创建.env文件

POSTGRES_USER=postgres
POSTGRES_DB_PASSWORD=your_strong_password_here
POSTGRES_DB=dify
POSTGRES_MAX_CONNECTIONS=100
POSTGRES_SHARED_BUFFERS=128MB
POSTGRES_WORK_MEM=4MB
POSTGRES_MAINTENANCE_WORK_MEM=64MB
POSTGRES_EFFECTIVE_CACHE_SIZE=4096MB

4.启动容器

方法一:

# 使用 docker-compose
docker-compose up -d db

方法二:

# 或者直接使用 docker run
docker run -d \
  --name postgres_db \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=your_strong_password \
  -e POSTGRES_DB=dify \
  -e PGDATA=/var/lib/postgresql/data/pgdata \
  -v ./volumes/db/data:/var/lib/postgresql/data \
  -p 5432:5432 \
  --restart always \
  postgres:15-alpine \
  postgres -c 'max_connections=100' \
           -c 'shared_buffers=128MB' \
           -c 'work_mem=4MB' \
           -c 'maintenance_work_mem=64MB' \
           -c 'effective_cache_size=4096MB'

三、恢复数据库

1.方法一:复制到容器后执行恢复数据

# 将备份文件复制到容器中
docker cp full_backup_20241219_120000.sql 容器ID:/tmp/backup.sql

# 在容器中执行恢复
docker exec -it 容器ID psql -U postgres -f /tmp/backup.sql

2.方法二:直接从宿主机执行恢复数据

# 或者从宿主机直接导入
cat full_backup_20241219_120000.sql | docker exec -i 容器ID psql -U postgres

四、验证容器

# 检查容器状态
docker logs 容器ID

# 检查健康状态
docker inspect 容器ID | grep -A 10 -B 5 "Health"

# 测试数据库连接
docker exec -it 容器ID pg_isready -U postgres -d dify

另外:非容器备份

# 切换到 postgres 系统用户
sudo -i -u postgres

# 然后执行备份(不需要指定用户名)
/usr/pgsql-14/bin/pg_dumpall > full_backup_$(date +%Y%m%d_%H%M%S).sql

# 或者一行命令
sudo -u postgres /usr/pgsql-14/bin/pg_dumpall > full_backup_$(date +%Y%m%d_%H%M%S).sql

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐