Mysql——Innodb和Myisam概念與數據恢復


Innodb和Myisam是Mysql常見的兩種數據存儲引擎。沒有研究過Oracle、SQL Server等數據庫,所以下面只針對Mysql。

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

  在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其他區別:

  1、Myisam多個數據庫和數據表的記錄數據是分文件存儲的,而Innodb所有表的記錄數據都存儲在ibdata1文件中,所以當數據表記錄比較少,單個表的數據文件比較少時,此時使用Myisam性能會略好於Innodb。但是如果表的數據記錄非常多,此時使用Innodb的性能會遠遠高於Myisam,通過測試可以發現,隨着表的記錄增加,Innodb的性能降低很少,而Myisam的性能則迅速降低。

  2、Innodb支持事務操作,而Myisam不支持事務操作。

  事務操作:就是一組多條sql指令作為一個整體,可以並發操作,但是關鍵點在於事務內的多個操作必須同時執行完才會提交結果。所以事務內的SQL要么都不做,要么都做。

  事務實現一般有下面兩種方式:

  Way1 begin、rollback和commit:

  begin表示開始事務,rollback表示事務回滾,commit表示事務提交。

  Way2 通過set來改變Mysql默認的自動提交模式:

  set autocommit=0 禁止自動提交(使用事務,此時每條SQL都會當作事務,必須顯示使用commit體提交結果或者rollback撤銷結果)
  set autocommit=1 開啟自動提交(禁用事務)

例子:參考這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM