文章目录

  • 使用 SHOW 命令查看连接线程
  • 使用 information_schema.processlist
  • 使用 performance_schema.threads
  • 使用 mysqladmin 工具查看连接线程
  • 使用 CONNECTION_ID() 函数查看当前连接
  • 使用 KILL 命令终止线程
  • 使用 mysqladmin 工具终止线程

大家好,我是只谈技术不剪发的 Tony 老师,今天给大家介绍一下如何如何查看和终止(kill)MySQL 的连接线程。

当我们连接 MySQL 服务器遇到“too many connections”这种连接数过多的错误时,或者由于其他原因需要找出目前存在哪些客户端的连接线程,并进一步进行处理。

使用 SHOW 命令查看连接线程

每个MySQL 客户端的连接都对应一个服务器端的线程,使用 SHOW PROCESSLIST 命令可以查看连接线程的详细信息:

mysql> show processlist;
+----+-----------------+--------------------+------+---------+--------+------------------------+------------------+
| Id | User            | Host               | db   | Command | Time   | State                  | Info             |
+----+-----------------+--------------------+------+---------+--------+------------------------+------------------+
|  7 | event_scheduler | localhost          | NULL | Daemon  | 389855 | Waiting on empty queue | NULL             |
| 32 | root            | localhost          | NULL | Query   |      0 | starting               | show processlist |
| 33 | root            | 192.168.56.1:54174 | hrdb | Sleep   |     19 |                        | NULL             |
| 34 | root            | 192.168.56.1:54175 | hrdb | Sleep   |      3 |                        | NULL             |
| 35 | root            | 192.168.56.1:54176 | hrdb | Sleep   |      3 |                        | NULL             |
+----+-----------------+--------------------+------+---------+--------+------------------------+------------------+
5 rows in set (0.00 sec)

查询结果中每个字段的意义如下:

  • Id - 连接的唯一标识;
  • User - 客户端的用户名,event_scheduler 是监控计划事件的线程;
  • Host - 客户端的主机名和端口号;
  • db - 默认的数据库,如果没有设置显示为 NULL;
  • Command - 该线程正在执行的命令类型;
  • Time - 该线程处于当前状态的秒数;
  • State - 该线程正在执行的操作、事件或者状态;
  • Info - 该线程正在执行的语句,NULL 表示没有执行任何语句。show processlist;命令只会显示 Info 字段中的前 100 个字符;如果想全部列出内容,可以使用show full processlist;命令。

如果拥有 PROCESS 权限,可以看到所有用户的连接线程;否则只能看到使用当前用户名连接的线程。

另外,我们也可以使用以下命令查看当前连接的数量:

mysql> show status where variable_name = 'threads_connected';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 4     |
+-------------------+-------+
1 row in set (0.01 sec)

该命令返回的连接数量只包含用户连接的线程,不包含系统连接的线程。

MySQL 允许的最大连接数可以使用 max_connections 变量查看:

mysql> select @@max_connections;
+-------------------+
| @@max_connections |
+-------------------+
|               151 |
+-------------------+
1 row in set (0.00 sec)

mysqld 实际上允许 max_connections + 1 个客户端连接,其中额外的 1 个连接保留给具有 CONNECTION_ADMIN (以前的 SUPER)权限的用户,以便连接数过多时管理员仍然可以连接服务器诊断问题。

使用 information_schema.processlist

我们也可以通过 information_schema.processlist 表查看连接线程:

mysql> select * -> from information_schema.processlist-> order by id;
+----+-----------------+--------------------+------+---------+--------+------------------------+----------------------------------------------------------+
| ID | USER            | HOST               | DB   | COMMAND | TIME   | STATE                  | INFO                                                     |
+----+-----------------+--------------------+------+---------+--------+------------------------+----------------------------------------------------------+
|  7 | event_scheduler | localhost          | NULL | Daemon  | 390338 | Waiting on empty queue | NULL                                                     |
| 32 | root            | localhost          | NULL | Query   |      0 | executing              | select *
from information_schema.processlist
order by id |
| 33 | root            | 192.168.56.1:54174 | hrdb | Sleep   |    502 |                        | NULL                                                     |
| 34 | root            | 192.168.56.1:54175 | hrdb | Sleep   |    486 |                        | NULL                                                     |
| 35 | root            | 192.168.56.1:54176 | hrdb | Sleep   |    486 |                        | NULL                                                     |
+----+-----------------+--------------------+------+---------+--------+------------------------+----------------------------------------------------------+
5 rows in set (0.00 sec)

