数据库备份是最后一道防线,平时不验证,恢复时才发现备份无效的案例并不少见。MySQL运维要求同时具备全量备份、增量备份与时间点恢复(PITR)三种能力。本文给出备份类型选型、mysqldump与物理备份操作、binlog时间点恢复的完整步骤,以及一套可自动化的备份恢复方案。
备份类型与恢复目标(RPO/RTO)
按数据状态分:冷备(停止服务备份)、热备(在线备份)、温备(部分锁定写操作)。按内容分:逻辑备份(SQL语句)与物理备份(数据文件)。生产环境用物理热备,主从场景用binlog补充增量。恢复目标事先定义:RPO是允许丢失的数据量(生产常要求10分钟以内),RTO是恢复耗时,所有方案围绕这两个数字设计。
逻辑备份与物理备份怎么选
mysqldump生成SQL文件,可跨版本迁移,但大数据量恢复慢:
mysqldump --single-transaction --master-data=2 -uroot -p dbname > /backup/db_full.sql
–single-transaction基于InnoDB一致性快照不锁表;–master-data=2记录binlog位置,配合增量恢复。物理备份用xtrabackup:
xtrabackup --backup --target-dir=/backup/full/
xtrabackup --prepare --target-dir=/backup/full/
xtrabackup --copy-back --target-dir=/backup/full/
生产建议每天物理全备、binlog实时归档,两者组合覆盖窗口。备份文件保留周期:7天全量+30天binlog,用对象存储异地冗余。
基于binlog的时间点恢复(PITR)
误删数据时恢复到误删前一刻。步骤:找最近一次全备的binlog坐标,用mysqlbinlog截取增量SQL,再应用到实例:
mysqlbinlog --start-position=123456 --stop-datetime='2026-09-18 10:00:00' binlog.000102 > /backup/inc.sql
mysql -uroot -p dbname < /backup/db_full.sql
mysql -uroot -p dbname < /backup/inc.sql
binlog_format=ROW时,mysqlbinlog输出带base64事件,加–base64-output=decode-rows -v可读。恢复前先复制一份到临时实例验证,不要直接在生产库执行。binlog过期时间expire_logs_days要根据RPO要求设置,确保归档覆盖恢复窗口。
恢复演练与备份验证
备份没有恢复演练等于没有。每月至少一次演练:在临时实例恢复全量+增量,比对表行数与抽样数据并计时。
mysql -uroot -p news_db -e "SELECT COUNT(*) FROM orders;"
mysql -uroot -p news_db -e "SELECT * FROM orders WHERE id=10086;"
恢复后行数与源库快照记录一致才通过。演练结果记录在案,恢复操作SOP随版本更新。备份文件检查完整性:生成后校验文件大小、执行mysqlcheck与checksum,防止静默损坏。
备份自动化与告警
crontab调度脚本,执行后记录日志并推送监控:
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
# backup.sh: 全量备份 + 归档binlog + 校验文件完整性
备份任务失败立即告警,每日确认三件事:备份已生成、文件大小正常、checksum一致。恢复能力是演练出来的,不是备份出来的,定期演练比加备份频率更有效。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/mysql-shu-ju-ku-bei-fen-hui-fu-shi-zhan-quan-liang-bei-fen/