记一次Mysql数据恢复的过程

某天公司的官网打不开了,报错提示是Mysql服务器不让连接,运营的同事找到技术,让帮忙看一下问题。由于这个官网是祖传项目,且并不归我们组负责,等要来服务器的管理权限,根据当时的问题表现,以为是某种原因导致的mysql不让远程访问,想着把权限开了不就得了。然而,等我登录上mysql以后才发现,数据库没了…

原因排查

数据库没了可还行,第一反应是服务器被人黑了,查看history看到一堆命令代码,其分析其中的代码发现,这个登陆者先备份了数据库,然后scp到了另外一台服务器上。看到这,心想实锤了,肯定是被黑了(当时
心里还在想这个黑客这么不专业,居然不清理痕迹,后来才知道可能是我误会了)。既然被黑了,那想想怎么恢复数据吧,开始去找mysql的binlog。 在寻找mysql binlog的过程中,突然发现/var/lib/mysql文件夹下怎么还有一个数据库,根据mysql的进程,我一直以为msyql的数据库文件夹位于/www/server/data下,然后看了一下这个库的大小,5.6G,感觉像是真正的数据库。

奇怪的是不知道为什么mysql的启动并没有加载这个文件夹里的数据,后来查看/etc/my.cnf和服务的启动脚本,均指向/var/www/data文件夹。这是我一直很纳闷的一点,不知道当初的技术是怎么启动的mysql。

又出幺蛾子

因为不知道mysql的正确启动方式,只能尝试把数据库的datadir指向/var/lib/mysql,然后重启mysql服务。重启之后,可以使用原来的密码进行登录了,这进一步证实了这个才是原来真正的数据库文件。进入数据库之后,show tables发现所有的表都在,尝试查询其中某个表,出了新的问题:

1
ERROR 1146 (42S02): Table 'database.tablename' doesn't exist

这个表明明存在,可是却不能查询,在google了一阵之后得知,我们的mysql使用的innodb引擎,出现这个提示一般就是缺少ib*文件导致的(ibdata1、ib_logfile0和ib_logfile1)。但是奇怪得是,我的mysql文件夹下明明都存在这几个文件,莫非是文件坏了?

解决方案

又经过一番的探索,终于在my.cnf文件中找到了这么一行:

1
innodb_data_home_dir = /www/server/data

看来应该是innodb设置的问题,把配置改成/var/lib/mysql

重启mysql,正常!

你的支持我的动力