一、数据库备份
方法一:使用 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-alpinecontainer_name: postgres_dbrestart: alwaysenvironment: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: 10stimeout: 5sretries: 5user: "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