记一次 mysql 'too many connection'

早上发现测试环境mysql服务出现了”too many coonection”的问题,记录下解决过程。

  1. 试图定位

    连接过多,连续登录也无法入库,这时候先去查看了/etc/my.cnf,发现预设的连接数max_connection=500,排除了预设不足的问题

  2. 确认现场

    使用netstat -plan | grep 3306查看已经存在的连接,发现已经到上限,果然还是不行

  3. 重启服务

    /etc/init.d/mysql restart

    正常stop,但是start时出现manager of pid-file quit without updating file,检查文件后发现正常,检查磁盘发现磁盘满了= =,清理文件后,正常启动

  4. 重新定位

    重启后执行show processlist;,发现有很多线程状态是waiting for table, 而且基本都是一些写操作(insert),感觉很奇怪,google了一下发现可能是有系统线程lock了表导致其他任务等待,进一步查询发现有一个checking table的线程,kill之后,处于等待状态的任务被迅速执行完毕,基本确定是这里的问题。

  5. mysql系统任务

    mysql系统会定期执行一些维护的任务,check table就是其中的一类,当然也可以手动执行(本质上都是命令),它用于检查一个或多个表是否有错误。CHECK TABLEMyISAMInnoDB表有作用。这里,check比较重要的一点就是,执行期间会将相应的表锁定,而且如果参数不当会导致执行时间过长,对于任务密集的表来说,要谨慎操作。