Innodb和Myisam数据恢复

Posted update_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Innodb和Myisam数据恢复相关的知识,希望对你有一定的参考价值。

(转自)https://www.cnblogs.com/DwyaneTalk/p/4113829.html

 背景

      这次恢复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数据恢复的主要内容,如果未能解决你的问题,请参考以下文章

关系型数据库,引擎MyISAM和InnoDB

innodb和myisam的区别

mysql数据库InnoDB和MyISAM区别以及如何选择

MySQL进阶实战9,InnoDB和MyISAM的数据分布对比

常用mysql数据库引擎——MyISAM和InnoDB区别

Innodb和Myisam数据恢复