mysql备份恢复需按场景选逻辑/物理备份及binlog,逻辑备份用mysqldump加–single-transaction等参数,物理备份用xtrabackup,binlog必须开启并归档,恢复前须校验备份有效性并实操演练。

MySQL 数据备份与恢复不是单纯执行几个命令,关键在于理解不同场景下该用什么方式、备份什么内容、如何验证有效性,以及恢复时是否影响业务。
一、明确备份目标和类型
备份前先确认:要防误删?防硬件故障?还是为迁移或测试准备?不同类型决定策略:
- 逻辑备份(如 mysqldump):导出 SQL 语句,兼容性好、可读性强,适合中小数据量、跨版本迁移或需部分恢复的场景;但大库耗时长、锁表风险高(除非加
--single-transaction)。 - 物理备份(如 Percona XtraBackup 或 mysqlbackup):直接复制数据文件,速度快、支持热备,适合 TB 级生产库;但要求 MySQL 版本和配置高度一致,恢复时必须停机或使用专用流程。
- 二进制日志(binlog):不是独立备份,但必不可少——它记录所有数据变更,配合全量备份可实现任意时间点恢复(PITR)。务必开启并定期归档。
二、执行可靠全量备份
以常用逻辑备份为例,推荐生产环境基础命令(InnoDB 表):
mysqldump --single-transaction --routines --triggers --events --all-databases -u root -p > full_backup_$(date +%F_%H%M).sql
说明:
-
--single-transaction利用 MVCC 实现不锁表,前提是所有表都是 InnoDB; -
--routines和--triggers确保存储过程、函数、触发器也被导出; - 备份后立即校验:用
head -n 20看开头是否有CREATE DATABASE,用tail -n 20看结尾是否含UNLOCK tableS或COMMIT; - 存放到非数据库服务器的独立位置,并记录备份时间、大小、校验和(如
sha256sum full_backup_*.sql)。
三、开启并管理 binlog 实现增量恢复
检查是否启用 binlog:
mysql -u root -p -e "SHOW varIABLES LIKE 'log_bin';"
若为 OFF,需在 my.cnf 中添加:
[mysqld]<br>log-bin = /var/lib/mysql/mysql-bin<br>expire_logs_days = 7<br>max_binlog_size = 100M
重启 MySQL 后,定期归档旧 binlog(勿直接删除):
- 用
mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001 | head -30查看内容是否可读; - 恢复前先用
mysqlbinlog --stop-datetime="2024-06-15 14:30:00" mysql-bin.000002提取指定时段日志; - 建议配合脚本自动轮转、压缩、异地同步 binlog 文件。
四、模拟恢复:从全备+binlog 还原到故障前一秒
恢复不是“有备份就能用”,必须实操验证。典型步骤:
- 停止应用,确保无新写入;
- 新建空实例或清空测试库;
- 导入全量备份:
mysql -u root -p ; - 定位故障时间点,找到对应 binlog 文件及 position(可用
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001 | grep -A 2 -B 2 "DROP TABLE"辅助); - 重放 binlog 到故障前:
mysqlbinlog --stop-position=12345678 mysql-bin.000001 | mysql -u root -p; - 启动应用,核对关键业务表数据一致性(如订单数、账户余额)。
不复杂但容易忽略:备份脚本要加错误判断、失败告警;恢复流程写成文档并每季度演练一次;binlog 的 server-id 必须唯一,主从环境下尤其注意。