目录
MySQL数据库恢复步骤(基于全量备份和binlog)
前提条件
- 已存在昨日凌晨1点的全量备份文件(如:
full_backup_20250902.sql
) - MySQL的binlog日志文件完整且未被清理
- 已确认数据库无法启动,需要通过备份恢复
恢复准备工作
停止当前故障的MySQL服务
systemctl stop mysqld
备份当前数据库的数据目录(防止意外)
mv /var/lib/mysql /var/lib/mysql_bak
重新初始化MySQL数据目录
mysqld --initialize --user=mysql
方法一:基于位置的binlog恢复
步骤1:恢复全量备份
mysql -u root -p < full_backup_20250902.sql
步骤2:确定binlog恢复起点
查看全量备份文件,找到备份时的binlog位置信息:
grep "CHANGE MASTER TO MASTER_LOG_FILE" full_backup_20250902.sql
输出示例:
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000005', MASTER_LOG_POS=154;
记录下文件名binlog.000005
和位置154
步骤3:确定binlog恢复终点
找到断电前的最后一个binlog文件及位置:
mysqlbinlog --base64-output=decode-rows -v /var/log/mysql/binlog.00000* | grep -i "2025-09-03 12:30" -B 10
步骤4:应用binlog日志
mysqlbinlog --start-position=154 --stop-position=xxxx /var/log/mysql/binlog.000005 | mysql -u root -p
如果涉及多个binlog文件:
mysqlbinlog --start-position=154 /var/log/mysql/binlog.000005 | mysql -u root -p
mysqlbinlog /var/log/mysql/binlog.000006 | mysql -u root -p
mysqlbinlog --stop-position=xxxx /var/log/mysql/binlog.000007 | mysql -u root -p
方法二:基于GTID的binlog恢复
步骤1:恢复全量备份
mysql -u root -p < full_backup_20250902.sql
步骤2:确定GTID恢复起点
查看全量备份中的GTID信息:
grep "SET @@GLOBAL.GTID_PURGED" full_backup_20250902.sql
输出示例:
SET @@GLOBAL.GTID_PURGED='c7a7e543-5e2c-11ed-8a1e-00155d000000:1-100';
记录下GTID集合c7a7e543-5e2c-11ed-8a1e-00155d000000:1-100
步骤3:确定GTID恢复终点
查看断电前的最后一个GTID:
mysqlbinlog --base64-output=decode-rows -v /var/log/mysql/binlog.00000* | grep -i "2025-09-03 12:30" -B 20 | grep "GTID"
步骤4:配置MySQL启用GTID
vi /etc/my.cnf
添加以下配置:
gtid_mode=ON
enforce_gtid_consistency=ON
重启MySQL服务:
systemctl restart mysqld
步骤5:应用binlog日志
mysql -u root -p -e "SET @@SESSION.SQL_LOG_BIN=0; SET @@GLOBAL.GTID_PURGED=''; SET @@GLOBAL.GTID_PURGED='c7a7e543-5e2c-11ed-8a1e-00155d000000:1-100';"
mysqlbinlog --include-gtids='c7a7e543-5e2c-11ed-8a1e-00155d000000:101-xxxx' /var/log/mysql/binlog.000005 /var/log/mysql/binlog.000006 | mysql -u root -p
恢复后验证
检查数据库服务状态
systemctl status mysqld
登录数据库验证数据完整性
mysql -u root -p
执行查询确认关键数据是否恢复到断电前状态
SELECT COUNT(*) FROM important_table; SELECT MAX(updated_at) FROM important_table;
备份恢复后的数据库
mysqldump -u root -p --all-databases > post_recovery_backup.sql
注意事项
- 基于位置的恢复适用于未启用GTID的环境,需要精确确定每个binlog文件的起始和结束位置
- 基于GTID的恢复更简单可靠,推荐在MySQL 8.0环境中使用
- 恢复过程中确保binlog文件完整无损
- 恢复前建议先在测试环境验证恢复流程和备份文件的有效性
- 恢复完成后,建议重新配置数据库的备份策略,考虑增加增量备份或缩短全量备份间隔