使用 ibdata 和 frm 文件恢复 MySQL 数据库

因为磁盘空间不足,我的一个虚拟机服务器崩溃了。结果数据库服务器进程无法启动,数据也就无法导出。只能想办法从数据库原始文件 ibdata 和 frm 文件中恢复数据库。

因为没有经验,好不容易才找到了恢复方法。特此记录,以备后用。

磁盘空间不足之后,mysqld 进程无法启动,提示“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)”。这真是让人无比头大,数据库根本连接不上。

1. 保存原始数据库文件

好在数据库原始文件还在。在我的系统环境和配置情况下,这些文件位于 /var/lib/mysql/ 文件夹下面。假设数据库名是 test,则这些文件表现为:

--mysql
  |--test
    |--1.frm
    |--2.frm
    |...
  |--mysql
    |...
  |--ib_logfile0
  |--ib_logfile1
  |--ibdata1
  |...

这些就是原始数据库文件,可以用来恢复数据库。将这些文件额外保存一份,以防万一。

2. 恢复方法

我的原始虚拟机完全没有磁盘空间而无法启动数据库服务器进程。虽然试着删除一些不需要的文件,但是数据库却始终无法连接。于是我新建了一个几乎一样的虚拟机(当然磁盘加大了),试图将这些数据库文件导入并恢复数据库。

在经历了很多错误之后,终于找到了正确的方法:

  1. 安装完成新服务器之后,通过命令行新建了与原来一样的数据库:数据库名称、用户名、密码都一样。如果有多个数据库需要恢复,就都给建好。(跟配置新服务器一样,参见安装和配置 MYSQL 数据库服务器。)
  2. 停止 mysqld 进程
    service mysqld stop
  3. 将备份的原始数据库文件中的所有 .frm 文件(保持原来的目录结构)ibdata1 文件复制到新服务器的数据库文件目录中(如果新服务器操作系统和配置环境一样,那么目录结构也一样),其它文件不要
  4. 使用 -innodb_force_recovery=6参数启动数据库服务器进程,这里是
    /etc/init.d/mysqld start -defaults-file=/etc/my.cnf -standalone -console -innodb_force_recovery=6

OK,数据库恢复完成。

3. 参考资料:

  1. mysql 讨论区中的回复:http://forums.mysql.com/read.php?22,47078,51428#msg-51428
  2. Nerdy Dork 写的从 Windows 中的 XAMPP 里恢复数据库的记录:http://www.nerdydork.com/restoring-mysql-innodb-files-on-windows.html

©

本文发表于水景一页。永久链接:<http://cnzhx.net/blog/restore-mysql-from-ibdata-and-frm/>。转载请保留此信息及相应链接。

13 条关于 “使用 ibdata 和 frm 文件恢复 MySQL 数据库” 的评论

  1. 不错的方法,以后可能能用刀。。

  2. 汗…
    分配时就该想到的啊…
    我就奇怪了…数据库居然也能把磁盘占满???
    汗…

    • 奇怪你的评论已经有两次跑到垃圾评论里头了。
      本来没想到要做那么多事情的,不光是数据库。

  3. 试试。目前正遇到这样的问题,以前mysql文件夹下的文件我都拷贝出来了。现在想从这个里面恢复。

    问下博主,“通过命令行新建了与原来一样的数据库:数据库名称、用户名、密码都一样。” 这句话里面的用户名怎么理解?我的就是root用户。以前也是,现在也是。只是我的机子(linux)的主机名变了,并且登录linux的用户名也变了,这个影响吗? 我的机子重装过。

    • 这里说的意思就是和原来的数据库一模一样。mysql的用户名和密码与Linux系统的没有关系。

  4. 很庆幸看到了这个帖子,也很不幸自己是个外行。比对着上面的方法还是没有成功。因为数据是记录孩子成长点点滴滴的,不知道如何联系您啊,是否方便提供一些指导。
    谢谢啦

    • 重要数据丢失的确很闹心啊。
      你应该已经备份过这些文件了吧?一定要备份之后再来尝试恢复。这个也是有局限性的,不过 Linux 的好处就是所有的东西都存在文件里,只要文件在,总有方法恢复的。
      我这几天忙着婚礼以及酬客的事情,下周再跟你联系吧,看看能不能有别的方法。

      • 回复的太快了。是我看到的晚了。先忙婚礼吧,祝福你们啦。另外,邮件已经收到了。再次感谢!

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)