MySQL8.0ibd2sdi根据ibd⽂件恢复表结构
ibd⽂件
在8之前InnoDB存储表的结构和数据时,分别存储在frm⽂件和ibd⽂件。⽽在8的时候全都存到了ibd⽂件⾥。。。。。。
如果你把mysql搞崩了…⽐如我⼿贱把preformance_shcema表删了…相信这回帮到你。
ibd2sdi
Oracle 将frm⽂件的信息及更多信息移动到叫做序列化字典信息(Serialized Dictionary Information,SDI),SDI被写在ibd⽂件内部,它是数据字典包含的信息的⼀个冗余副本。
为了从IBD⽂件中提取SDI信息,Oracle提供了⼀个应⽤程序 ibd2sdi。
这个⼯具不需要下载,mysql8⾃带的有,只要你配好环境变量就能到处⽤。
查看表结构
到存储ibd⽂件的⽬录下,执⾏下⾯的命令:
ibd2sdi --dump-file=***.txt  ***.ibd
这样ibd2sdi就会把***.ibd ⾥存储的表结构以json的格式粗出道 ***.txt中。
表名
列名
数据长度
提取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⽂件中。
mysql存储文档输出的格式如下:
{
"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
⽤vscode打开.json,此时vscode会⾼亮json⽂件格式正确的部分,⼿动修复不正确的格式,保存。
shell中读取.json,jq解析json,powershell代码如下:
Get-Content -Path ***.json |jq  '.[]?|.[]?|.dd_object?|({table:.name?},(.columns?|.[]?|{name:.name,type:.column_type_utf8}))'>*.json

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。