因为磁盘空间不足,我的一个虚拟机服务器崩溃了。结果数据库服务器进程无法启动,数据也就无法导出。只能想办法从数据库原始文件 ibdata 和 frm 文件中恢复数据库。
因为没有经验,好不容易才找到了恢复方法。特此记录,以备后用。
磁盘空间不足之后,mysqld 进程无法启动,提示“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
”。这真是让人无比头大,数据库根本连接不上。
目录 Contents
1. 保存原始数据库文件¶
好在数据库原始文件还在。在我的系统环境和配置情况下,这些文件位于 /var/lib/mysql/
文件夹下面。假设数据库名是 test,则这些文件表现为:
--mysql |--test |--1.frm |--2.frm |... |--mysql |... |--ib_logfile0 |--ib_logfile1 |--ibdata1 |...
这些就是原始数据库文件,可以用来恢复数据库。将这些文件额外保存一份,以防万一。
2. 恢复方法¶
我的原始虚拟机完全没有磁盘空间而无法启动数据库服务器进程。虽然试着删除一些不需要的文件,但是数据库却始终无法连接。于是我新建了一个几乎一样的虚拟机(当然磁盘加大了),试图将这些数据库文件导入并恢复数据库。
在经历了很多错误之后,终于找到了正确的方法:
- 安装完成新服务器之后,通过命令行新建了与原来一样的数据库:数据库名称、用户名、密码都一样。如果有多个数据库需要恢复,就都给建好。(跟配置新服务器一样,参见安装和配置 MYSQL 数据库服务器。)
- 停止 mysqld 进程
service mysqld stop
- 将备份的原始数据库文件中的所有
.frm
文件(保持原来的目录结构)和ibdata1
文件复制到新服务器的数据库文件目录中(如果新服务器操作系统和配置环境一样,那么目录结构也一样),其它文件不要。 - 使用
-innodb_force_recovery=6
参数启动数据库服务器进程,这里是/etc/init.d/mysqld start -defaults-file=/etc/my.cnf -standalone -console -innodb_force_recovery=6
OK,数据库恢复完成。
3. 参考资料:¶
- mysql 讨论区中的回复:http://forums.mysql.com/read.php?22,47078,51428#msg-51428
- 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/>。转载请保留此信息及相应链接。
不错的方法,以后可能能用刀。。
我汲取的教训是,不能对磁盘分配太吝啬了。
哈哈,这个要收藏,希望不会用到。
汗…
分配时就该想到的啊…
我就奇怪了…数据库居然也能把磁盘占满???
汗…
奇怪你的评论已经有两次跑到垃圾评论里头了。
本来没想到要做那么多事情的,不光是数据库。
救了我一条命。
非常感谢……
看来遇到这种问题的人还不少啊
试试。目前正遇到这样的问题,以前mysql文件夹下的文件我都拷贝出来了。现在想从这个里面恢复。
问下博主,“通过命令行新建了与原来一样的数据库:数据库名称、用户名、密码都一样。” 这句话里面的用户名怎么理解?我的就是root用户。以前也是,现在也是。只是我的机子(linux)的主机名变了,并且登录linux的用户名也变了,这个影响吗? 我的机子重装过。
这里说的意思就是和原来的数据库一模一样。mysql的用户名和密码与Linux系统的没有关系。
很庆幸看到了这个帖子,也很不幸自己是个外行。比对着上面的方法还是没有成功。因为数据是记录孩子成长点点滴滴的,不知道如何联系您啊,是否方便提供一些指导。
谢谢啦
重要数据丢失的确很闹心啊。
你应该已经备份过这些文件了吧?一定要备份之后再来尝试恢复。这个也是有局限性的,不过 Linux 的好处就是所有的东西都存在文件里,只要文件在,总有方法恢复的。
我这几天忙着婚礼以及酬客的事情,下周再跟你联系吧,看看能不能有别的方法。
回复的太快了。是我看到的晚了。先忙婚礼吧,祝福你们啦。另外,邮件已经收到了。再次感谢!