標籤:庫檔案 nbsp tables file ane htm 存在 tmp 方式
(轉自)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資料恢複