Mysql——Innodb和Myisam概念与数据恢复
Innodb和Myisam是Mysql常見(jiàn)的兩種數(shù)據(jù)存儲(chǔ)引擎。沒(méi)有研究過(guò)Oracle、SQL Server等數(shù)據(jù)庫(kù),所以下面只針對(duì)Mysql。
一、兩種方式的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu):
在Myisam下,數(shù)據(jù)庫(kù)的每個(gè)數(shù)據(jù)表都有*.frm、*.YMI和*.YMD三個(gè)文件,其中*.frm存儲(chǔ)數(shù)據(jù)表的表結(jié)構(gòu),*.MYI存儲(chǔ)數(shù)據(jù)表的索引,*.MYD存數(shù)數(shù)據(jù)表的記錄數(shù)據(jù);
在Innodb下,每個(gè)數(shù)據(jù)庫(kù)下的每個(gè)數(shù)據(jù)表只有一個(gè)*.frm存儲(chǔ)數(shù)據(jù)表的表結(jié)構(gòu),而所有數(shù)據(jù)庫(kù)的所有表數(shù)據(jù)索引、數(shù)據(jù)記錄都全部存儲(chǔ)在ibdata1文件中,而ib_logfile0和ib_logfile1是日志文件。
?
二、數(shù)據(jù)導(dǎo)入和恢復(fù):
Case1?Myisam =》 Myisam:
由于Myisam的數(shù)據(jù)表結(jié)構(gòu)、索引、記錄數(shù)據(jù)等信息分別存儲(chǔ)在*.frm、*.MYI和*.MYD文件中,所以只需要將源數(shù)據(jù)庫(kù)數(shù)據(jù)表的相應(yīng)三個(gè)文件復(fù)制到對(duì)應(yīng)目的數(shù)據(jù)庫(kù)文件夾下就可以了。
但是如果只有*.frm(假設(shè)test.frm)了,那么可以將test.frm復(fù)制到對(duì)應(yīng)的數(shù)據(jù)庫(kù)目錄(假設(shè)tmp數(shù)據(jù)庫(kù))之后,在tmp目錄下,新建test.MYI和test.MYD文件。此時(shí)通過(guò)“show tables;”可以看到有test表,但是查看表的數(shù)據(jù),如“desc test;”,此時(shí)報(bào)錯(cuò)無(wú)法查看,因?yàn)橹挥衪est.frm有數(shù)據(jù),而test.MYI和test.MYD是新建的無(wú)效文件。然后可以通過(guò)Mysql自帶修復(fù)操作“REPAIRTABLE test USE_FRM”修復(fù)數(shù)據(jù)表,然后就可以查看表的數(shù)據(jù),但是為空(因?yàn)閠est.frm中不包含數(shù)據(jù))。
Case2 Innodb =》 Innodb:
由于Innodb下,表結(jié)構(gòu)存在*.frm文件,但是表的數(shù)據(jù)存儲(chǔ)在ibdata1文件中,所以導(dǎo)入時(shí),除了復(fù)制*.frm,還要復(fù)制源Mysql的data目錄下的ibdata1,替換掉目的數(shù)據(jù)庫(kù)的ibdata,如果目的數(shù)據(jù)庫(kù)中有已存在的其他數(shù)據(jù)庫(kù),此時(shí)需要先備份目的數(shù)據(jù)庫(kù)的原先data數(shù)據(jù),然后將新導(dǎo)入的表格通過(guò)其他方式導(dǎo)出,然后在還原原先的data數(shù)據(jù),將新導(dǎo)出的數(shù)據(jù)導(dǎo)入。
如果只有*.frm(假設(shè)test.frm),沒(méi)有有效的ibdata1,那么也只能恢復(fù)表的結(jié)構(gòu)。先將test.frm復(fù)制到另一個(gè)數(shù)據(jù)庫(kù)中(假設(shè)tmp),然后在tmp下新建一個(gè)Innodb型的數(shù)據(jù)表test(有哪些字段不重要),不要添加任何記錄。然后將要恢復(fù)的test.frm復(fù)制到test目錄下替代新建test表產(chǎn)生的test.frm,重啟mysql之后,新建的test表的結(jié)構(gòu)就和要恢復(fù)的test表結(jié)構(gòu)相同
Case3 Myisam =》 Innodb 和 Innodb =》 Myisam:
如果有*.frm、*.MYI和*.MYD三個(gè)文件,可以通過(guò)Case1的方法導(dǎo)入之后,重新導(dǎo)出sql或者其他文件,也可以導(dǎo)入后修改為Innodb,之后通過(guò)Case2方式。同樣Innodb =》 Myisam的操作類似。
?
對(duì)于數(shù)據(jù)庫(kù)的數(shù)據(jù),除了從.frm文件恢復(fù)之外,如果有日志文件,從日志文件恢復(fù)也是一個(gè)一個(gè)選擇。但是對(duì)于數(shù)據(jù)庫(kù),進(jìn)行移植或這更換系統(tǒng)時(shí),最好還是通過(guò)導(dǎo)入導(dǎo)出工具到處相應(yīng)的sql語(yǔ)句文件。
?
三、Innodb和Myisam其他區(qū)別:
1、Myisam多個(gè)數(shù)據(jù)庫(kù)和數(shù)據(jù)表的記錄數(shù)據(jù)是分文件存儲(chǔ)的,而Innodb所有表的記錄數(shù)據(jù)都存儲(chǔ)在ibdata1文件中,所以當(dāng)數(shù)據(jù)表記錄比較少,單個(gè)表的數(shù)據(jù)文件比較少時(shí),此時(shí)使用Myisam性能會(huì)略好于Innodb。但是如果表的數(shù)據(jù)記錄非常多,此時(shí)使用Innodb的性能會(huì)遠(yuǎn)遠(yuǎn)高于Myisam,通過(guò)測(cè)試可以發(fā)現(xiàn),隨著表的記錄增加,Innodb的性能降低很少,而Myisam的性能則迅速降低。
2、Innodb支持事務(wù)操作,而Myisam不支持事務(wù)操作。
事務(wù)操作:就是一組多條sql指令作為一個(gè)整體,可以并發(fā)操作,但是關(guān)鍵點(diǎn)在于事務(wù)內(nèi)的多個(gè)操作必須同時(shí)執(zhí)行完才會(huì)提交結(jié)果。所以事務(wù)內(nèi)的SQL要么都不做,要么都做。
事務(wù)實(shí)現(xiàn)一般有下面兩種方式:
Way1 begin、rollback和commit:
begin表示開(kāi)始事務(wù),rollback表示事務(wù)回滾,commit表示事務(wù)提交。
Way2 通過(guò)set來(lái)改變Mysql默認(rèn)的自動(dòng)提交模式:
set autocommit=0 禁止自動(dòng)提交(使用事務(wù),此時(shí)每條SQL都會(huì)當(dāng)作事務(wù),必須顯示使用commit體提交結(jié)果或者rollback撤銷結(jié)果)
set autocommit=1 開(kāi)啟自動(dòng)提交(禁用事務(wù))
例子:參考這里
轉(zhuǎn)載于:https://www.cnblogs.com/DwyaneTalk/p/4113829.html
總結(jié)
以上是生活随笔為你收集整理的Mysql——Innodb和Myisam概念与数据恢复的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何快速清除苹果 iPhone、iPad
- 下一篇: SQL点滴26—常见T-SQL面试解析