重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

标题: MYSQL如何批量处理time高的的sleep状态连接用户 [打印本页]

作者: mahan    时间: 2025-11-23 21:47
标题: MYSQL如何批量处理time高的的sleep状态连接用户
要批量处理高Sleep时间的连接,可以通过SQL 查询筛选 + 批量终止的方式实现,以下是具体步骤:
步骤 1:筛选出需要终止的高 Sleep 连接
先执行 SQL 查询,筛选出Command为Sleep且Time超过阈值(例如超过 3600 秒,即 1 小时)的连接:

SELECT Id, User, Host, db, Time, State
FROM information_schema.PROCESSLIST
WHERE Command = 'Sleep'
  AND Time > 3600;  -- 可根据实际情况调整阈值,如1800(30分钟)、7200(2小时)等
步骤 2:批量生成终止连接的 SQL 语句
基于上述查询结果,生成KILL语句批量终止这些连接。可以通过SQL 拼接或 ** 脚本(如 Shell、Python)** 实现:
方式 1:纯 SQL 拼接(适用于临时手动处理)

SELECT CONCAT('KILL ', Id, ';') AS kill_statement
FROM information_schema.PROCESSLIST
WHERE Command = 'Sleep'
  AND Time > 3600;
执行后会得到一系列KILL [Id];的语句,复制这些语句执行即可批量终止。
方式 2:Shell 脚本自动化(更高效)
如果需要频繁处理,可编写 Shell 脚本结合mysql命令自动化执行:

#!/bin/bash

# 定义MySQL连接信息
USER="root"
PASSWORD="你的密码"
HOST="localhost"
PORT="3306"

# 定义Sleep时间阈值(秒)
THRESHOLD=3600

# 查询并生成KILL语句,然后执行
mysql -u${USER} -p${PASSWORD} -h${HOST} -P${PORT} -e "
SELECT CONCAT('KILL ', Id, ';')
FROM information_schema.PROCESSLIST
WHERE Command = 'Sleep'
  AND Time > ${THRESHOLD};
" | grep -v "CONCAT" | mysql -u${USER} -p${PASSWORD} -h${HOST} -P${PORT}
将脚本保存为kill_sleep_connections.sh,赋予执行权限(chmod +x kill_sleep_connections.sh)后运行即可批量终止高 Sleep 连接。
步骤 3:结合连接池与超时参数长效优化
批量终止是临时解决方案,需配合以下长效措施避免问题复发:
应用层:配置连接池的空闲超时(如 HikariCP 的idleTimeout、Druid 的maxIdleTime),让闲置连接自动回收。
MySQL 层:调整全局参数wait_timeout(如设置为 1800 秒,即 30 分钟),让长期闲置的连接自动断开:

SET GLOBAL wait_timeout = 1800;
通过 “临时批量终止 + 长效参数优化 + 应用层连接管理” 的组合策略,可彻底解决高Sleep连接堆积的问题。






欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2