mysql 從 frm 文件恢復 table 表結構的3種方法


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 命令。

寫在最后

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

參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM