【MySQL】MySQL8.0 ibd2sdi 根据ibd文件恢复表结构

ibd文件

在8之前InnoDB存储表的结构和数据时,分别存储在frm文件和ibd文件。而在8的时候全都存到了ibd文件里。。。。。。
如果你把mysql搞崩了…比如我手贱把preformance_shcema表删了…相信这回帮到你。

ibd2sdi

Oracle 将frm文件的信息及更多信息移动到叫做序列化字典信息(Serialized Dictionary Information,SDI),SDI被写在ibd文件内部,它是数据字典包含的信息的一个冗余副本。
为了从IBD文件中提取SDI信息,Oracle提供了一个应用程序 ibd2sdi。
=== ibd2sdi官方文档 ===
这个工具不需要下载,mysql8自带的有,只要你配好环境变量就能到处用。

查看表结构

到存储ibd文件的目录下,执行下面的命令:

ibd2sdi --dump-file=***.txt  ***.ibd

这样ibd2sdi就会把***.ibd 里存储的表结构以json的格式粗出道 ***.txt中。

在这里插入图片描述

  1. 表名
  2. 列名
  3. 数据长度

提取json

可以看到数据非常的冗杂,像一坨屎一样。
神器jq出场,提取json里的数据,而且windows和linux上都可以用。

centos上直接yum安装即可。
windows上去github上下载,复制到system32里。=== 官网 ===

这篇文章里用的是在linux下使用的jq(不推荐使用),代码如下:

ibd2sdi ***.ibd |jq  '.[]?|.[]?|.dd_object?|("-------"?,"TABLE NAME = ",.name?,"****",(.columns?|.[]?|(.name?,.column_type_utf8?)))'

不推荐使用的原因是,该命令只能在linux下运行,通用的命令如下:

ibd2sdi ***.ibd |jq  '.[]?|.[]?|.dd_object?|({table:.name?},(.columns?|.[]?|{name:.name,type:.column_type_utf8}))' > ***.json

将原始json提取出来到json文件中。

输出的格式如下:

{
  "table": "log"
}
{
  "name": "id",
  "type": "int(11)"
}
{
  "name": "content",
  "type": "varchar(255)"
}
{
  "name": "createdTime",
  "type": "datetime"
}
{
  "name": "uid",
  "type": "varchar(255)"
}
{
  "name": "DB_TRX_ID",
  "type": ""
}
{
  "name": "DB_ROLL_PTR",
  "type": ""
}
{
  "table": "world/log"
}

值得注意的是,当以前建的表中存在中文注释的话,解析出来的注释是乱码的,而且大概率会触发ibd2sdi 的bug(中文乱码导致json格式错误,比如缺少引号)。
这样一来就不能直接使用以上命令了,需要按照以下步骤来:

  1. 执行ibd2sdi ***.ibd >***json
  2. 用vscode打开***.json,此时vscode会高亮json文件格式正确的部分,手动修复不正确的格式,保存。
  3. shell中读取***.json,jq解析json,powershell代码如下:
Get-Content -Path ***.json |jq  '.[]?|.[]?|.dd_object?|({table:.name?},(.columns?|.[]?|{name:.name,type:.column_type_utf8}))' >*.json
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章