mysql 正常運行的時候,[查看 table 的結構][show create table doc]並不是困難的事。 但是有時 mysql 發生故障,這種方法便不再可行。 當遇到故障,通常使用新的 mysql 實例來恢復當前的數據。 建表是非常重要的步驟,我們必須有其它的方法來尋找 table 的 ...
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
命令。
寫在最後
在使用上,可以多個工具都測試一下,對比哪個工具恢復的命令更為完善可取,選擇最佳的。
參考: