1. 程式人生 > >Innodb和Myisam數據恢復

Innodb和Myisam數據恢復

相同 存儲結構 log 導出 無法 方式 報錯 .cn 包含

(轉自)https://www.cnblogs.com/DwyaneTalk/p/4113829.html

一、兩種方式的數據存儲結構:

  在Myisam下,數據庫的每個數據表都有*.frm、*.YMI和*.YMD三個文件,其中*.frm存儲數據表的表結構,*.MYI存儲數據表的索引,*.MYD存數數據表的記錄數據;

  在Innodb下,每個數據庫下的每個數據表只有一個*.frm存儲數據表的表結構,而所有數據庫的所有表數據索引、數據記錄都全部存儲在ibdata1文件中,而ib_logfile0和ib_logfile1是日誌文件。

二、數據導入和恢復:

Case1 Myisam =》 Myisam:

  由於Myisam的數據表結構、索引、記錄數據等信息分別存儲在*.frm、*.MYI和*.MYD文件中,所以只需要將源數據庫數據表的相應三個文件復制到對應目的數據庫文件夾下就可以了。

  但是如果只有*.frm(假設test.frm)了,那麽可以將test.frm復制到對應的數據庫目錄(假設tmp數據庫)之後,在tmp目錄下,新建test.MYI和test.MYD文件。此時通過“show tables;”可以看到有test表,但是查看表的數據,如“desc test;”,此時報錯無法查看,因為只有test.frm有數據,而test.MYI和test.MYD是新建的無效文件。然後可以通過Mysql自帶修復操作“REPAIRTABLE test USE_FRM”修復數據表,然後就可以查看表的數據,但是為空(因為test.frm中不包含數據)。

Case2 Innodb =》 Innodb:

  由於Innodb下,表結構存在*.frm文件,但是表的數據存儲在ibdata1文件中,所以導入時,除了復制*.frm,還要復制源Mysql的data目錄下的ibdata1,替換掉目的數據庫的ibdata,如果目的數據庫中有已存在的其他數據庫,此時需要先備份目的數據庫的原先data數據,然後將新導入的表格通過其他方式導出,然後在還原原先的data數據,將新導出的數據導入。

  如果只有*.frm(假設test.frm),沒有有效的ibdata1,那麽也只能恢復表的結構。先將test.frm復制到另一個數據庫中(假設tmp),然後在tmp下新建一個Innodb型的數據表test(有哪些字段不重要),不要添加任何記錄。然後將要恢復的test.frm復制到test目錄下替代新建test表產生的test.frm,重啟mysql之後,新建的test表的結構就和要恢復的test表結構相同

Case3 Myisam =》 Innodb 和 Innodb =》 Myisam:

  如果有*.frm、*.MYI和*.MYD三個文件,可以通過Case1的方法導入之後,重新導出sql或者其他文件,也可以導入後修改為Innodb,之後通過Case2方式。同樣Innodb =》 Myisam的操作類似。

  對於數據庫的數據,除了從.frm文件恢復之外,如果有日誌文件,從日誌文件恢復也是一個一個選擇。但是對於數據庫,進行移植或這更換系統時,最好還是通過導入導出工具到處相應的sql語句文件。

Innodb和Myisam數據恢復