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

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

【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/bashtable_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 ];thenecho "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} ];doecho "-- ${filename} ${maxpagecount}  PAGE NO: ${current_page}" >>ibd_progress_${table_name}.log; current_page=$[ ${current_page} + 1 ]# 指定生成回滚 sqltimeout 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/bashtable_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} ];doecho "-- ${filename} ${maxpagecount}  PAGE NO: ${current_page}" >>ibd_progress_${table_name}.log; current_page=$[ ${current_page} + 1 ]# 指定生成回滚 sqltimeout 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2021年上半年网络工程师考试上午真题
  • git , nvm 快速下载安装包链接
  • 5.4 视图的创建与管理
  • windows调试ios记录
  • CH582M低功耗蓝牙温湿度传感器接入HASS
  • IDS 与 IPS:网络安全的两道防线
  • 数字孪生技术框架:从数据到决策的桥梁
  • Python进阶知识点--总结
  • Vue 生命周期详解含demo、面试常问问题案例
  • Java服务实现多数据源切换
  • HTTPS通讯全过程
  • docker容器引用glibc库
  • spring揭秘06-Autowired自动绑定依赖及组件自动扫描
  • 「Unity3D」属性面板(Inspector)上增删操作,序列化的Dictionary对象的k-v数值
  • 【C语言篇】深入理解指针4(模拟实现qsort函数)
  • [译]Python中的类属性与实例属性的区别
  • 08.Android之View事件问题
  • Angular 2 DI - IoC DI - 1
  • angular2 简述
  • eclipse(luna)创建web工程
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Odoo domain写法及运用
  • ReactNative开发常用的三方模块
  • scala基础语法(二)
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring Boot MyBatis配置多种数据库
  • Spring核心 Bean的高级装配
  • Vim 折腾记
  • 飞驰在Mesos的涡轮引擎上
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 坑!为什么View.startAnimation不起作用?
  • 如何利用MongoDB打造TOP榜小程序
  • 如何使用 JavaScript 解析 URL
  • 实习面试笔记
  • 为视图添加丝滑的水波纹
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • hi-nginx-1.3.4编译安装
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #mysql 8.0 踩坑日记
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (02)vite环境变量配置
  • (13):Silverlight 2 数据与通信之WebRequest
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (第61天)多租户架构(CDB/PDB)
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (九十四)函数和二维数组
  • (六)激光线扫描-三维重建