使用 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

©

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

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

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

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

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

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

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

雁过留声,人过留名

您的电子邮箱地址不会被公开。 必填项已用 * 标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南
您可以在评论中使用如下的 HTML 标记来辅助表达: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>