起因是這樣的,公司的領導表示說服務器崩了,修理好之后,只剩下數據庫目錄下的物理文件(即.frm文件與.ibd文件)。然后,整了一份壓縮包給我,叫我瞅一下能不能把數據恢復出來。我當場愣了一下,這都啥文件啊,以前天天整開發,也沒見到這種玩意啊。雖然對這文件不是很熟悉,但是領導交給我了,我也不能推脫,好歹要努力一下看看。
環境准備:
1.本文使用的是Windows 筆記本*1 ( 系統可以是Windows、也可以是CentOS、Debian等等MySQL Utilities能兼容的都行)
2.MySQL 5.7+
一、什么是.frm文件
那么首先我要做的事情就是這.frm結尾的文件到底是什么東西?
我通過百度找到了MySQL官網,我點進去一看,第一段就是下面這句話。憑借着我不怎么樣的英文,往下看了三行,發現了標紅框的兩句話。
得到的結論就是:
1..frm文件描述了表的格式,也就是說里面能獲取到表的定義
2..frm文件與表格的名字相同
二、什么是.ibd文件
經過上面的猜測,很容易就可以聯想到表結構都有了,那么這個.ibd文件可能就是存放數據、索引信息之類的了。
經過一番的百度,查閱到以下資料:
.ibd文件是使用InnoDB引擎的表產生的索引和數據文件。
(如果引擎使用的是MyISAM的話,會產生索引和數據分開存放的兩個文件,.MYI(索引文件)和.MYD(數據文件))
三、獲取frm文件的表結構信息
接下來,知道了有這么些文件,那么怎么把數據讀取出來呢?
MySQL 提供了一款支持多個平台的工具軟件,叫做MySQL Utilities。
這個工具包括克隆、復制、比較、差異、導出、導入、解析frm文件等功能。同時,這款軟件支持多種系統使用,使用方法都是一致的。
(附下載地址:http://dev.mysql.com/downloads/utilities/)
通過命令:
mysqlfrm [.frm文件地址] --diagnostic
就可以查看frm文件包含的完整表結構了。
於是我手寫了一個批處理腳本,把frm文件的表格結構都讀取出來放在一個文本文件里,這樣就獲取到了所有的表結構。
CHCP 65001>nul
@echo off
for %%i in ([frm文件所在目錄]\*.frm) do (
mysqlfrm %%i --diagnostic >> test.txt
)
pause
接着就是創建對應的數據庫,把表結構的語句輸入,執行一下SQL就可以了。
四、表結構有了,就可以開始恢復.ibd數據了
先把數據庫里自帶的數據文件脫離(脫離之后,表對應的.ibd文件會被刪除)。
alter table aaa discard tablespace;
然后把原先的.ibd文件復制到數據庫存放的數據目錄。
不知道在哪的同學,可以執行以下語句查看數據目錄位置:
這個目錄里面是按照數據庫分目錄的:
找到我們自己的數據庫,把.ibd文件復制進去。
到了這一步,就可以准備關聯數據了。
執行以下命令關聯數據:
alter table aaa import tablespace;
五、成功之后,就可以驗證數據了。
在上述的過程中,我是批量操作的。
1.批量獲取表結構
2.批量創建表
3.批量脫離表數據。
4.批量管理表數據。
最后,成功恢復數據。
感謝收看。