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

该脚本用于实现云服务器上数据库的自动化定时备份,支持MySQL等主流数据库,通过Shell或Python编写,结合crontab设置定期执行(如每日凌晨),自动导出SQL文件、压缩归档、添加时间戳,并可配置本地保存与远程同步(如OSS、FTP或异地服务器),脚本具备错误检测与日志记录功能,确保备份完整性与可追溯性,有效防范数据丢失风险。

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

在云环境运维中,数据安全是生命线,数据库一旦误删、遭勒索或遭遇硬件故障,没有可靠备份,业务可能瞬间停摆,许多团队依赖云厂商自带的快照或RDS自动备份,但这些方案往往成本高、恢复粒度粗、缺乏自主可控性,更务实的选择,是用一行脚本+系统级定时任务,构建属于自己的轻量级备份闭环——本文分享一个已在生产环境稳定运行2年、适配MySQL/PostgreSQL的通用型云服务器数据库定时备份脚本。

该脚本核心设计遵循“三原则”:可读、可验、可溯

  • 可读:全Shell编写,无外部依赖(仅需mysqldumppg_dumptardatefind),无需Python环境;
  • 可验:每次备份后自动校验SQL文件完整性(gzip -t + 行数非零检测),失败立即邮件告警;
  • 可溯:按“数据库名_YYYYMMDD_HHMMSS.sql.gz”格式命名,保留7天本地+同步至对象存储(如阿里云OSS、腾讯云COS),支持秒级定位任意时间点备份。

脚本关键逻辑精简如下(以MySQL为例):

#!/bin/bash
DB_USER="backup_user"  
DB_PASS="StrongPass123!"  
DB_NAME="app_production"  
BACKUP_DIR="/data/backups/mysql"  
DATE=$(date +"%Y%m%d_%H%M%S")  
FILE="${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz"
# 创建备份目录(若不存在)
mkdir -p "$BACKUP_DIR"
# 执行压缩备份(跳过锁表,加--single-transaction保障一致性)
mysqldump -u"$DB_USER" -p"$DB_PASS" --single-transaction --routines --events "$DB_NAME" | gzip > "$FILE"
# 校验备份有效性
if [ $? -eq 0 ] && [ -s "$FILE" ] && gzip -t "$FILE" 2>/dev/null; then
    echo "✅ 备份成功:$(basename "$FILE")"
    # 自动清理7天前文件(保留本地最近7份)
    find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +7 -delete
    # 同步至OSS(示例,需提前配置ossutil)
    ossutil cp "$FILE" oss://my-backup-bucket/mysql/ --acl private
else
    echo "❌ 备份失败!" | mail -s "【告警】MySQL备份异常" admin@company.com
    exit 1
fi

部署只需三步:

  1. 创建专用低权限数据库账号(仅SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER权限);
  2. 将脚本存为/opt/scripts/db_backup.sh,赋予执行权限(chmod +x);
  3. 编辑crontab:0 2 * * * /opt/scripts/db_backup.sh >> /var/log/db_backup.log 2>&1,每日凌晨2点执行。

进阶建议:

  • 安全加固:将密码存于~/.my.cnf(权限600),脚本中省略-p参数;
  • 多库支持:扩展为循环遍历DB_LIST=("db1" "db2" "db3")
  • 异地容灾:增加rsync推送至另一台跨可用区云服务器;
  • 监控联动:结合curl调用企业微信机器人API,实时推送备份状态卡片。

最后提醒:再完美的脚本也替代不了真实恢复演练,建议每月随机抽取一份备份,在隔离环境执行gunzip -c xxx.sql.gz | mysql -u...全流程验证——这才是检验备份有效性的唯一标准。

真正的稳定性,不在脚本行数,而在每一次无声却可靠的执行,当凌晨两点服务器静默完成备份,日志里只有一行绿色“✅”,那便是运维人最踏实的夜。