mysql 從 frm 檔案恢復 table 表結構的3種方法

DreamAndDead發表於2018-09-27

mysql 正常執行的時候,檢視 table 的結構並不是困難的事。
但是有時 mysql 發生故障,這種方法便不再可行。

當遇到故障,通常使用新的 mysql 例項來恢復當前的資料。
建表是非常重要的步驟,我們必須有其它的方法來尋找 table 的結構。

table 結構定義在哪裡

通常關注的使用者資料,底層都實際儲存在 mysql 資料目錄。
其它的後設資料也不例外,比如 table 表結構的定義。

mysql 資料目錄檔案結構是非常清晰的,

  • 目錄對應資料庫
  • frm 檔案儲存了 table 結構的定義
  • ibdata 檔案儲存了 mysql 的後設資料及其它

table 定義的結構,就存在於 frm 檔案中,當然管理後設資料的 ibdata 也會有記錄。

當存在 frm 檔案的時候,恢復表結構相對容易;
但是如果執行了 drop table,便刪除了 frm 檔案,本文所提供的方法就愛莫能助了。
這種情況下,可以嘗試從 ibdata 恢復表結構,這暫時不在下面的討論範圍內。

解析 table 結構

下面介紹 3 種方式,從 frm 檔案中,解析得到 create table 命令。

mysqlfrm

mysqlfrm 是 mysql utilities 工具集 中的其中之一,
用於分析 frm 檔案生成 create table 命令。
目前已經不再更新,部分功能併入了新版本的 mysql shell(version 8 及以後)。

mysql utilities 需要 python2 環境,安裝非常簡單。

$ tar -xvzf mysql-utilities-1.6.5.tar.gz
$ cd mysql-utilities-1.6.5
$ python setup.py build
$ python setup.py install

mysqlfrm 支援兩類模式來解讀 frm:

直接分析

這種模式比較直接,逐個位元組分析 frm 檔案,儘可能的提取資訊。

這種模式下,需要使用 --diagnostic 引數。

$ mysqlfrm --diagnostic /data/sakila/actor.frm

藉助 mysql 例項分析

這種模式,藉助新的 mysql 例項,從中完成 frm 的分析工作。
可以用兩種方式來指定,如何開啟新的 mysql 例項。

一,從當前的 mysql 服務中 spawn,使用 --server 指定 mysql 服務

$ mysqlfrm --server=root:pass@localhost:3306 --port=3310 /data/sakila/actor.frm

二,啟動新的 mysql 例項,使用 --basedir 指定 mysql 程式路徑

$ mysqlfrm --basedir=/usr/local/bin/mysql --port=3310 /data/sakila/actor.frm

--port 給新的例項指定埠,是為了避免與當前的 3306 埠出現衝突。

dbsake

這是偶然發現的一個工具,文件中它這樣介紹自己:

dbsake – a (s)wiss-(a)rmy-(k)nif(e) for MySQL

作者一定是一個對 mysql 很有心得的人,
工具從下載,安裝到使用,簡單,利落。

$ curl -s get.dbsake.net > dbsake
$ chmod u+x dbsake
$ ./dbsake frmdump [frm-file-path]

online service

有一些線上的服務,也關注這樣的問題。
使用過的twindb online,體驗非常好,相關的工具集也很棒。

Recover Structure -> from .frm file 入口,上傳 frm,就可以得到 create table 命令。

寫在最後

在使用上,可以多個工具都測試一下,對比哪個工具恢復的命令更為完善可取,選擇最佳的。

參考:

相關文章