
服务器部署•2025年2月28日•5 min
自动备份数据库
📁 1. 创建备份脚本
创建 /usr/local/bin/pg_auto_backup.sh
脚本 (需执行 chmod +x
赋予权限):
bash
#!/bin/bash
# ======================= 配置区 =======================
BACKUP_DIR="/backups/db" # 备份存储目录
DB_NAME="your_database_name" # 数据库名 (需替换)
PG_USER="postgres" # PostgreSQL 用户名
MAX_DAYS=30 # 备份保留天数
DATE=$(date +%Y%m%d) # 日期格式
LOG_FILE="$BACKUP_DIR/backup.log" # 日志文件路径
# =====================================================
# 创建备份目录
mkdir -p $BACKUP_DIR
# ---------------------- 备份操作 ----------------------
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始备份: $DB_NAME" >> $LOG_FILE
pg_dump -U $PG_USER -d $DB_NAME -Fc -f $BACKUP_DIR/${DB_NAME}_${DATE}.dump 2>> $LOG_FILE
if [ $? -eq 0 ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ✔️ 备份成功: ${DB_NAME}_${DATE}.dump" >> $LOG_FILE
else
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ❌ 备份失败!请检查错误日志" >> $LOG_FILE
exit 1
fi
# --------------------- 清理旧备份 ---------------------
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 清理超过 ${MAX_DAYS} 天的旧备份..." >> $LOG_FILE
find $BACKUP_DIR -name "${DB_NAME}_*.dump" -mtime +${MAX_DAYS} -delete 2>> $LOG_FILE
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 自动备份任务完成" >> $LOG_FILE
Warning
生产环境建议将备份存储至对象存储 OSS,避免服务器故障导致数据丢失
⏰ 2. 设置定时任务
bash
# 编辑 cron 配置
crontab -e
# 添加以下内容(每天凌晨 2 点执行)
0 2 * * * /usr/local/bin/pg_auto_backup.sh
🔒 3. 配置目录权限
bash
sudo mkdir -p /backups/db
sudo chown postgres:postgres /backups/db
sudo chmod 700 /backups/db
✔️ 4. 验证备份完整性
bash
# 创建测试数据库
createdb -U postgres test_db
# 恢复备份验证
pg_restore -U postgres -d test_db /backups/db/your_database_20231001.dump
# 连接验证
psql -U postgres -d test_db -c "SELECT count(*) FROM your_table;"
📊 5. 监控和优化建议
- 检查 /backups/db/backup.log 文件
- 设置日志监控告警(如出现 ❌ 失败记录)
- 定期执行恢复测试(建议每月一次)
- 备份不应该存储在服务器本身,应该存储在云存储中