问题描述
为了查看已经连接了 MySQL 的都有哪些进程, 我们可以使用命令 show processlist
查看, 查看结果如下
mysql> show processlist;
+----+------+-----------------+----------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------------+----------+---------+------+----------+------------------+
| 29 | root | localhost:60378 | NULL | Sleep | 10 | | NULL |
| 30 | root | localhost:60379 | jdbcdemo | Sleep | 9 | | NULL |
| 31 | root | localhost:60380 | jdbcdemo | Query | 0 | starting | show processlist |
+----+------+-----------------+----------+---------+------+----------+------------------+
3 rows in set
其中 Command 一列是什么含义, 是根据访问 MySQL 的语句是什么类型的决定的吗? 如果是的话, 执行下面的语句
@Test
public void testUpdate() throws Exception {
String sql = "UPDATE t_student_day05 SET age = 32 WHERE name = '乔峰'";
// 1. 加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo","root","admin");
// 3. 获取语句对象
Statement statement = connection.createStatement();
// 4. 执行语句
Thread.sleep(5000);
System.out.println(statement.executeUpdate(sql));
// 5. 释放对象
statement.close();
connection.close();
}
连接到数据库的进程列表如下
+----+------+-----------------+----------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------------+----------+---------+------+----------+------------------+
| 29 | root | localhost:60378 | NULL | Sleep | 211 | | NULL |
| 30 | root | localhost:60379 | jdbcdemo | Sleep | 210 | | NULL |
| 31 | root | localhost:60380 | jdbcdemo | Query | 0 | starting | show processlist |
| 32 | root | localhost:60412 | jdbcdemo | Sleep | 4 | | NULL |
+----+------+-----------------+----------+---------+------+----------+------------------+
4 rows in set
新增的进程是 Sleep, 也不是 Update, 所以它代表了什么
问题解决
各列的含义和用途
- id
一个标识,你要 kill 一个语句的时候很有用
- user
显示单前用户,如果不是 root,这个命令就只显示你权限范围内的 sql 语句
- host
显示这个语句是从哪个 IP 的哪个端口上发出的。可以用来追踪出问题语句的用户
- db
显示这个进程目前连接的是哪个数据库
- command
显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)
- time
此这个状态持续的时间,单位是秒
- state
显示使用当前连接的 sql 语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state 只是语句执行中的某一个状态,一个 sql 语句,已查询为例,可能需要经过 copying to tmp table
,Sorting result
,Sending data
等状态才可以完成
- info
显示这个 sql 语句
kill 命令
如果你在一个容量大的表中执行增删改字段或执行一个复杂的 sql 查询导致 mysql 线程挂起.可用此命令查看出是哪些 sql 挂起,用 kill
命令把他 K 掉
kill 命令使用方法
- kill pid
如上例中我们想kill掉id为207的线程则执行
kill 207