今天朋友公司的测试期游戏官网出现问题,不能注册用户。环境是这样的一个官网web服务器,一个bbs服务器,公用一个mysql数据库服务器。分别在三台屋里服务器上,当前的症状就是,bbs一切正常,web官网可以访问,但是和数据库相关的操作,都有问题,点击页面,没有任何返回,请大家分析可能存在的问题。
       由于web的php和html页面都可以访问,可以排除是web服务器的问题,如果说是数据库的问题,但是论坛又可以跑的很好。这个地方就出现问题了,不过根据现在的情况,我们还是要先研究下数据库的问题。分析和排错如下:
 
         1、编写一个简单的连接数据库的测试脚本,看看是否可以成功,如果可以连接,排除连接问题。
         2、使用mysql客户端,登陆,show global status,看看有没有特别不靠谱的数据,发现connections比较不靠谱,Threads_相关的值都比较高,说明连接还是存在问题的,什么原因会导致连接数很高,并且不释放呢?
         3、show processlist; 发现一大堆locked的连接,看来有表出问题了,这样也就找到threads先关值居高不下的原因了。由于所获取不到锁资源,很多连接都在排队呢,当前threads就高了。看了下,都等待的是一个用户资源的表,估计这个表被死锁了,仔细看了下processlist,想杀掉正在query的连接,可是发现,没有死锁,只是执行的速度很慢,分析,应该是表坏了。就修复表,使用mysqlcheck --repair命令。先修复的用户资源的表,修复完后,关于这个表的锁立刻消失,但是问题还存在,慢慢的其他表又出现了locked,干脆一不做二不休,就把整个数据库的表都修复了一次。这下数据库好了。
        4、注册还是不行,一些功能可以了,我写了一个连接数据库,插入数据的脚本测试成功,数据库应该没问题才对。又折腾了一阵,原来是开始有问题的时候,PHP程序修改了连接数据库的函数,修改成老的,使用那个函数,会报错 not exits /var/lib/mysql.sock,大概这样的错误的,修改回去就好了。
   
          此次停机一共是1个多点小时,耽误注册估计有数百人吧。分析和修复数据库用了接近半个多小时,修复好以后,查找web的问题用了半个小时左右。
           这次问题,主要还是程序和运维配合不密切,运维对程序不太了解导致的。