记一次MySQL 1135错误及解决

公司同事的朋友MySQL库有问题,想让帮忙看看。

1.报错信息:mysql cannot create thread、 mysql无法创建新的线程。

图片

1.第一时间想到是不是连接不够了。实际上连接还未满,排除连接数原因。

图片


2.应为是高并发系统,检查了下数据库参数innodb_thread_concurrency=32,测试是不是这个参数影响,改为0后,没啥用,排除问题


3.查看数据库open_files_limits 发现参数限制打开文件数为5000个,感觉有点不够。(图为本机的),于是修改open_file_limits参数为65535,修改过程如下。

图片


查看官方文档:open_files_limits mysql官方描述,此参数是全局只读的,不可修改,自动控制的


wanted_files= 10+max_connections+table_cache_size*2;=10+3000+64*2=3138 max_connections*5=15000

open_files_limit 在my.cnf配置时候的值


如果不配置就是wanted_files max_connections*5 和ulimit -n中的最大者


那如何手动修改?找了一会后,需要修改mysql注册服务文件,limitNOFILE参数。修改后需要 systemctl daemon-reload生效。

图片



修改后,重启mysql服务,查看open_files_limits参数,修改成功。

图片


3,修改成功压测,还是1135 ,google几篇文章后,有说MySQL bug的,看了MySQL官方论坛问题,大部分说Ulimit 设置问题,于是检查服务器ulimit设置,发现最大文件打开数5000

ulimit

-a 查看配置

-n最大文件打开数

-u 进程数目:用户最多可启动进程

发现不是特别大,但是也算正常 ulimit -n显示的7000多,可能也有人调整过。于是建议调整为65535重启服务器后,问题依然还在1135,于是怀疑还有什么限制。


网上说有几个地方设置会覆盖limits.conf 配置。里面的配置会覆盖limits.conf,于是让去查找问题服务器,就是没发现这个东西。脑瓜疼。

图片


4.第二天一大早,想想是不是他们操作系统的限制问题是不是在别的地方,于是乎find / - name *-nproc.conf 然而啥都没,于是想想google看看是不是limits.conf 设置不生效,山回路转,柳暗花明,突然看到个博客说sesu操作系统的limits.conf设置了也不生效的。

图片


博客中说:

SUSE 12上增加了systemd的资源控制,其中默认参数为 #DefaultTasksMax=512,限制MySQL打开进程数最大512 ,一下想起来昨晚压测试后看到mysql 连接到512就不动了。


于是操作一波:

service mysql status 没看错,就是限制512,突然有点眉目,改

图片


改成65535

/etc/systemd/system.conf,修改DefaultTasksMax的值为65535,后面的值可根据需要修改,修改后systemctl daemon-reload。

查看是否修改成功:

图片

5.重新压测,1135消失,终于算是解决了,后续的事情就是调整优化参数咯


6.总结,问题出在和线程相关的报错。理解:MySQL 连接到数据库服务,实际上是打开linux的一个文件句柄,从服务器最大文件打开数、用户最多启动线程数入手,排查问题, 历经修改数据库最大文件打开数,服务器最大文件打开数、最大线程数等,最终发现SUSE 12上增加了systemd的资源控制,其中默认参数为 #DefaultTasksMax=512,限制MySQL打开进程数最大512。对于Centos系统会限制的地方在/etc/security/limits.d/下面,*-nproc.conf会覆盖/etc/security/limits.conf配置



猜你喜欢

转载自blog.51cto.com/15060546/2650694
今日推荐