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. 恢复完成后,建议重新配置数据库的备份策略,考虑增加增量备份或缩短全量备份间隔
相关推荐
Vect__38 分钟前
MySQL 数据类型和约束:从字段设计到表结构建模
数据库·mysql
张人玉43 分钟前
C# WinForms——工厂管理系统(C# WinForms)
数据库·sqlite·c#·winform
AC赳赳老秦1 小时前
招投标公开数据自动化采集实战:基于 OpenClaw 的定时抓取与业务关键词精准推送
运维·服务器·数据库·自动化·测试用例·deepseek·openclaw
后端优选官2 小时前
上海Agent开发公司:企业级智能体软件的技术架构与落地评估
数据库·人工智能·架构·软件开发·开发经验·上海
JustNow_Man2 小时前
`openspec/config.yaml` 解析与生效机制
数据库
Databend2 小时前
用 QUALIFY 写出更清晰的窗口函数 SQL
数据库·sql·数据分析
数智化管理手记2 小时前
应收应付资金占用过高怎么办?应收应付搭配账龄分析怎么做
大数据·网络·数据库·人工智能·数据挖掘
用户71333585156242 小时前
MySQL - EXPLAIN 执行计划
数据库
这就是佬们吗3 小时前
Python入门③-运算符、条件与循环
开发语言·数据库·vscode·python·pycharm·编辑器
wending-Y3 小时前
Flink 滑动窗口作业 TaskManager RocksDB 状态膨胀 Bug 分析
java·前端·数据库