一、环境信息
mysql 5.7.41 ARM
二、问题特征
每隔一段时间,mysql都会出现“too many connections”报错。出现此报错时,mysql无法连接。
三、原因分析
1、数据库访问量过高;
2、max_connections值过小;
3、连接一直没有被释放。
四、问题排查
1、数据库访问量排查
查看mysql当前连接数量
mysql -uroot -h127.0.0.1 -P3306 -e "show processlist" |wc -l
排查是哪些动作用了这些连接
mysql -uroot -h127.0.0.1 -P3306 -e "show full processlist"
或者
mysql -uroot -h127.0.0.1 -P3306 -e "show full processlist" >/tmp/mysql_error.log
如果你可以直接连接mysql, 可以使用
show full processlist
分析哪些SQL耗时,连接数量过多,可以通过SQL性能调优,修改业务代码逻辑,降低访问数量,提升访问性能。
2、max_connections值过小
SHOW VARIABLES LIKE '%max_connections%';
mysql默认的最大链接数很小,可以根据自己部署的服务器的性能以及业务最大的访问量做调整。
临时设置:
set max_connections = 500
这种方式设置服务重启之后会失效
3、连接一直没有被释放
检查interactive_timeout和wait_timeout的值是否设置的过大
interactive_timeout:一个持续SLEEP状态的线程多久被关闭。线程每次被使用都会被唤醒为activity状态,执行完Query后成为interactive状态,重新开始计时。
wait_timeout:不同在于只作用于TCP/IP和Socket链接的线程,意义是一样的
查询参数值
SHOW GLOBAL VARIABLES LIKE '%timeout%'
如果这两个参数值设置过大,可以修改小一点
SET GLOBAL interactive_timeout = 60;
SET GLOBAL wait_timeout = 60;
这种方式设置服务重启之后会失效
五、docker-swarm部署的arm版本的mysql配置文件挂载
本文所述版本的mysql容器内部配置文件路径:/opt/bitnami/mysql/conf/my.cnf
如果你发现配置文件无论怎么挂载都会报错,可尝试以下方式
方式一:配置
1、准备好mysql配置文件,建议从mysql容器内部粘贴出来
修改好配置,并给配置文件添加权限:chmod 777 服务器上Mysql配置文件全路径以及文件名称
2、在服务器上执行
docker config create mysql-config 服务器上Mysql配置文件全路径以及文件名称
3、修改mysql的docker-compose.yml,增加配置
configs:
- source: mysql-config
target: mysql容器内部配置文件名称
4、重新部署服务
方式二、秘密
1、准备好mysql配置文件,建议从mysql容器内部粘贴出来
修改好配置,并给配置文件添加权限:chmod 777 服务器上Mysql配置文件全路径以及文件名称
2、在服务器上执行
docker secret create mysql-config 服务器上Mysql配置文件全路径以及文件名称
3、修改mysql的docker-compose.yml,增加配置
secrets:
- source: mysql-config
target: mysql容器内部配置文件名称
4、重新部署服务
六、mysql配置文件添加项
[mysqld]
max_connections=500
interactive_timeout=120
wait_timeout=120
七、参考文献
1、https://zhuanlan.zhihu.com/p/684159134
2、https://docs.pingcode.com/ask/31817.html
3、https://blog.51cto.com/u_16099321/7536929