查看当前连接数
show status like 'Threads%';
Threads_running
当前连接数
按客户端 IP 分组,看哪个客户端的链接数最多
select client_ip,count(client_ip) as client_num from (select substring_index(host,':' ,1) as client_ip from information_schema.processlist ) as connect_info group by client_ip order by client_num desc;
查看正在执行的线程,并按 Time 倒排序,看看有没有执行时间特别长的线程
select * from information_schema.processlist where Command != 'Sleep' order by Time desc;
找出所有执行时间超过 5 分钟的线程,拼凑出 kill 语句,方便后面查杀 (此处 5分钟 可根据自己的需要调整SQL标红处)
select concat('kill ', id, ';') from information_schema.processlist where Command != 'Sleep' and Time > 300 order by Time desc;
查看数据库最大连接数
show global variables like 'max_conn%';
max_connections
设置的最大连接数
临时设置最大连接数
临时设置到 200 个连接数 set GLOBAL max_connections=200
显示当前运行的连接数
官方文档:SHOW PROCESSLIST语句
show processlist
或 show full processlist
-
id:用户登录 MySQL 时,系统分配的 connection_id 可以使用函数 connection_id() 查看,可以通过 kill 命令,加上这个 Id 值将这个线程杀掉
-
user:显示当前用户,如果不是 root 这个只显示用户权限范围的 SQL 语句
-
host:显示这个查询语句是从哪个地方发起的,可以用来跟踪出现问题语句的用户
-
DB:显示这个进程目前连接的是哪个数据库
-
command:显示当前连接的执行的命令,这个比较复杂,见下文描述
-
time:这个状态持续的时间,单位 秒
-
state:显示使用当前连接的 sql 语句的状态,很重要的列。state 描述的是语句执行中的某一个状态。一个 sql 语句,以查询为例,可能需要经过
copying to tmp table
、sorting result
、sending data
等状态才可以完成 -
info:显示这个sql语句,是判断问题语句的一个重要依据,默认只显示前100个字符,也就是你看到的语句可能是截断了的,要看全部信息,需要使用
show full processlist
Command 值详解
状态值 | 官方解释 | 自己理解 |
---|---|---|
Binlog Dump | 主节点正在将二进制日志 ,同步到从节点 | 待说明 |
Change User | 正在执行一个 change-user 的操作 | 待说明 |
Close Stmt | 正在关闭一个Prepared Statement 对象 | 待说明 |
Connect | 一个从节点连上了主节点 | 待说明 |
Connect Out | 一个从节点正在连主节点 | 待说明 |
Create DB | 正在执行一个create-database 的操作 | 待说明 |
Daemon | 服务器内部线程,而不是来自客户端的链接 | 待说明 |
Debug | 线程正在生成调试信息 | 待说明 |
Delayed Insert | 该线程是一个延迟插入的处理程序 | 待说明 |
Drop DB | 正在执行一个 drop-database 的操作 | 待说明 |
Execute | 正在执行一个 Prepared Statement | 待说明 |
Fetch | 正在从Prepared Statement 中获取执行结果 | 待说明 |
Field List | 正在获取表的列信息 | 待说明 |
Init DB | 该线程正在选取一个默认的数据库 | 待说明 |
Kill | 正在执行 kill 语句,杀死指定线程 | 待说明 |
Long Data | 正在从Prepared Statement 中检索 long data | 待说明 |
Ping | 正在处理 server-ping 的请求 | 待说明 |
Prepare | 该线程正在准备一个 Prepared Statement | 待说明 |
ProcessList | 该线程正在生成服务器线程相关信息 | 待说明 |
Query | 该线程正在执行一个语句 | 待说明 |
Quit | 该线程正在退出 | 待说明 |
Refresh | 该线程正在刷表,日志或缓存;或者在重置状态变量,或者在复制服务器信息 | 待说明 |
Register Slave | 正在注册从节点 | 待说明 |
Reset Stmt | 正在重置 prepared statement | 待说明 |
Set Option | 正在设置或重置客户端的 statement-execution 选项 | 待说明 |
Shutdown | 正在关闭服务器 | 待说明 |
Sleep | 正在等待客户端向它发送执行语句 | 待说明 |
Statistics | 该线程正在生成 server-status 信息 | 待说明 |
Table Dump | 正在发送表的内容到从服务器 | 待说明 |
Time | Unused | 待说明 |
模拟连接数过多
#!/bin/bash
set j=2
while true
do
let "j=j+1"
/usr/local/mysql/bin/mysqlslap -a -c 500 -i 10 -uroot -p1234.com
done