网站挂掉的第三天终于给我修好了…

说起这次经历也是一个坑接着一个,由于之前没有网站维护经验(巴不得没有),找了很久都没法入手,最后也是偶然一撇才明白问题所在。

最开始的问题是网页可以打开但登不进管理页面,登上shell发现没有宕机于是抱着试试看的心态重启了机器。结果等了十几分钟连shell都进不去了,这才想起去阿里云的控制台查看情况。然而阿里云控制台除了日常报告攻击以外并没有提示异常,于是再次用控制台进行重启操作。

这次重启大概花了2-3分钟,shell可以正常登入,但是网页显示无法连接数据库。按照同学的建议我在shell里面执行了service mysqld restart命令,然而反馈竟然是mysqld: unrecognized service,不识别mysqld。

放狗(google)一通搜,说先要检查mysql是否安装正确。使用rpm -q mysql,提示竟然是package mysql is not installed,看网上解决方案是重装mysql。到这感觉已是大势不妙,赶快备份数据。在阿里云控制台备份硬盘,之后又把数据库和网页数据打包下到本地,抱着死马当活马医的心态开始重装mysql,然并卵…

查到另一个解决方案是进入mysql的安装目录直接执行mysqld,说是有可能系统连接出现问题,我的理解就类似环境变量的设置出了差错,导致mysqld不能作为指令直接执行。

然而试了半天发现即便是在mysql的安装目录执行./mysqld依然会报错,错误为[ERROR] Fatal error: Please read “Security” section of the manual to find out how to run mysqld as root!。

看到有一个mysqld_safe就试了一试,结果还是报错,提示:mysqld_safe Logging to ‘***/mysql/var/***.err’,然而打开日志文件翻到最后并不清楚具体说的什么问题。

又尝试service mysql start,提示:Starting MySQL.. ERROR! The server quit without updating PID file。

作为一个两天前连find命令都要google的小白,事情发展到这个地步基本已经宣告放弃了,然而就在我准备重装整个系统的时候我忽然想起第一天google时候有个网友说要移机是因为磁盘空间用完导致mysql崩溃。但很久很久以前在我刚打算买服务器的时候问过同学说是按我这么写写博客,20G的空间够我用三五年的,所以当时就没往这想。于是乎在找了很久之后终于找到了我原来修改的php探针网址,打开发现… *uck…真的是这个问题。不要问我为什么一开始不用df -h,我一个连find都要google的白菜怎么可能知道还有df这个命令…能记得php探针里面有已经很不错了…

再往后的事情就是一级一级目录的找,到底什么文件占了这么大空间。最后发现是在mysql的文件夹下一堆mysql-bin.0000XX文件,好几个文件都达到了一个多G,加起来总共占了14GB。在询问同学确保安全后使用rm删掉了最后的两个编号的文件。结果,执行mysqld_safe依然报错。不过这次日志信息写的很清楚,说找不到之后一个日志文件。so,悲了个剧的,为了最后一个只有几M的文件执行了滚回磁盘,删掉了光棍11号文件。再次执行mysqld_safe,终于,在放了三天狗(google)之后,网站恢复了运行。

然而这明显是治标不治本的方案,为了让mysql自动删除历史日志,后来在mysql的配置文件my.cnf中service下面加入配置项:expire_logs_days = 10,当然也可以更彻底的直接关闭日志记录,用#注释掉log-bin=mysql-bin这一句,保守起见我还是选择了前者。执行service mysql restart之后命令生效,瞬间磁盘剩余空间涨到了14G,问题被彻底解决。

当然,在过程中间还学习了很多其他的命令,比如使用Xshell客户端下载服务器上的文件需要用到的sz rz指令,以及命令要求的服务器端程序lrzsz。执行#yum install lrzsz即可安装。

总结起来这次查错改错的过程可以说是自己给自己挖了一个大坑,在错误最明显的地方掉了进去。不过能在填坑的过程中学习各种命令也算对得起这两三天的折腾了。

最后的最后,不得不说阿里云的提醒功能十分完善。然而直到这次事情发生我才懂得使用各种报警规则和快照策略,也算是一个迟到的教训吧。

 

{ 本文链接: https://www.sy2k.com/2016/mysql%e4%bf%ae%e5%a4%8d%e7%bb%8f%e5%8e%86/;
原创文章, 转载请保留. 转载自 https://www.sy2k.com }