MySQL 定时备份脚本编写与验证
该文章由AI生成,仅为SEO优化测试,相关内容不保证准确!!!
引言
数据库备份是运维的最后防线,但“写了备份脚本”和“备份可靠”是两回事:脚本可能静默失败、磁盘可能写满、备份文件可能根本恢复不了。本文给出一套可落地的方案:全量 + 增量 + 告警 + 验证。
一、全量备份脚本
核心命令:mysqldump -h127.0.0.1 -u备份用户 -p'密码' --single-transaction --routines --triggers --databases db1 db2 | gzip > /backup/mysql/db_$(date +%F_%H%M).sql.gz。关键参数:--single-transaction 对 InnoDB 一致性快照且不锁表(MyISAM 表仍会锁);--routines/--triggers 包含存储过程与触发器;不要用 --all-databases 顺带备份系统库,按需指定。脚本要点:① 备份用户只授予 SELECT、LOCK TABLES、SHOW VIEW 等最小权限;② gzip 压缩节省 80% 空间;③ 备份后校验文件大小非零、并写入日志;④ 失败时发告警(邮件/钉钉/webhook);⑤ 保留策略:find /backup -name '*.sql.gz' -mtime +30 -delete 自动清理 30 天前的。
二、增量备份:binlog
全量每天一次的话,两次全量之间的数据靠 binlog 补。开启 binlog(8.0 默认开启),用 SHOW BINARY LOGS; 查看列表,配合 mysqlbinlog --start-datetime --stop-datetime binlog文件 > 增量.sql 可恢复任意时间点。备份脚本里把已备份过的 binlog 移到备份目录并 FLUSH LOGS; 轮转,避免主库 binlog 无限增长。恢复流程:先恢复最近全量,再按时间顺序重放 binlog 至故障点前。
三、定时与告警
crontab:0 3 * * * /root/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1(凌晨 3 点低峰执行)。告警三要素:脚本 exit 码非 0 就通知;检查备份文件是否生成且大小合理(如小于上次备份的 50% 就告警——可能是数据异常清空);每周一次“备份文件大小趋势”检查,数据没变化但备份骤减往往意味着连错了库。
四、最重要的:恢复演练
每季度做一次真实恢复:把备份拿到测试机,gunzip < db_xxx.sql.gz | mysql -u root db1 恢复,然后校验关键表行数、抽样数据、应用连上跑一遍核心功能。记录恢复耗时——它决定真实灾难时的 RTO。演练中常见的问题:备份没包含存储过程、字符集不一致导致中文乱码、binlog 起始位点对不上。这些问题平时发现都是小成本,灾难时发现就是大事。
总结
备份可靠性四要素:--single-transaction 保证一致性、全量+binlog 覆盖任意时间点、失败告警与保留策略自动化、季度恢复演练验证。做齐这四项,数据安全才真正有底。