背景: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

排查步骤

  1. 手动执行脚本,观察报错
  2. 检查mysql.user表权限:
SELECT user,host,authentication_string FROM mysql.user 
WHERE user='root' AND host='localhost';
  1. 测试免密登录:mysql -uroot -p
  2. 检查.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 热备份,支持增量备份 需要额外安装,配置复杂
主从复制 实时同步,故障恢复快 需要额外服务器资源

五、血泪教训总结

  1. 定时任务必须测试:不要相信"这个脚本肯定没问题"
  2. 监控要比备份更严格:没报警≠没故障
  3. 恢复演练要常态化:会备份不算本事,能恢复才是真功夫
  4. 版本控制很重要:备份脚本也要上Git!