当前位置: 首页 > ops >正文

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

目录

  • MySQL数据库恢复步骤(基于全量备份和binlog)
    • 前提条件
    • 恢复准备工作
    • 方法一:基于位置的binlog恢复
      • 步骤1:恢复全量备份
      • 步骤2:确定binlog恢复起点
      • 步骤3:确定binlog恢复终点
      • 步骤4:应用binlog日志
    • 方法二:基于GTID的binlog恢复
      • 步骤1:恢复全量备份
      • 步骤2:确定GTID恢复起点
      • 步骤3:确定GTID恢复终点
      • 步骤4:配置MySQL启用GTID
      • 步骤5:应用binlog日志
    • 恢复后验证
    • 注意事项

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

前提条件

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

恢复准备工作

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

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

    mv /var/lib/mysql /var/lib/mysql_bak
    
  3. 重新初始化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

恢复后验证

  1. 检查数据库服务状态

    systemctl status mysqld
    
  2. 登录数据库验证数据完整性

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

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

    mysqldump -u root -p --all-databases > post_recovery_backup.sql
    

注意事项

  1. 基于位置的恢复适用于未启用GTID的环境,需要精确确定每个binlog文件的起始和结束位置
  2. 基于GTID的恢复更简单可靠,推荐在MySQL 8.0环境中使用
  3. 恢复过程中确保binlog文件完整无损
  4. 恢复前建议先在测试环境验证恢复流程和备份文件的有效性
  5. 恢复完成后,建议重新配置数据库的备份策略,考虑增加增量备份或缩短全量备份间隔
http://www.xdnf.cn/news/19761.html

相关文章:

  • 揭秘ArrowJava核心:IndexSorter高效排序设计
  • Cookie、Session、登录
  • 一个工业小白眼中的 IT/OT 融合真相:数字化工厂的第一课
  • SQL Server核心架构深度解析
  • AlexNet:计算机视觉的革命性之作
  • PostgreSQL性能调优-优化你的数据库服务器
  • JVM调优与常见参数(如 -Xms、-Xmx、-XX:+PrintGCDetails) 的必会知识点汇总
  • 【学Python自动化】 9.1 Python 与 Rust 类机制对比学习笔记
  • 【WPS】WPSPPT 快速抠背景
  • 通过SpringCloud Gateway实现API接口镜像请求(陪跑)网关功能
  • 进攻是最好的防守 在人生哲学中的应用
  • 百度智能云「智能集锦」自动生成短剧解说,三步实现专业级素材生产
  • 以太坊网络
  • Spring Boot中MyBatis Plus的LambdaQueryWrapper查询异常排查与解决
  • 外网获取瀚高.NET驱动dll方法和使用案例
  • Axure文件上传高保真交互原型:实现Web端真实上传体验
  • NodeJS配置镜像仓局
  • k8s的SidecarSet配置和initContainers
  • 【明道云】[工作表控件4] 邮箱控件的输入校验与业务应用
  • RAG|| LangChain || LlamaIndex || RAGflow
  • HTML `<datalist>`:原生下拉搜索框,无需 JS 也能实现联想功能
  • 用 “走楼梯” 讲透动态规划!4 个前端场景 + 4 道 LeetCode 题手把手教
  • 戴尔笔记本电池健康度检测、无电池开机测试与更换电池全流程记录
  • 孩子玩手机都近视了,怎样限制小孩的手机使用时长?
  • 你只需输入一句话,MoneyPrinterTurbo直接给你输出一个视频
  • 小说、漫剧小程序系统开发:独立部署,源码交付
  • SpringBoot Web 入门指南:从零搭建第一个SpringBoot程序
  • 【leetcode】200. 岛屿数量
  • 有限元方法中的数值技术:预处理共轭梯度法 PCG (2)
  • 【Cursor-Gpt-5-high】StackCube-v1 任务训练结果不稳定性的分析