Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[ibd2sql] ibd2sql v1.7发布(支持drop表的恢复)

[ibd2sql] ibd2sql v1.7发布(支持drop表的恢复)

原创
作者头像
大大刺猬
发布于 2024-10-29 06:17:24
发布于 2024-10-29 06:17:24
4790
举报
文章被收录于专栏:大大刺猬大大刺猬

导读

ibd2sql 是解析mysql的ibd文件的工具.....

使用场景:

  1. 不小心 delete 数据了怎么办?
  2. 不小心 drop 表怎么办?
  3. 数据库死活起不来怎么办?

备份是十分重要的, 但往往存在没得备份/备份失效的场景, 这时候就是可以使用ibd2sql 来恢复数据了.

v1.7版本说明

下载地址:

https://github.com/ddcw/ibd2sql/archive/refs/tags/v1.7.tar.gz

https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip

功能更新:

  1. 支持压缩页的解析(zlib&lz4)
  2. 支持drop表的恢复 3. 加密页的支持(要求keyring file选项, 所以下个大版本再更新)

若现在就有加密表的解析的需求的话, 可以先参考: https://www.modb.pro/db/1839571466908610560

BUG修复:

  1. varchar <=255 时使用1bytes存储大小
  2. ucs2,utf16,utf32 字符集支持
  3. instant nullable计算方式.(_COLUMN_COUNT之前没写完.)

其它:

  1. ibd2sql/innodb_page_sdi.py中的COLUMN_COLL默认值设置为True, 即默认显示字段字符集(若字段字符集和表不一致的话)

drop表的恢复 演示

本次主要演示新增功能:drop表的恢复. (压缩表是自动解析的,使用者无需关注,也就不方便演示了....)

下载安装ibd2sql

代码语言:shell
AI代码解释
复制
#yum install python3 -y
wget https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip
unzip main.zip
cd ibd2sql-main

准备测试表并删除

不要在生产环境测试!

代码语言:sql
AI代码解释
复制
select * from db1.t20241028;
checksum table db1.t20241028;
drop table db1.t20241028;

于是我们就没有了那张表....

扫描磁盘

扫描对应文件所在目录 所在的文件系统, 得到误删表的inode号, 我这里知道了表名字,就直接grep了.

150GB的文件系统扫描起来可能得花个几分钟

代码语言:shell
AI代码解释
复制
df -hT /data/mysql_3314/mysqldata/db1
python3 xfs_recovery_v0.2.py /dev/mapper/centos-root

于是我们就得到了被删除表的inode:270238132

根据inode恢复文件

代码语言:shell
AI代码解释
复制
# 查看inode=270238132文件的详情, 比如大小(extent_size)之类的
python3 xfs_recovery_v0.2.py /dev/mapper/centos-root 270238132

# 恢复inode=270238132文件到 /tmp/t20241028.ibd
python3 xfs_recovery_v0.2.py /dev/mapper/centos-root 270238132 /tmp/t20241028.ibd

根据ibd文件恢复数据

既然得到了ibd文件,那么恢复数据就简单了.

方法1(推荐)

代码语言:shell
AI代码解释
复制
# 提取DDL, 并在数据库创建一样的表, 然后导入该表空间/数据文件/ibd
python3 main.py /tmp/t20241028.ibd 
python3 main.py /tmp/t20241028.ibd | mysql -h127.0.0.1 -P3314 -p123456
mysql -h127.0.0.1 -P3314 -p123456 -e 'alter table db1.t20241028 discard tablespace'
cp -ra /tmp/t20241028.ibd /data/mysql_3314/mysqldata/db1
chown mysql:mysql /data/mysql_3314/mysqldata/db1/t20241028.ibd
mysql -h127.0.0.1 -P3314 -p123456 -e 'alter table db1.t20241028 import tablespace'

# 验证
mysql -h127.0.0.1 -P3314 -p123456 -e 'select * from db1.t20241028;'
mysql -h127.0.0.1 -P3314 -p123456 -e 'checksum table db1.t20241028;'

方法2

