Mysql——Innodb和Myisam概念与数据恢复

Innodb和Myisam是Mysql常见的两种数据存储引擎。没有研究过Oracle、SQL Server等数据库,因此下面只针对Mysql。mysql

1、两种方式的数据存储结构:sql

  在Myisam下,数据库的每一个数据表都有*.frm、*.YMI和*.YMD三个文件,其中*.frm存储数据表的表结构,*.MYI存储数据表的索引,*.MYD存数数据表的记录数据;数据库

  在Innodb下,每一个数据库下的每一个数据表只有一个*.frm存储数据表的表结构,而全部数据库的全部表数据索引、数据记录都所有存储在ibdata1文件中,而ib_logfile0和ib_logfile1是日志文件。并发

 

2、数据导入和恢复:工具

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中不包含数据)。.net

Case2 Innodb =》 Innodb:日志

  因为Innodb下,表结构存在*.frm文件,可是表的数据存储在ibdata1文件中,因此导入时,除了复制*.frm,还要复制源Mysql的data目录下的ibdata1,替换掉目的数据库的ibdata,若是目的数据库中有已存在的其余数据库,此时须要先备份目的数据库的原先data数据,而后将新导入的表格经过其余方式导出,而后在还原原先的data数据,将新导出的数据导入。blog

  若是只有*.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语句文件。

 

3、Innodb和Myisam其余区别:

  一、Myisam多个数据库和数据表的记录数据是分文件存储的,而Innodb全部表的记录数据都存储在ibdata1文件中,因此当数据表记录比较少,单个表的数据文件比较少时,此时使用Myisam性能会略好于Innodb。可是若是表的数据记录很是多,此时使用Innodb的性能会远远高于Myisam,经过测试能够发现,随着表的记录增长,Innodb的性能下降不多,而Myisam的性能则迅速下降。

  二、Innodb支持事务操做,而Myisam不支持事务操做。

  事务操做:就是一组多条sql指令做为一个总体,能够并发操做,可是关键点在于事务内的多个操做必须同时执行完才会提交结果。因此事务内的SQL要么都不作,要么都作。

  事务实现通常有下面两种方式:

  Way1 begin、rollback和commit:

  begin表示开始事务,rollback表示事务回滚,commit表示事务提交。

  Way2 经过set来改变Mysql默认的自动提交模式:

  set autocommit=0 禁止自动提交(使用事务,此时每条SQL都会看成事务,必须显示使用commit体提交结果或者rollback撤销结果)
  set autocommit=1 开启自动提交(禁用事务)

例子:参考这里

相关文章
相关标签/搜索