information_schema.processlist 表中的数据与SHOW FULL PROCESSLIST命令的输出结果相同。

使用 performance_schema.threads

performance_schema.threads 表中存储了所有线程的详细信息,包括各种 MySQL 后台服务器线程。例如:

mysql> SELECT * FROM performance_schema.threads;
+-----------+---------------------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
| THREAD_ID | NAME                                        | TYPE       | PROCESSLIST_ID | PROCESSLIST_USER | PROCESSLIST_HOST | PROCESSLIST_DB | PROCESSLIST_COMMAND | PROCESSLIST_TIME | PROCESSLIST_STATE          | PROCESSLIST_INFO                                                                                                                                                                                                                                                                                                | PARENT_THREAD_ID | ROLE | INSTRUMENTED | HISTORY | CONNECTION_TYPE | THREAD_OS_ID | RESOURCE_GROUP |
+-----------+---------------------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
|         1 | thread/sql/main                             | BACKGROUND |           NULL | NULL             | NULL             | mysql          | NULL                |           391020 | NULL                       | NULL                                                                                                                                                                                                                                                                                                            |             NULL | NULL | YES          | YES     | NULL            |        26586 | SYS_default    |
|         3 | thread/innodb/io_ibuf_thread                | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL                       | NULL                                                                                                                                                                                                                                                                                                            |             NULL | NULL | YES          | YES     | NULL            |        26593 | SYS_default    |
|         4 | thread/innodb/io_log_thread                 | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL                       | NULL                                                                                                                                                                                                                                                                                                            |             NULL | NULL | YES          | YES     | NULL            |        26594 | SYS_default    |
|         5 | thread/innodb/io_read_thread                | BACKGROUND |           NULL | NULL             | NULL             | NULL           | NULL                |             NULL | NULL                       | NULL                                                                                                                                                                                                                                                                                                            |             NULL | NULL | YES          | YES     | NULL            |        26595 | SYS_default    |
...
|        72 | thread/sql/one_connection                   | FOREGROUND |             32 | root             | localhost        | NULL           | Query               |                0 | executing                  | SELECT * FROM performance_schema.threads                                                                                                                                                                                                                                                                        |             NULL | NULL | YES          | YES     | Socket          |        17087 | USR_default    |
|        73 | thread/sql/one_connection                   | FOREGROUND |             33 | root             | 192.168.56.1     | hrdb           | Sleep               |             1184 | NULL                       | /* ApplicationName=DBeaver 7.0.4 - Main */ SELECT DATABASE()                                                                                                                                                                                                                                                    |             NULL | NULL | YES          | YES     | TCP/IP          |        22232 | USR_default    |
|        74 | thread/sql/one_connection                   | FOREGROUND |             34 | root             | 192.168.56.1     | hrdb           | Sleep               |             1168 | NULL                       | /* ApplicationName=DBeaver 7.0.4 - Metadata */ SELECT kc.CONSTRAINT_NAME,kc.TABLE_NAME,kc.COLUMN_NAME,kc.ORDINAL_POSITION
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kc WHERE kc.TABLE_SCHEMA='hrdb' AND kc.REFERENCED_TABLE_NAME IS NULL AND kc.TABLE_NAME='job'
ORDER BY kc.CONSTRAINT_NAME,kc.ORDINAL_POSITION |             NULL | NULL | YES          | YES     | TCP/IP          |        22231 | USR_default    |
|        75 | thread/sql/one_connection                   | FOREGROUND |             35 | root             | 192.168.56.1     | hrdb           | Sleep               |             1168 | NULL                       | /* ApplicationName=DBeaver 7.0.4 - SQLEditor <Script-19.sql> */ SELECT DATABASE()                                                                                                                                                                                                                               |             NULL | NULL | YES          | YES     | TCP/IP          |        22229 | USR_default    |
+-----------+---------------------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
46 rows in set (0.00 sec)

