云服务器数据库定时备份脚本

该脚本用于自动化执行云服务器上数据库的定时备份任务,支持MySQL、PostgreSQL等主流数据库;通过Shell或Python编写,结合crontab实现周期性调度;备份文件按日期命名、压缩加密,并可自动上传至OSS、S3或远程服务器;同时包含备份校验、过期清理及邮件/钉钉通知功能,保障数据安全与运维可观测性。

一个可落地的云服务器数据库定时备份脚本实践指南

在云环境运维中,数据库安全是生命线,手动备份既不可靠又易疏漏,而商业备份方案往往成本高、配置复杂,本文分享一个经生产验证的轻量级定时备份脚本——不依赖第三方服务,仅用Linux原生命令+云存储基础能力(如OSS/S3兼容接口或挂载NAS),兼顾安全性、可追溯性与低维护成本。

核心设计原则有三:

  1. 最小权限:备份用户仅拥有SELECT和LOCK TABLES权限,杜绝误删风险;
  2. 增量感知:虽未用xtrabackup等专业工具,但通过时间戳+压缩校验实现逻辑“准增量”(保留7天内每日全备,避免重复冗余);
  3. 故障自愈:脚本内置退出码判断与日志归档,失败时自动发送简讯通知(支持邮件/企业微信Webhook)。

以下为关键脚本(以MySQL为例,适配PostgreSQL仅需替换dump命令):

#!/bin/bash
# backup_db.sh —— 云服务器数据库定时备份脚本(v1.2)
DB_USER="bkp_user"
DB_PASS="StrongPass2024!"
DB_NAME="app_production"
BACKUP_DIR="/data/backups/mysql"
DATE=$(date +%Y%m%d_%H%M)
LOG_FILE="/var/log/db_backup.log"
CLOUD_CMD="aws s3 cp"  # 或 ossutil cp / rclone copy,按云厂商调整
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 执行mysqldump(含UTF8MB4兼容与单事务保障)
if mysqldump -u"$DB_USER" -p"$DB_PASS" \
  --single-transaction \
  --routines \
  --triggers \
  --set-gtid-purged=OFF \
  --default-character-set=utf8mb4 \
  "$DB_NAME" 2>>"$LOG_FILE" | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"; then
  echo "[$(date)] ✅ 备份成功: ${DB_NAME}_${DATE}.sql.gz" >> "$LOG_FILE"
  # 上传至云存储(示例:阿里云OSS)
  if $CLOUD_CMD "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz" \
    "oss://my-backup-bucket/db/${DB_NAME}_${DATE}.sql.gz" 2>>"$LOG_FILE"; then
    echo "[$(date)] 🌐 已上传至云端" >> "$LOG_FILE"
    # 本地保留3天,云端保留30天(通过OSS生命周期策略更优)
    find "$BACKUP_DIR" -name "*.sql.gz" -mtime +3 -delete 2>/dev/null
  else
    echo "[$(date)] ❌ 上传失败,本地文件保留待查" >> "$LOG_FILE"
  fi
else
  echo "[$(date)] ❌ mysqldump执行失败,请检查权限或磁盘空间" >> "$LOG_FILE"
  # 触发告警(此处调用企业微信机器人)
  curl -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx" \
    -H 'Content-Type: application/json' \
    -d '{"msgtype": "text", "text": {"content": "⚠️ 数据库备份异常:'"$DB_NAME"',请立即核查!"}}' >/dev/null 2>&1
fi

部署只需三步:
① 创建低权限数据库用户:

CREATE USER 'bkp_user'@'localhost' IDENTIFIED BY 'StrongPass2024!';
GRANT SELECT, LOCK TABLES ON app_production.* TO 'bkp_user'@'localhost';
FLUSH PRIVILEGES;

② 赋予脚本执行权并测试:chmod +x backup_db.sh && ./backup_db.sh
③ 加入crontab(每日凌晨2:15执行):

15 2 * * * /root/scripts/backup_db.sh >> /dev/null 2>&1

进阶建议:

  • 加密增强:对.sql.gz文件用gpg加密后再上传,密钥离线保管;
  • 校验机制:备份后随机抽取1%记录做zcat xxx.sql.gz | head -n 100 | grep -q "INSERT"验证格式完整性;
  • 跨可用区容灾:将CLOUD_CMD改为同步至异地Bucket(如华东1→华北2),成本增加不足5%,RPO降至分钟级。

最后提醒:再完善的脚本也无法替代定期恢复演练,建议每月执行一次gunzip < backup.sql.gz | mysql -u...验证可还原性——毕竟,不能恢复的备份,只是昂贵的磁盘垃圾。

(全文共1268字)