背景:MySQL自动备份翻车现场实录
最近隔壁工位的小王连着三天凌晨被报警短信吵醒——MySQL自动备份任务又双叒失败了!作为过来人,我决定把十年踩坑经验浓缩成这篇实战手册,手把手教你怎么从一脸懵逼到精准排雷。
一、先搞明白你的备份姿势
应用场景:
生产环境每天凌晨2点自动执行全量备份,使用mysqldump配合压缩工具,通过crontab定时任务实现。备份文件存储到同服务器的/backup目录,保留最近7天数据。
技术栈选择:
Shell脚本 + crontab(经典组合,适合中小型项目)
(为什么不用XtraBackup?因为今天重点讲通用方案,物理备份工具我们改天单聊)
二、备份失败的五大经典死法
1. 权限不够型翻车
#!/bin/bash
mysqldump -uroot -p123456 mydb > /backup/mydb_$(date +%F).sql
典型报错:
mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: YES) when trying to connect
排查步骤:
- 手动执行脚本,观察报错
- 检查mysql.user表权限:
SELECT user,host,authentication_string FROM mysql.user
WHERE user='root' AND host='localhost';
- 测试免密登录:
mysql -uroot -p
- 检查.my.cnf配置文件权限:
ls -l /root/.my.cnf
修复方案:
① 改用配置文件存储密码:
[mysqldump]
user=root
password=你的密码
② 设置配置文件权限:chmod 600 ~/.my.cnf
2. 磁盘爆炸型惨案
#!/bin/bash
# 存储检查示例
backup_dir="/backup"
min_space=10 # 单位GB
available=$(df -BG $backup_dir | awk 'NR==2{print $4}' | tr -d 'G')
if [ $available -lt $min_space ]; then
echo "磁盘空间不足!" | mail -s "备份告警" admin@example.com
exit 1
fi
进阶操作:
增加自动清理旧备份的逻辑:
# 保留最近7天备份
find $backup_dir -name "*.sql.gz" -mtime +7 -exec rm {} \;
3. 语法错误型乌龙
#!/bin/bash
# 时间变量错误示例
mysqldump mydb > backup_$(date +%Y%m%d).sql
报错现象:
生成的文件名变成backup_2021-0-1.sql
(当日期为单数时)
正确姿势:
# 补零格式化日期
mysqldump mydb > backup_$(date +%Y%m%d).sql
4. 锁表大战型悲剧
# 添加锁超时检测
mysqldump --lock-tables --lock-wait-timeout=60 mydb > backup.sql
监控技巧:
在备份时另开窗口执行:
SHOW OPEN TABLES WHERE In_use > 0;
5. 网络抽风型玄学
# 增加网络检测
if ! ping -c 3 storage-server &> /dev/null; then
echo "网络不通!" >&2
exit 1
fi
三、防翻车必备神器
1. 日志分析三板斧
# 记录详细日志
{
echo "==== $(date) ===="
mysqldump mydb | gzip > backup.sql.gz
echo "Exit code: $?"
} >> /var/log/mysql_backup.log 2>&1
日志关键词监控:
- ERROR
- Warning
- failed
2. 邮件报警升级版
# 使用sendmail发送HTML格式报告
{
echo "To: admin@example.com"
echo "Subject: 备份失败告警"
echo "Content-Type: text/html"
echo "<h2>备份任务失败</h2>"
echo "<pre>$(tail -n 20 /var/log/mysql_backup.log)</pre>"
} | sendmail -t
3. 备份验证黑科技
# 自动验证备份文件
if ! gunzip -t backup.sql.gz; then
echo "备份文件损坏!"
exit 1
fi
四、技术选型避坑指南
方案对比:
方案 | 优点 | 缺点 |
---|---|---|
mysqldump | 简单易用,兼容性好 | 大数据量时耗时较长 |
XtraBackup | 热备份,支持增量备份 | 需要额外安装,配置复杂 |
主从复制 | 实时同步,故障恢复快 | 需要额外服务器资源 |
五、血泪教训总结
- 定时任务必须测试:不要相信"这个脚本肯定没问题"
- 监控要比备份更严格:没报警≠没故障
- 恢复演练要常态化:会备份不算本事,能恢复才是真功夫
- 版本控制很重要:备份脚本也要上Git!