查询结果返回了 46 条记录。其中,THREAD_ID 是线程的唯一标识;PROCESSLIST_ID 对应了SHOW PROCESSLIST语句和 information_schema.processlist 表中的 id;PROCESSLIST_USER、PROCESSLIST_HOST 等字段也是如此。

performance_schema.threads 表和其他方式存在一些不同之处:

  • 对服务器的性能影响更小,因为访问该表不需要 mutex 互斥锁;
  • 提供了更多的信息,例如线程属于前台还是后台线程,线程在服务器中的位置等;
  • 提供了后台线程的信息,可以用于 DBA 执行监控;
  • 可以启用或者禁用线程监控和历史事件记录。

使用 mysqladmin 工具查看连接线程

mysqladmin 是一个用于 MySQL 服务器管理的客户端工具,支持查看连接线程信息:

[root@sqlhost ~]#  mysqladmin -u root -p processlist
Enter password:
+----+-----------------+--------------------+------+---------+--------+------------------------+------------------+
| Id | User            | Host               | db   | Command | Time   | State                  | Info             |
+----+-----------------+--------------------+------+---------+--------+------------------------+------------------+
| 7  | event_scheduler | localhost          |      | Daemon  | 390747 | Waiting on empty queue |                  |
| 32 | root            | localhost          |      | Sleep   | 409    |                        |                  |
| 33 | root            | 192.168.56.1:54174 | hrdb | Sleep   | 911    |                        |                  |
| 34 | root            | 192.168.56.1:54175 | hrdb | Sleep   | 895    |                        |                  |
| 35 | root            | 192.168.56.1:54176 | hrdb | Sleep   | 895    |                        |                  |
| 37 | root            | localhost          |      | Query   | 0      | starting               | show processlist |
+----+-----------------+--------------------+------+---------+--------+------------------------+------------------+

从返回结果可以看出, mysqladmin processlist命令实际上是调用了SHOW PROCESSLIST语句。如果给该命令加上–version 或者 -V 选项,实际调用的是SHOW FULL PROCESSLIST语句。

使用 CONNECTION_ID() 函数查看当前连接

使用 CONNECTION_ID() 函数可以查看当前会话的线程 id:

mysql> SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              32 |
+-----------------+
1 row in set (0.00 sec)

使用 KILL 命令终止线程

使用 KILL 命令可以终止服务器端的连接线程:

KILL [CONNECTION | QUERY] pid;

其中,pid 是通过上述各种方式获取到的连接标识。KILL支持两个选项:

  • KILL CONNECTION终止该连接正在执行的语句之后终止连接线程,这是默认值;
  • KILL QUERY终止该连接正在执行的语句,但不会终止连接线程。

我们终止线程 id 为 33 的连接:

mysql> kill 33;
Query OK, 0 rows affected (0.02 sec)

此时,如果我们在被终止连接的客户端执行任何语句,都会得到以下错误信息:

mysql> select 1;
ERROR 2006 (HY000): MySQL server has gone away

终止连接线程和语句需要一定的权限:

  • 如果没有 CONNECTION_ADMIN(以前的 SUPER)权限,只能终止自己的线程和语句;
  • 如果拥有 CONNECTION_ADMIN(以前的 SUPER)权限,可以终止所有的线程和语句;如果终止的是以 SYSTEM_USER 权限运行的线程和语句,执行命令的会话也必须具有 SYSTEM_USER 权限。

使用 mysqladmin 工具终止线程

另一种终止线程的方式是使用 mysqladmin 工具。以下命令可以终止 id 为 34 和 35 的连接线程:

[root@sqlhost ~]#  mysqladmin -u root -p kill 34,35
Enter password:

注意,逗号前后没有空格。

定期更新数据库领域相关文章,欢迎关注❤️、评论

