说说利用frm和ibd以及ibdata1文件恢复mysql数据

最近,有一台服务器的mysql服务down掉了。排查过后,发现是centos系统的空间已经被mysql日志榨干。日志自然是不敢乱动的,所以删除了部分文件。但是,却遇上了文件被删除,空间却没有被释放的情况。按照以往的经验处理了空间没有被释放的问题,但是还是没有释放空间。时间就是金钱,所以Google了一把,解决办法拿到了,但却都没有成功。最后决定先恢复mysql数据再说。几经摸索,终于发现了恢复数据的最正确姿势!

拉取文件

利用SFTP登录服务器,找到mysql安装目录,把数据库对应的文件夹全部下载了,里面会有frm和ibd文件。还需要下载ibdata1。frm的作用在于存储每一个数据表的描述信息。ibd文件的作用是存储了每一个InnoDB表数据和索引。ibdata1是mysql的共享系统空间,具体什么结构,存储什么内容我们不得而知,因为mysql没有提供相应工具,也没有详细说明这个。

新建库和表

这个没有什么好说的,按照原来的库名称新建库,按照原来的表名称新建表。做了这两步新建,新服务器的mysql目录下面就会有对应的frm和ibd文件。然后停止mysql。

覆盖数据

最后一步,把拉取下来的文件上传上去对应覆盖。确保覆盖完成后,启动mysql,你会惊喜地发现数据又完整无缺地回来了!!

总结

这种方式是针对InnoDB存储引擎的数据库恢复方式。更需要注意的是表独立空间(ibd)是从mysql
5.6.6起才默认开启的。具体是通过配置innodb_file_per_table去控制的。