本文来自好友小菜哥的投稿,对,他又弄丢数据了。
事情起因: 因为公司停电,导致服务器宕机了(没有UPS的,不要问为什么不买一个),服务器启动之后,启动服务,然后服务器很不情愿的给你报了个错误;
Starting MySQL.. ERROR! The server quit without updating PID file (/data2/mysql/mysql.pid).
呵呵,起不来了。查看日志发现是msyql库损坏了,没办法启动;那我的数据怎么办呢。数据库啊。
开始谷歌修复方法:
1、备份data目录数据;mysql有一个备份还原的办法,就是直接拷贝data目录下的数据直接还原,这里我们是mysql库出现问题 我们就要初始化mysql,所以先备份data目录下面所有的东西到其他盘;
/data2/mysql/data mv /data2/mysql/data/* /data2/back/(备份目录自己建),
2、初始化mysql,记得我们在编译安装的时候,要跑一个初始化脚本,对,就是这个脚本,再重新跑一次就可以;
cd /usr/local/mysql ./scripts/mysql_install_db --user=mysql 初始化mysql,成功之后;重新启动服务
./bin/mysqld_safe --user=mysql & 服务启动成功;mysql的启动问题修复了。然后设置帐号密码。密码最好设置和原来的一样的(这个就不用教吧)。
3、这个时候你肯定还在想,mysql起来了有什么用,我的数据还没有呢,程序还是连不上数据库。下面我们就开始恢复之前的数据; 首先,我们先进数据库,创建需要还原的数据库。create database udb; (udb这里是我的库);这个时候在data目录下面就有一 个udb的文件夹,然后我们停掉mysql服务,讲我们原来备份的data目录下的udb库的东西全部拷贝过来;cp -r /data/back/data/udb/* ./udb/ 然后将复制过来的文件授权给mysql用户; chown -R mysql.mysql . 然后,启动服务;服务正常启动,如果启动还是报错,检查报错什么问题。ps aux|grep mysql
4、进入mysql,切换到udb库,show tables; 发现之前的表都回来了。这个时候不能高兴的太早,select查询一下表 内容,会发现又给你一个大写的ERROR 1064 (42000): 然后心里就一顿MMP了。明明表都回来了,为什么数据没回来呢。 经过一顿谷歌,原来还有几个文件是要恢复的;在原来备份的data目录下面,有几个ib开头的文件;ibdata1 ib_logfile0 这几个文件是mysql在运行的时候,临时的数据都存在这里,并没有真正写入表,所以显示表内容的数据都在这里,具体的 可以去根据这几个文件看看详细的介绍。停止mysql服务,把这几个文件也拷贝到现在的data目录下面去;全部覆盖现在文件夹里的内容; 然后重启服务,进入mysql,切换数据库,再来一个select,你会发现可爱的数据又回来了。
总结:
1、在修复的时候不要慌,因为mysql的硬性备份还原机制,可以直接用data下面的文件进行环境,所以只要不是物理损坏,一般情况下问题不会太大 就是时间和耐心的问题;
2、认真看日志,在最开始启动的时候,我们只知道mysql起不来了,并不知道真正的原因,这样是没有任何办法的;最后找到日志发现是mysql 库损坏导致没办法启动;这个时候就好办了,mysql库坏了就搞mysql库咯,对症下药;
3、数据恢复的问题,在mysql还原的时候我之前也以为是udb库的表损坏了,也用网上的各种命令进行修复检查;发现并没有什么用;在这里记得不管怎么折腾, 记得保留一份最原始的数据,折腾坏了现在的,大不了重新再来,要是没有原始数据,那就很容易造成二次损坏,到那个时候数据就彻底没有救了。
4、数据库还是定时做好备份吧;
5、有钱还是买几个UPS吧;买APC的吧,免得山特和深圳山特傻傻分不清。
6、可以考虑请雷神常驻公司。
原创文章,转载请注明: 转载自笛声
本文链接地址: 服务器停电宕机导致MySQL无法启动的问题
7 条评论
先收藏,下次要是遇到了好解决
最后一招:实在不行就跑路~
我觉得吧,还是要等我租用服务器再看。。
也,笛大佬什么时候更新了,哇勒个去。
哈哈,没UPS至少也得日常备份一下或者干脆热备~风险意识要加强~
这么多建议中,只看到备份数据库,是最简单实在的做法!我的做法都是离线备份到本地硬盘上
企业环境备份出来的mysql文件,动不动就几十GB的。