MySQL 查看和终止正在运行的连接线程相关推荐

  1. 如何正确的终止正在运行的子线程

    最近开发一些东西,线程数非常之多,当用户输入Ctrl+C的情形下,默认的信号处理会把程序退出,这时有可能会有很多线程的资源没有得到很好的释放,造成了内存泄露等等诸如此类的问题,本文就是围绕着这么一个使 ...

  2. c++thread里暂停线程_C语言如何正确的终止正在运行的子线程

    最近开发一些东西,线程数非常之多,当用户输入Ctrl+C的情形下,默认的信号处理会把程序退出,这时有可能会有很多线程的资源没有得到很好的释放,造成了内存泄露等等诸如此类的问题,本文就是围绕着这么一个使 ...

  3. pthread之如何正确的终止正在运行的子线程

    最近开发一些东西,线程数非常之多,当用户输入Ctrl+C的情形下,默认的信号处理会把程序退出,这时有可能会有很多线程的资源没有得到很好的释放,造成了内存泄露等等诸如此类的问题,本文就是围绕着这么一个使 ...

  4. Linux中查看及终止正在运行的后台程序

    linux 任务管理-后台运行与终止 fg.bg.jobs.&.ctrl + z命令 一. & 加在一个命令的最后,可以把这个命令放到后台执行 ,如gftp &, 二.ctrl ...

  5. MySQL查看连接数和进程信息

    1.查看连接信息 myusql > show status like '%connect%'; Aborted_connects 尝试连接到MySQL服务器失败的次数, Threads_conn ...

  6. MySql 查看连接数和状态

    查看链接信息 myusql > show status like '%connect%'; Aborted_connects 尝试连接到MySQL服务器失败的次数, Threads_connec ...

  7. MySQL查看正在运行的SQL

    MySQL查看正在运行的SQL 前言 ​ 在安装MySQL的时候会默认初始化几个MySQL运行所需的数据库:mysql, sys, information_schema, performance_sc ...

  8. 查看和终止 Oracle 连接会话以及正在执行的 SQL 语句

    文章目录 查看当前连接的会话 终止正在执行的 SQL 语句 终止指定的连接会话 通过 SQL 命令终止连接会话 通过操作系统命令终止连接会话 总结 大家好,我是只谈技术不剪发的 Tony 老师.作为 ...

  9. 【mysql】Mysql查看连接数(连接总数、活跃数、最大并发数)

    1 2 show variables like '%max_connection%'; 查看最大连接数 set global max_connections=1000;        重新设置最大连接 ...

最新文章

  1. 2022-2028年中国无滴消雾大棚膜行业市场研究及前瞻分析报告
  2. java中如果写设置密码,在java中编写一个多字母换位密码[关闭]
  3. ArcGIS Engine 开发中用到的一些命名空间和类
  4. bin二进制文件的运行
  5. LinkedList和ArrayList的区别
  6. 21-爬虫之scrapy框架selenium的使用08
  7. pandas的DataFrame转化为Datatable的DataFrame
  8. Async Solr Queries in Python
  9. SAP BTP Launchpad Service 打不开应用的权限问题
  10. matlab scope 怎么调出,Matlab Figure图形保存以及Simulink中Scope窗口调出figure菜单
  11. 电信移动中兴B860AV2.1-1.1T-1.2系列晶晨S905L芯片-刷机固件包
  12. docker 中文文档
  13. scum服务器在线玩家,SCUM服务器选择推荐 官服跟私服有什么区别
  14. 【读书笔记】《正面管教》——我们都不完美,但我们相处的很快乐
  15. 物理层-计算机网络知识汇总(二)|Zam9036博客
  16. C语言编程学习制作最好玩的报数游戏
  17. This Apple ID has not yet been used in the ITunes Store/此Apple ID尚未在iTunes Store使用过
  18. 泉州地区的“会子”是一种怎样的制度?
  19. CAN休眠唤醒压力测试
  20. 破解打开证书加密的PDF文档-数字证书(电子书私钥)下载和导入教程

热门文章

  1. 程序猿进化 - 在拉钩子1024对APE节讲座计划
  2. 定义一个xml文件,保存班级信息
  3. cad转pdf格式怎么设置线宽
  4. 移动端下拉刷新与页面内滑动冲突问题 iscroll 固定行表头 苹果下拉反弹
  5. 马尔科夫细致平稳条件
  6. 中国广电明年推进5G覆盖乡镇,用户:和中国移动相比信号有何优势?
  7. SpringBoot @Vaild注解拦截不生效
  8. 解码快手新市井电商,新品牌流量多,大品牌政策好
  9. 高德地图两个不同的的功能合并
  10. 三星Note9的优秀与不足,能承担单骑救主的重任么?