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中。
- 表名
- 列名
- 數據長度
提取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格式錯誤,比如缺少引號)。
這樣一來就不能直接使用以上命令了,需要按照以下步驟來:
- 執行
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