Mysql----在持续集成(CI)的流程测试环境对应的Mysql数据库报无法连接错误问题的解决办法

【原文链接】Mysql----在持续集成(CI)的流程测试环境对应的Mysql数据库报无法连接错误问题的解决办法

问题:

在持续集成环境中,比如基于kubersnets平台持续的构建销毁POD,在这种环境下,出现Mysql数据库无法连接,连接数过多等问题。

原因分析

(1)首先查看mysql的如下两类全局变量,一类是超时变量,如下所示

mysql> show variables like "%timeout%";

另外一类是连接数变量

mysql> show variables like "%connections%";

(2)再查看一下当前连接数

mysql> SELECT substring_index(host, ':',1) AS host_name,state,count(*) FROM information_schema.processlist GROUP BY state,host_name;

(3)通过上述三组数据对比分析,可以发现在持续集成环境中,比如基于k8s平台,由于应用服务的POD会被不断的销毁新建,而每次新建的时候,服务都会与mysql数据库建立若干个连接,而当POD销毁时,客户端的mysql连接断了,但是服务端的连接并未断,此后mysql服务端的连接将保持空闲,等待wait_timeout超时,而问题也在这里,mysql默认的wait_timeout设置为8小时即28800秒,这就导致已经建立的连接将继续存活8小时,就这样持续集成环境部署的新POD不断的建立新连接,而再查看数据库的最大连接数配置,mysql默认配置了最大连接数为151,分析至此,问题已经很明显了,首先mysql超时设置太长了,对于持续集成环境的mysql不适合,另外一个最大连接数太小了,只有151个,很容易就占满了。

解决方案

根据分析的问题原因即可得出如下解决方案。
(1)将最大连接数设置大一点

mysql> set global max_connections=1000;
mysql> set global max_user_connections=1000;
mysql> set global mysqlx_max_connections=1000;

(2)将超时设置更小,比如600秒即十分钟

mysql> set global wait_timeout=600;
mysql> set global mysqlx_wait_timeout=1000;
mysql> set global interactive_timeout=1000;
mysql> set global mysqlx_interactive_timeout=1000;

至此,问题就可以解决了,当然这种配置方式是临时解决方案,如果想彻底解决,需要在myslq的配置文件中修改对应的配置参数,然后重启数据库。上面这种通过mysql命令修改的方式,当数据库重启后就失效了。

猜你喜欢

转载自blog.csdn.net/redrose2100/article/details/130269984