Mysql 使用ibd數據文件進行數據恢復 (以及數據移動) 1067的解決辦法

使用過數據庫的哥們都知道,最開始我們不小心把數據庫安裝到c盤,當時忘記設置了數據路徑,導致數據默認也放在c盤,隨着時間的推移,數據庫數據越來越大,導致c盤空間不夠了。

於是乎我們開始研究怎麼樣移動數據,當然簡單的步驟莫過於下:

(1)停止mysql服務。(運行services.msc)

(2)打開my.ini文件,該文件有可能不在安裝程序的目錄下,而在數據目錄下,不同的mysql版本大概不同吧。

比如我安裝的5.7.3,默認在數據文件目錄programData(該目錄竟然是隱藏的!需要打開文件夾設置顯示隱藏文件)中的mysql目錄中。(該版本好像現在下載不到了,不知道是什麼原因,如果你需要可以留個郵箱)

修改my.ini中的datadir="F:\mysql\data\"。修改成你需要移動數據到的位置。然後就把你原來數據文件中的整個data目錄移動到目標位置。當然要和你設置的完全相同,切記要細心。

(3)保存my.ini之後啓動mysql服務,應該就可以了。(該my.ini文件千萬不要移動你新的數據位置,否則就是災難的開始!!)


通過以上步驟,很容易讓人覺得,mysql的數據文件就放在對應的數據庫文件夾下,然後只需要複製移動數據文件,就可以完成數據的轉移(如複製到另外一臺機器)和數據恢復。可這樣是完全不可以的。你移動了數據文件,在mysql中是可以表存在,可惜你就是打呀打不開,很是鬱悶的。還會莫名的導致1067錯誤!!當然面對1067網上有很多種解決辦法,靠譜的好像就一個,那就是刪除那三個文件,ib_logfile0、ib_logfile1、ibdata1(記得先停止mysql服務),然後重新啓動mysql。

當然,刪除了這三個文件,也就意味着你已經刪除了你數據庫中所有的數據,不信?你可以在mysql中看到表存在,可惜,你就是打不開!面對這種情況,就應該使用ibd文件進行恢復了。當然你如果有數據庫的批量插入語句備份就最好了。直接再導入一遍就可以(我指的是工具是SQLyog,裏面有從外部sql文件中導入的功能。)

具體的方法我參考的是:http://www.linuxidc.com/Linux/2014-07/104434.htm

先將數據文件frm和ibd文件進行移動保存。

具體表結構的恢復好像不是很靠譜,其實可以直接用文本打開數據文件夾下的frm文件,裏面有表結構的信息,直接複製出來,然後創建一個表就可以了。(創建時先把frm從目錄中移動出來,否則你在創建的時候會提示該表已經存在),創建表的時候,他會自動的生成一個同名的frm和ibd文件。

最關鍵的就是ibd文件的使用。首先得把你需要用到的ibd文件進行復製備份到一個地方。(其實這一步應該在上一步之前)。

a、建立一個數據庫,根據上面導出的創建表的sql執行創建表。(表已經創建好了就不用了)

b、找到記錄點。先要把當前數據庫的表空間廢棄掉,使當前ibd的數據文件和frm分離。  ALTER TABLE test DISCARD TABLESPACE;

test是你的表名

c、把之前要恢復的 .ibd文件複製到新的表結構文件夾下。 使當前的ibd 和frm發生關係。ALTER TABLE test  IMPORT TABLESPACE;

(這個過程需要一點時間,就和數據導入是差不多,其實本質上就是那三個文件和你的數據發生某種關聯,具體不知道,還望指點)

d、將恢復好的數據導出就行了(這一步相當關鍵,經過上述動作你是可以完整的看到數據了,但是第二天你再來看,你又會遇到1067,所以趁着可以用的機會,趕緊導出備份一次!!)


總的來說,ib_logfile0、ib_logfile1、ibdata1這三個文件和my.ini,以及你的數據文件是緊密聯繫在一起的,哪一個出現意外情況,導致不一致,就會出現1067,所以操作需謹慎!!不過你只要記得備份你的數據成sql語句,那什麼都不用害怕了!


發佈了26 篇原創文章 · 獲贊 13 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章