MySQL数据库恢复步骤(基于全量备份和binlog)

目录

MySQL数据库恢复步骤(基于全量备份和binlog)

前提条件

  1. 已存在昨日凌晨1点的全量备份文件(如:full_backup_20250902.sql
  2. MySQL的binlog日志文件完整且未被清理
  3. 已确认数据库无法启动,需要通过备份恢复

恢复准备工作

  1. 停止当前故障的MySQL服务

    bash 复制代码
    systemctl stop mysqld
  2. 备份当前数据库的数据目录(防止意外)

    bash 复制代码
    mv /var/lib/mysql /var/lib/mysql_bak
  3. 重新初始化MySQL数据目录

    bash 复制代码
    mysqld --initialize --user=mysql

方法一:基于位置的binlog恢复

步骤1:恢复全量备份

bash 复制代码
mysql -u root -p < full_backup_20250902.sql

步骤2:确定binlog恢复起点

查看全量备份文件,找到备份时的binlog位置信息:

bash 复制代码
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文件及位置:

bash 复制代码
mysqlbinlog --base64-output=decode-rows -v /var/log/mysql/binlog.00000* | grep -i "2025-09-03 12:30" -B 10

步骤4:应用binlog日志

bash 复制代码
mysqlbinlog --start-position=154 --stop-position=xxxx /var/log/mysql/binlog.000005 | mysql -u root -p

如果涉及多个binlog文件:

bash 复制代码
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:恢复全量备份

bash 复制代码
mysql -u root -p < full_backup_20250902.sql

步骤2:确定GTID恢复起点

查看全量备份中的GTID信息:

bash 复制代码
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:

bash 复制代码
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

bash 复制代码
vi /etc/my.cnf

添加以下配置:

复制代码
gtid_mode=ON
enforce_gtid_consistency=ON

重启MySQL服务:

bash 复制代码
systemctl restart mysqld

步骤5:应用binlog日志

bash 复制代码
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

恢复后验证

  1. 检查数据库服务状态

    bash 复制代码
    systemctl status mysqld
  2. 登录数据库验证数据完整性

    bash 复制代码
    mysql -u root -p
  3. 执行查询确认关键数据是否恢复到断电前状态

    sql 复制代码
    SELECT COUNT(*) FROM important_table;
    SELECT MAX(updated_at) FROM important_table;
  4. 备份恢复后的数据库

    bash 复制代码
    mysqldump -u root -p --all-databases > post_recovery_backup.sql

注意事项

  1. 基于位置的恢复适用于未启用GTID的环境,需要精确确定每个binlog文件的起始和结束位置
  2. 基于GTID的恢复更简单可靠,推荐在MySQL 8.0环境中使用
  3. 恢复过程中确保binlog文件完整无损
  4. 恢复前建议先在测试环境验证恢复流程和备份文件的有效性
  5. 恢复完成后,建议重新配置数据库的备份策略,考虑增加增量备份或缩短全量备份间隔
相关推荐
科技小花2 分钟前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 分钟前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain5 分钟前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希42 分钟前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神1 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员1 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java1 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿1 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴1 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
YOU OU1 小时前
三大范式和E-R图
数据库