早上发现测试环境mysql服务出现了”too many coonection”的问题,记录下解决过程。
试图定位
连接过多,连续登录也无法入库,这时候先去查看了
/etc/my.cnf
,发现预设的连接数max_connection=500
,排除了预设不足的问题确认现场
使用
netstat -plan | grep 3306
查看已经存在的连接,发现已经到上限,果然还是不行重启服务
/etc/init.d/mysql restart
正常stop,但是start时出现
manager of pid-file quit without updating file
,检查文件后发现正常,检查磁盘发现磁盘满了= =,清理文件后,正常启动重新定位
重启后执行
show processlist;
,发现有很多线程状态是waiting for table
, 而且基本都是一些写操作(insert)
,感觉很奇怪,google了一下发现可能是有系统线程lock了表导致其他任务等待,进一步查询发现有一个checking table
的线程,kill之后,处于等待状态的任务被迅速执行完毕,基本确定是这里的问题。mysql系统任务
mysql系统会定期执行一些维护的任务,
check table
就是其中的一类,当然也可以手动执行(本质上都是命令),它用于检查一个或多个表是否有错误。CHECK TABLE
对MyISAM
和InnoDB
表有作用。这里,check
比较重要的一点就是,执行期间会将相应的表锁定,而且如果参数不当会导致执行时间过长,对于任务密集的表来说,要谨慎操作。