备份Docker中Postgre数据库的脚本和使用方法
本方案利用 PostgreSQL 原生的 `pg_dump` 逻辑备份工具,配合宿主机脚本和计划任务,实现数据的定期抓拍与安全恢复。
渲染中...
本方案利用 PostgreSQL 原生的 `pg_dump` 逻辑备份工具,配合宿主机脚本和计划任务,实现数据的定期抓拍与安全恢复。
> 文章内容建立在Linux环境下,Windows等其他环境请自行修改。
## 1. 脚本准备
```bash
#!/bin/bash
# --- 配置 ---
CONTAINER_NAME="pgsql" # 你的容器名称
DB_USER="postgres" # 数据库用户名
DB_NAME="loden" # 数据库名 (若备份所有库请用 "all")
BACKUP_DIR="/root/pgsql/backup" # 宿主机上的备份路径
DATE=$(date +%Y%m%d_%H%M%S) # 文件名日期格式
RETENTION_DAYS=10 # 保留天数
# --- 确保目录存在 ---
mkdir -p $BACKUP_DIR
# --- 执行备份 ---
# 原理:在容器内执行 pg_dump,将标准输出流(stdout)重定向到宿主机文件
echo "正在备份容器 [$CONTAINER_NAME] ..."
if [ "$DB_NAME" == "all" ]; then
# 备份所有数据库
docker exec $CONTAINER_NAME pg_dumpall -c -U $DB_USER > "$BACKUP_DIR/full_backup_$DATE.sql"
else
# 备份单个数据库 (推荐使用自定义格式 -Fc,压缩且恢复快)
docker exec $CONTAINER_NAME pg_dump -U $DB_USER -F c $DB_NAME > "$BACKUP_DIR/${DB_NAME}_${DATE}.dump"
fi
# 检查备份文件是否生成(且大小不为0)
if [ -s "$BACKUP_DIR/${DB_NAME}_${DATE}.dump" ] || [ -s "$BACKUP_DIR/full_backup_$DATE.sql" ]; then
echo "备份成功!"
else
echo "备份失败,请检查容器状态或日志。"
# 可选:失败时发送报警邮件
exit 1
fi
# --- 清理旧备份 ---
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -name "*.dump" -delete
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -name "*.sql" -delete
```
## 2. 环境配置
在运行脚本前,请确保你的宿主机环境已准备就绪:
1. **创建备份目录**: 建议将备份文件存放在 Docker 挂载点之外的独立路径:
```Bash
mkdir -p /root/pgsql/backup
```
2. **赋予脚本执行权限**:
```Bash
chmod +x /root/pgsql/pg_backup.sh
```
3. **配置免密环境 (关键)**: 为了让脚本在无人值守的情况下自动运行,你需要避免弹出密码提示。有两种原生方法:
- **方法 A (推荐)**:在 `docker-compose.yml` 的 `environment` 中添加 `PGPASSWORD: 你的密码`。
- **方法 B**:在脚本中备份行加入环境变量,例如:`docker exec -e PGPASSWORD=... $CONTAINER_NAME pg_dump ...`。
## 3. 开启自动化备份
通过 Linux 内置的 `crontab` 计划任务,让备份脚本在凌晨等低峰期自动运行。比如:
1. 输入命令打开编辑器:`crontab -e`
2. 添加一行配置(每天凌晨 3:00 执行备份):
```Bash
0 3 * * * /bin/bash /root/pgsql/pg_backup.sh >> /root/pgsql/backup.log 2>&1
```
*注:`>> ...log` 部分会将备份日志保存下来,方便你检查备份是否成功。*
## 4. 数据恢复
当发生数据误删(如 `TRUNCATE` 或 `DROP`)时,请按照以下步骤进行恢复。
恢复前检查备份文件的格式。如果你的脚本备份的是指定数据库(`-F c`),文件名后缀通常为 `.dump`。这类文件必须使用 `pg_restore` 工具。
恢复命令:在宿主机将备份直接恢复到指定数据库
```Bash
docker exec -i pgsql pg_restore --no-owner -U postgres -d loden_new --clean --if-exists < /root/pgsql/backup/loden_20260106_164814.dump
```
常见恢复命令参数说明:
- `--no-owner`:忽略数据库拥有者(忽略原来的数据库用户账号,直接导入当前指定用户)
- `-d <db_name>`:指定目标数据库(建议先建立一个测试库进行恢复演练,如命令中的 `loden_new`)。
- `--clean`:恢复前清理掉现有的数据对象(危险但有效)。
- `-j <n>`:并行运行恢复任务,如果数据库非常大,可以使用 `-j 4` 加速。END
评论
登录后查看和发表评论
前往登录