自动备份数据库
服务器部署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. 监控和优化建议

  1. 检查 /backups/db/backup.log 文件
  2. 设置日志监控告警(如出现 ❌ 失败记录)
  3. 定期执行恢复测试(建议每月一次)
  4. 备份不应该存储在服务器本身,应该存储在云存储中