【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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章