暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 大大刺猬 2024-10-29
186

导读

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

#yum install python3 -y wget https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip unzip main.zip cd ibd2sql-main
复制

准备测试表并删除

不要在生产环境测试!

select * from db1.t20241028; checksum table db1.t20241028; drop table db1.t20241028;
复制

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

扫描磁盘

扫描对应文件所在目录 所在的文件系统, 得到误删表的inode号, 我这里知道了表名字,就直接grep了.
150GB的文件系统扫描起来可能得花个几分钟

df -hT /data/mysql_3314/mysqldata/db1 python3 xfs_recovery_v0.2.py /dev/mapper/centos-root
复制

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

根据inode恢复文件

# 查看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
复制

image.png

根据ibd恢复数据

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

方法1(推荐)

# 提取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;'
复制

image.png

方法2

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

# 提取出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;'
复制

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

总结

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论