Innodb和Myisam資料恢復

2022-07-29 19:54:13 字數 1707 閱讀 3163

**自)

這次恢復oracle和sqlserver,想想也不能把mysql落下了吧。三劍合一。都寫下了吧。主要是mysql好久不倒騰,也都忘了,找了篇差不多的**下吧。

這些遷移工作說來也有意思,一年到頭倒騰不了一次,好多所謂資深開發人員都不知道怎麼弄,或者弄個半吊子水平,反正也能湊合應付工作;專門的運維人員說實在的只有大的it公司養得起,普通軟體公司或者別的行業資訊部人員也都沒有機會很熟悉。

我對這個不知道為啥比較感興趣,但是這好容易整清楚了,過個一兩年又忘了,記下來也算是個紀念吧。不知道下次啥時候用到。

一、兩種方式的資料儲存結構:

在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

innodb是mysql預設的儲存引擎 通過命令列 mysql show engine可以檢視mysql支援的引擎。在mac下 mysql安裝在 usr local mysql 啟動sql usr local mysql 5.6.40 macos10 13 x86 64 bin mysql u ro...

InnoDB和MyIsAM的區別

myisam型別不支援事務處理等高階處理,而innodb型別支援 這是網上對myisam和innodb的解釋,很抽象吧,我們用白話的方式解釋一下 其實也比較簡單 所謂事務處理,就是原子性操作。打個比方,支援事務處理的innodb表,建設乙個中,發帖是給積分的。你發了乙個帖子執行乙個insert語句,...

MyISAM和InnoDB的區別

mysql預設採用的是myisam。myisam不支援事務,而innodb支援。innodb的autocommit預設是開啟的,即每條sql語句會預設被封裝成乙個事務,自動提交,這樣會影響速度,所以最好是把多條sql語句顯示放在begin和commit之間,組成乙個事務去提交。innodb支援資料行...