问题现象:
突然发现某个应用进程自动退出,重新启动,仍然自动退出,如下图
感觉莫名其妙,好好的进程突然就自动停止了,查看日志也没有详细的错误信息。
因此使用老办法捕获控制台输出信息,java -jar xxx.jar
看到控制台错误输出:
可以看到异常说明很清楚,单用户的数据库连接数超过了最大限制。
问题解决:
1、首先查看系统设置的最大连接数
使用MySQL数据库root权限登录 执行以下SQL
show variables like'%connections%';
可以看到设置的系统最大连接数为10000,单用户最大为2000(原来是1000,因为不够用,我已经改大了)
2、查看此时使用的连接数
使用MySQL数据库root权限登录 执行以下SQL
SHOW STATUS like '%Threads%';
3、解决连接数不够的问题
修改连接数大小,执行SQL
set GLOBAL MAX_CONNECTIONS=10000; #MySQL运行最大连接数16384
set GLOBAL MAX_USER_CONNECTIONS=2000; #一定要大于第二步查到的连接数
该调整只是临时改大连接数,重启MySQL会失效,永久修改,编辑配置文件,添加配置
#vi /etc/my.cnf
[mysqld]
max_connections=10000
max_user_connections=2000
问题追踪:
因为之前程序都是正常运行的,突然就不行了。应该不是本程序的原因,是由于其他程序使用了同一个MySQL用户,导致数据库连接数超过最大值,可以通过数据库查找具体原因。
使用数据库超管用户登录,执行SQL
SELECT
USER as login_user,
DB as database_name,
LEFT(HOST,POSITION(':' IN HOST)-1) AS login_ip,
count(1) as conn_num
FROM `information_schema`.`PROCESSLIST` A
GROUP BY DB,USER,LEFT(HOST,POSITION(':' IN HOST)-1)
ORDER BY COUNT(1) DESC;
查询结果是:用户名|数据库名|连接IP|总连接数
据此可以排查出问题的应用程序