postgresql 数据库备份、重新构建容器
·
一、数据库备份
方法一:使用 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
更多推荐


所有评论(0)