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
命令。
寫在最後
在使用上,可以多個工具都測試一下,對比哪個工具恢復的命令更為完善可取,選擇最佳的。
參考: