【MySQL核心】MySQL 数据恢复-ibd2sql

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【MySQL核心】MySQL 数据恢复-ibd2sql

简介

ibd2sql 是一个将 MySQL ibd 文件解析成 SQL 语句的工具,它可以解析出建表语句和 SQL 语句,并且支持 MySQL8.* 和 MySQL5.* 版本。可以解析损坏的 ibd 文件来获取可用的信息,这对于数据表损坏的场景非常友好。接下来一起了解下他的神奇功能。

项目地址:https://github.com/ddcw/ibd2sql

注意: 执行操作前先请备份数据,注意磁盘空间大小

安装

  • 在使用项目前,请安装 python3

windows 可以直接下载:https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip

linux:

# 安装python 3
yum install -y python3
# 下载安装包
wget https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip
# 解压
unzip main.zip
# 进入安装目录
cd ibd2sql-main

详细参数可以参见如下连接:

https://github.com/ddcw/ibd2sql/blob/e571766b00f3b728ecbcbc7a7f612bc8e04715dd/docs/USAGE.md

使用

ibd2sql 原生支持 mysql8.0 对于 mysql5.6/5.7 的文件解析也需要依赖 mysql8.0 的 ibd 文件来解析出建表语句。

也就是说当你要解析 mysql5.6/5.7 的 ibd 文件时,需要先在 mysql8.0 的实例中创建需要恢复的表,ibd2sql 需要使用新建表的 ibd 文件来解析出建表信息(用来支持获取insert 语句)。

这里就有一个问题了,如果你没有建表语句是不是就不能使用 ibd2sql 了? 你可以使用 dbsake 工具来获取 mysql 5.* 版本的建表语句。可以看我写的 dbsake 的文章来获取用法。注意不要使用 mysqlfrm 工具,可能存在解析的数据字段长度不精确,获取时间字段有问题等问题。

用法(mysql 8.0)

解析表结构
python3 main.py xxx.ibd --ddl
  • –ddl 获取建表语句
解析表数据
python3 main.py xxx.ibd --sql
  • –sql 获取 insert 数据
解析表结构和数据
python3 main.py xxx.ibd --ddl --sql
解析误删的数据
python3 main.py xxx.ibd --sql --delete
  • –delete 获取误删数据
解析分区表

分区表需要指定元数据信息

python3 main.py --sdi-table /your_path/ddcw_partition_range#p#p0.ibd   /your_path/ddcw_partition_range#p#p1.ibd --sql
  • –sdi-table 指定存储建表语句的 ibd 文件 后面跟要恢复的文件

用法(mysql 5.6/5.7)

mysql 5.6/5.7 需要先用 dbsake 工具获取建表语句并导入到 mysql8.0 中,用来给ibd2sql获取元数据信息。

# 提取ddl
dbsake frmdump test.frm 
# 导入 MySQL 8 
dbsake frmdump test.frm  |mysql 
# 解析
python3 main.py --sdi-table /your_mysq8_path/ddcw_alltype_table.ibd /your_mysql5_path/ddcw_alltype_table.ibd  --sql --mysql5
  • –sdi-table 指定 mysql8 的 ibd 文件
  • –mysql5 代表恢复的是 MySQL 5 版本的数据

针对 ibd 文件损坏的场景(重点)

对于 ibd 文件损坏的场景,可以使用按数据页进行解析。

mysql8
python3 main.py /your_path/test.ibd  --sql --page-start 1000 --page-count 1 2>/dev/null
  • /your_path/test.ibd 你的需要恢复的 ibd 文件路径
  • –sql 解析成 SQL
  • –page-start 指定开始解析的页数
  • –page-count 指定向后解析多少页
mysql5
python3 main.py  --sdi-table /your_mysql8_path/test.ibd    /your_mysql5_path/test.ibd  --sql --page-start 1000 --page-count 1  2>/dev/null
  • –sdi-table 指定 mysql8 的 ibd 文件
  • /your_mysql5_path/test.ibd 你的需要恢复的 ibd 文件
  • –page-start 指定开始解析的页数
  • –page-count 指定向后解析多少页

ibd 文件损坏实战(mysql5)

使用两个脚本来并发解析损坏的 ibd 文件,主脚本用来计算数据页数量,按照空闲的 CPU 核心数开启 N 个批处理子脚本。

使用前请安装 mysql8 的实例,用来创建表。

使用前请安装 dbsake 命令,用来生成表 ,以下链接获取。

https://blog.csdn.net/weixin_45385457/article/details/141135847

vim ibd2sql.sh

#!/bin/bash
table_name="$1"                                           # 要解析的表名
old_data_path="/data1/mysql-5.6.16-winx64/data_old/test"  # 老的数据库路径(保存 ibd 文件的库路径)
mysql8_data_path="/mydata/3309/test"                      # 新的 mysql8 的 路径(保存 ibd 文件的库路径)
mysql8_conn="/usr/local/mysql/mysql80/bin/mysql -S /mydata/3309/mysql.sock test " # mysql8 连接信息
output_path=/tmp/table_data                               # 输出 .sql 文件的路径
filename="${table_name}.ibd"
>${output_path}/${table_name}.sql
# dbsake 获取表结构  sed 过滤后 导入 mysql8
/usr/local/bin/dbsake frmdump ${old_data_path}/${table_name}.frm |sed  's#datetime DEFAULT NULL#datetime null DEFAULT NULL#g'|sed  's#timestamp DEFAULT NULL#datetime null DEFAULT NULL#g'  ${mysql8_conn}
if [ $? -ne 0 ];then
    echo "MySQL 表结构导入失败"
    exit
fi
sleep 1 
# 指定 mysql8 的 ibd 文件生成建表语句
python3 main.py ${mysql8_data_path}/${filename} --ddl  >>${output_path}/${table_name}.sql
# 计算文件大小
filesize=`stat -c %s ${old_data_path}/${filename}`
# 获取数据页数量
maxpagecount=$[ ${filesize} / 16384 ]
current_page=1
# 循环数据页
while [ ${current_page} -le ${maxpagecount} ];do
  echo "-- ${filename} ${maxpagecount}  PAGE NO: ${current_page}" >>ibd_progress_${table_name}.log; 
  current_page=$[ ${current_page} + 1 ]
  
  # 指定生成回滚 sql
  timeout 2s python3 main.py  --sdi-table  ${mysql8_data_path}/${filename}  ${old_data_path}/${filename} --sql --mysql5 --page-start ${current_page} --page-count 1  >>${output_path}/${table_name}.sql
done

ibd 文件损坏实战(mysql8)

同上,只是不需要 dbsake 和安装其他实例了,可以直接解析 ibd 文件。

vim ibd2sql.sh

#!/bin/bash
table_name="$1"                              # 要解析的表名
old_data_path="/data1/mysql8/data_old/test"  # 老的数据库路径(保存 ibd 文件的库路径)
output_path=/tmp/table_data                  # 输出 .sql 文件的路径
filename="${table_name}.ibd"
>${output_path}/${table_name}.sql
# 指定 mysql8 的 ibd 文件生成建表语句
python3 main.py ${old_data_path}/${filename} --ddl  >>${output_path}/${table_name}.sql
# 计算文件大小
filesize=`stat -c %s ${old_data_path}/${filename}`
# 获取数据页数量
maxpagecount=$[ ${filesize} / 16384 ]
current_page=1
# 循环数据页
while [ ${current_page} -le ${maxpagecount} ];do
  echo "-- ${filename} ${maxpagecount}  PAGE NO: ${current_page}" >>ibd_progress_${table_name}.log; 
  current_page=$[ ${current_page} + 1 ]
  
  # 指定生成回滚 sql
  timeout 2s python3 main.py  ${old_data_path}/${filename} --sql --page-start ${current_page} --page-count 1  >>${output_path}/${table_name}.sql
done

运行

sh ibd2sql.sh 
# 后台运行更稳定 nohup &

完整解决方案参见:https://blog.csdn.net/weixin_45385457/article/details/141136121


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
SQL 存储 缓存
浅析MySQL中的SQL执行过程
本文探讨了MySQL的体系结构、SQL执行流程及SQL执行时间分析方法。首先介绍了MySQL由连接层、SQL层和存储引擎层构成;接着详细描述了SQL从客户端发送到服务器执行的具体流程;最后,通过启用profiling功能,展示了如何分析SQL执行时间,并说明了MySQL 8.0版本后移除查询缓存的原因。
浅析MySQL中的SQL执行过程
|
23天前
|
SQL 关系型数据库 MySQL
【MySQL】根据binlog日志获取回滚sql的一个开发思路
【MySQL】根据binlog日志获取回滚sql的一个开发思路
|
23天前
|
SQL 关系型数据库 MySQL
在MySQL中,什么是结构化查询语言 (SQL)
【8月更文挑战第20天】在MySQL中,什么是结构化查询语言 (SQL)
30 1
|
23天前
|
编解码 缓存 关系型数据库
【MySQL 核心】MySQL数据恢复-dbsake
【MySQL 核心】MySQL数据恢复-dbsake
|
19天前
|
SQL 关系型数据库 MySQL
【MySQL 慢查询秘籍】慢SQL无处遁形!实战指南:一步步教你揪出数据库性能杀手!
【8月更文挑战第24天】本文以教程形式深入探讨了MySQL慢SQL查询的分析与优化方法。首先介绍了如何配置MySQL以记录执行时间过长的SQL语句。接着,利用内置工具`mysqlslowlog`及第三方工具`pt-query-digest`对慢查询日志进行了详细分析。通过一个具体示例展示了可能导致性能瓶颈的查询,并提出了相应的优化策略,包括添加索引、缩小查询范围、使用`EXPLAIN`分析执行计划等。掌握这些技巧对于提升MySQL数据库性能具有重要意义。
50 1
|
24天前
|
SQL 关系型数据库 MySQL
MySQL中的基本SQL语句
以上列举的是MySQL中的一些基础而重要的SQL语句。它们不仅提供了数据操作的方法,同时也涵盖了数据库、表结构的变更,数据的增删改查,结果的排序和聚合,索引的管理以及用户权限的控制等方面。掌握这些基本的SQL语句对于任何使用MySQL的开发者来说是非常必要的。在实际应用中,由于项目要求和数据复杂性的不同,可能需要将这些基础语句组合起来使用,或者与函数、存储过程和触发器等高级功能一起配合使用,以实现各种复杂的业务逻辑。
37 2
|
11天前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
27 0
|
11天前
|
SQL 关系型数据库 MySQL
|
11天前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
70 0
|
21天前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
90 2