查看当前连接数

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 processlistshow full processlist

  • id:用户登录 MySQL 时,系统分配的 connection_id 可以使用函数 connection_id() 查看,可以通过 kill 命令,加上这个 Id 值将这个线程杀掉

  • user:显示当前用户,如果不是 root 这个只显示用户权限范围的 SQL 语句

  • host:显示这个查询语句是从哪个地方发起的,可以用来跟踪出现问题语句的用户

  • DB:显示这个进程目前连接的是哪个数据库

  • command:显示当前连接的执行的命令,这个比较复杂,见下文描述

  • time:这个状态持续的时间,单位 秒

  • state:显示使用当前连接的 sql 语句的状态,很重要的列。state 描述的是语句执行中的某一个状态。一个 sql 语句,以查询为例,可能需要经过 copying to tmp tablesorting resultsending 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