在8之前InnoDB存储表的结构和数据时,分别存储在frm文件和ibd文件。而在8的时候全都存到了ibd文件里。。。。。。
如果你把mysql搞崩了…比如我手贱把preformance_shcema表删了…相信这回帮到你。
Oracle 将frm文件的信息及更多信息移动到叫做序列化字典信息(Serialized Dictionary Information,SDI),SDI被写在ibd文件内部,它是数据字典包含的信息的一个冗余副本。
为了从IBD文件中提取SDI信息,Oracle提供了一个应用程序 ibd2sdi。
=== ibd2sdi官方文档 ===
这个工具不需要下载,mysql8自带的有,只要你配好环境变量就能到处用。
到存储ibd文件的目录下,执行下面的命令:
ibd2sdi --dump-file=***.txt ***.ibd
这样ibd2sdi就会把***.ibd 里存储的表结构以json的格式粗出道 ***.txt中。
可以看到数据非常的冗杂,像一坨屎一样。
神器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格式错误,比如缺少引号)。
这样一来就不能直接使用以上命令了,需要按照以下步骤来:
ibd2sdi ***.ibd >***json
Get-Content -Path ***.json |jq '.[]?|.[]?|.dd_object?|({table:.name?},(.columns?|.[]?|{name:.name,type:.column_type_utf8}))' >*.json