首先查看下数据库的最大连接数
SHOW VARIABLES LIKE 'max_connections';
查看下当前数据库的连接数
SHOW STATUS WHERE `variable_name` = 'Threads_connected';
当达到或者接近最大连接数的时候 数据库就会报too many connection
接着我们看下到底是哪些机器的线程占用了我们的连接数
SHOW PROCESSLIST;
一般是由于高并发引起的或者测试环境造数 测试人员操作不当开启了很多线程造成的
SELECT CONNECTION_ID() AS Current_Connection_ID,
GROUP_CONCAT(id ORDER BY id SEPARATOR ', ') AS Thread_IDs
FROM information_schema.processlist
WHERE command != 'Sleep'
AND id != CONNECTION_ID();
SELECT id
FROM information_schema.processlist
WHERE
# command != 'Sleep' AND
# HOST like '192.168.16.189%' and
id != CONNECTION_ID() and
USER='your_database_name';
确定了是哪些线程后,我们就可以生成杀死这些线程的SQL
SELECT
CONCAT('KILL ', id, ';')
FROM
information_schema.processlist
WHERE
# host like '192.168.16.189%' and
USER='apps_ohub_uat';
也可以像下面这样优雅的进行删除
SELECT
CONCAT('KILL ', id, ';')
INTO @kill_commands
FROM
information_schema.processlist
WHERE
host = '特定IP';
PREPARE stmt FROM @kill_commands;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
杀完之后 我们再查一下现在的连接数
SHOW STATUS WHERE `variable_name` = 'Threads_connected';