方法1看起来还是太麻烦了, 所以我们可以使用简单点的方法2

代码语言:shell
AI代码解释
复制
# 提取出ddl和dml并导入数据库
mysql -h127.0.0.1 -P3314 -p123456 -e 'drop table db1.t20241028' # 清除方法1的数据
python3 main.py /tmp/t20241028.ibd --ddl --sql | mysql -h127.0.0.1 -P3314 -p123456
mysql -h127.0.0.1 -P3314 -p123456 -e 'select * from db1.t20241028;'

方法2就简单多了. 一步到位.

总结

被drop的表不一定能恢复, 所以还是要做好备份.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[pymysqlbinlog] v0.1 发布 离线 解析/分析 MYSQL BINLOG
pymysqlbinlog 是分析/解析binlog的开源工具, 使用GPL-3.0 license
大大刺猬
2024/05/04
3990
[pymysqlbinlog] v0.1 发布  离线 解析/分析 MYSQL BINLOG
[MYSQL] 数据恢复, 无备份, 只剩一个 ibd 文件 怎么恢复数据?
不小心删除了mysql数据目录, 但还剩个.ibd文件在. 没得备份, 没得binlog , 要恢复这个ibd文件里面的数据.
大大刺猬
2024/04/10
3.9K1
[MYSQL] 数据恢复, 无备份, 只剩一个 ibd 文件 怎么恢复数据?
MySQL离线ibd数据恢复工具 - ibd2sql
有了ibd2sql,就多了一张保命符。下次遇到类似情况,别忘了这个强大的工具。它可能会帮您化险为夷,保住饭碗!
贺春旸的技术博客
2024/07/20
4990
[MYSQL] 恢复加密的mysql表
通常我们不会在mysql层面上使用加密插件, 虽然加密之后会比较安全, 但加密太耗时了, 而且key一旦丢了, 就GG了. 而且数据库服务器通常不会对外提供服务, 即使对外提供服务,也有权限验证的. 总的来说,数据库层加密有丢丢鸡肋.
大大刺猬
2024/11/12
3420
[MYSQL] 恢复加密的mysql表
[ibd2sql] 偷偷更新ibd2sql到v1.3 (支持mysql 5.7)
本来准备做二级分区的DDL的, 但是看了下, WC, 太复杂了. 而且分区表用得也不多. 还不如更新支持 mysql5.7
大大刺猬
2024/05/11
4260
[ibd2sql] 偷偷更新ibd2sql到v1.3 (支持mysql 5.7)
[ibd2sql] ibd2sql v1.0 发布 & ibd文件结构说明
修复了一些之前的问题, 比如做过online ddl (instant)的表解析的时候就需要注意record header的第2bit 标记位.
大大刺猬
2024/01/09
1.1K0
[ibd2sql] ibd2sql v1.0 发布 & ibd文件结构说明
使用ibd2sql解析ibd文件生成 DDL和DML
ibd2sql是解析mysql 8.0的ibd文件, 并生成DDL和DML, 还支持解析出被删除的数据(当然也可以解析binlog来实现)
大大刺猬
2023/04/27
2.4K6
使用ibd2sql解析ibd文件生成 DDL和DML
[ibd2sql] mysql数据恢复案例002 -- 解析mysql 5.7的表超过38个字段之后的小BUG(已修复)
前不久, 我们的ibd2sql支持直接解析mysql 5.7的数据文件了, 不需要建个8.0环境提供sdi信息了, 我们直接解析frm文件来得到元数据信息. 噢, 这么方便? 那么代价是什么呢? 可能会遇到一些小小的bug... 呆胶布, 已修复.
大大刺猬
2025/04/04
1080
[ibd2sql] mysql数据恢复案例002 -- 解析mysql 5.7的表超过38个字段之后的小BUG(已修复)
MySQL 灾难恢复利器:ibd2sql
ibd2sql 是一个使用纯 Python 3 编写的工具,用于离线解析 MySQL InnoDB 存储引擎的 IBD 文件,并将其转换为 SQL 语句。该工具无需任何第三方依赖包,使用 GPL-3.0 许可证发布。
DBA实战
2024/10/10
3100
MySQL 灾难恢复利器:ibd2sql
ibd2sql v0.2 解析ibd文件为SQL
源码: https://github.com/ddcw/ibd2sql/archive/refs/tags/v0.2.tar.gz
大大刺猬
2023/08/30
1.5K2
ibd2sql v0.2  解析ibd文件为SQL
[ibd2sql] mysql数据恢复案例003 -- 有坏块的表怎么解析?
数据文件是5.7环境的, 现在ibd2sql不再需要转换到8.0环境即可解析. 于是我们使用如下命令解析:
大大刺猬
2025/04/22
2280
[ibd2sql] mysql数据恢复案例003 -- 有坏块的表怎么解析?
[MYSQL] show engine innodb status中的死锁 分析
很久以前(也才2年)写过一个解析innodb_status的脚本. 看起来像那么回事, 其实就是做了个翻译和总结.
大大刺猬
2024/08/26
9690
[MYSQL] show engine innodb status中的死锁 分析
借助 dbsake 和 ibd2sql 恢复宕机后起不来的 MySQL 5.7 数据库
对于 MySQL 5.7 的数据恢复,我们可以借助 dbsake 和 ibd2sql 这两个强大的工具来完成。这个方法不仅可以恢复表结构,还能恢复数据,是一个相当完整的解决方案。下面是详细步骤:
贺春旸的技术博客
2024/07/22
5131
[MYSQL] mysql数据导入报错主键冲突 ERROR 1062 (23000) at line 38: Duplicate entry
首先怀疑是导出的.sql文件里面数据存在重复.我们可以根据主键/报错的行 找到重复的数据. 发现是唯一的.
大大刺猬
2024/07/26
4330
[MYSQL] REDUNDANT行格式的数据解析
mysql的行格式有4种,REDUNDANT,COMPACT,DYNAMIC和COMPRESSED. 最常用的就是DYNAMIC, 也是mysql默认的行格式(很早只有REDUNDANT). 该行格式虽然复杂一点, 但是支持的索引前缀可达3072字节.(REDUNDANT只支持到768字节).
大大刺猬
2024/12/06
2960
[MYSQL] REDUNDANT行格式的数据解析
MYSQL INNODB ibd文件详解 (2) 提取DDL和DML
mysql数据和索引是放一起的, 主键索引记录主键值和剩余字段值, 二级索引(普通索引)记录 索引值和主键值.
大大刺猬
2023/04/24
1.2K1
MYSQL INNODB ibd文件详解 (2)  提取DDL和DML
[MYSQL] mysqldump导出进度查看脚本
之前写了mysqld导入进度查看脚本. https://www.modb.pro/db/1760934208826593280
大大刺猬
2024/06/05
4200
[MYSQL] mysqldump导出进度查看脚本
[MYSQL案例][013] mysqldump报错 Error 1412: Table definition has changed
mysqldump: Error 1412: Table definition has changed, please retry transaction when dumping table `t20230811_0` at row:0
大大刺猬
2023/08/11
2.1K0
[MYSQL案例][013] mysqldump报错 Error 1412: Table definition has changed
[Linux&MYSQL] xfs文件系统浅析 -- 恢复drop的表
我们知道ibd2sql可以解析ibd文件从而恢复mysql的数据, 但没得ibd文件的时候又该怎么办呢? (哎呀, 不小心drop了表, 又没得备份!)
大大刺猬
2024/10/15
4522
[Linux&MYSQL]  xfs文件系统浅析 -- 恢复drop的表
[MYSQL] frm2sdi (2) sdi内容讲解
除了在数据字典中有元数据信息外, mysql还在ibd里面存储了该数据文件对应的表的元数据信息.这部分信息就叫做 Serialized Dictionary Information (SDI). 数据格式是我们常见的json格式.
大大刺猬
2025/01/20
3390
推荐阅读
相关推荐
[pymysqlbinlog] v0.1 发布 离线 解析/分析 MYSQL BINLOG
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档