MySQL 自动备份的完整配置:从 crontab 到异地存储
作者:夸父
一份可以直接抄的 MySQL 自动备份配置:备份脚本、crontab 定时、异地同步(rclone 到 OSS)、保留策略与失败告警——20 分钟配好,永久安心。
完整备份脚本(复制即用)
#!/bin/bash
# /opt/scripts/mysql-backup.sh
DATE=$(date +%F)
DIR=/backup/mysql
KEEP_DAYS=30
WEBHOOK="你的通知webhook地址"
mkdir -p $DIR
# 备份
mysqldump --single-transaction --routines -u backup_user -p'密码' aivideo | gzip > $DIR/db-$DATE.sql.gz
# 检查结果并通知
if [ ${PIPESTATUS[0]} -eq 0 ] && [ -s $DIR/db-$DATE.sql.gz ]; then
SIZE=$(du -h $DIR/db-$DATE.sql.gz | cut -f1)
curl -s -X POST "$WEBHOOK" -d "{"msg": "✅ 数据库备份成功 $SIZE"}" > /dev/null
else
curl -s -X POST "$WEBHOOK" -d "{"msg": "❌ 数据库备份失败!"}" > /dev/null
fi
# 清理 30 天前的本地备份
find $DIR -name "db-*.sql.gz" -mtime +$KEEP_DAYS -delete
# 异地同步(rclone 配好 remote 后启用)
# rclone copy $DIR/db-$DATE.sql.gz remote:mysql-backup/
crontab 定时
chmod +x /opt/scripts/mysql-backup.sh
crontab -e
# 加入:每天凌晨 3 点执行
0 3 * * * /opt/scripts/mysql-backup.sh
四个关键细节
1. --single-transaction:InnoDB 表的一致性备份(不锁表,业务无感)。2. 备份用户:单独建一个只有 SELECT 和 LOCK TABLES 权限的备份账号(见Key 安全的最小权限原则)。3. 备份的备份:脚本末尾的 rclone 同步到 OSS——同机备份防误删,异地备份防灾难,两层都要。4. 失败通知:备份失败时 webhook 告警——沉默的失败比失败本身危险。
恢复的命令(演练用)
gunzip < /backup/mysql/db-2026-10-30.sql.gz | mysql -u root -p aivideo
每季度跑一次恢复演练:在测试库执行,抽查数据完整性——演练通过的备份才是真备份(完整方案见备份手册)。
常见问题
备份脚本失败了怎么知道?
脚本里加失败通知(curl 推送到微信/钉钉的 webhook)——备份失败比备份成功更需要被知道。另加"备份文件存在性检查"到每周例行(见[运维打卡](/guides/gongju-daka))。
备份要保留多久?
建议 30 天(日备)+ 每月一个永久档。存储成本可控(压缩后的 SQL 文本很小),而"三个月前的数据"在纠纷追溯、误操作回滚时经常救命。


