广告
返回顶部
首页 > 资讯 > 数据库 >MySQL kill不掉线程的原因
  • 243
分享到

MySQL kill不掉线程的原因

MySQLkill线程MySQLkill不掉线程 2022-05-15 03:05:48 243人浏览 安东尼
摘要

背景 在日常的使用过程中,时不时会遇到个别,或者大量的连接堆积在 Mysql 中的现象,这时一般会考虑使用 kill 命令强制杀死这些长时间堆积起来的连接,尽快释放连接数和数据库服务器的 CPU 资源。 问题描述

背景

在日常的使用过程中,时不时会遇到个别,或者大量的连接堆积在 Mysql 中的现象,这时一般会考虑使用 kill 命令强制杀死这些长时间堆积起来的连接,尽快释放连接数和数据库服务器的 CPU 资源。

问题描述

在实际操作 kill 命令的时候,有时候会发现连接并没有第一时间被 kill 掉,仍旧在 processlist 里面能看到,但是显示的 Command 为 Killed,而不是常见的 Query 或者是 Execute 等。例如:


mysql> show processlist;
+----+------+--------------------+--------+---------+------+--------------+---------------------------------+
| Id | User | Host               | db     | Command | Time | State        | Info                            |
+----+------+--------------------+--------+---------+------+--------------+---------------------------------+
| 31 | root | 192.168.1.10:50410 | sbtest | Query   |    0 | starting     | show processlist                |
| 32 | root | 192.168.1.10:50412 | sbtest | Query   |   62 | User sleep   | select sleep(3600) from sbtest1 |
| 35 | root | 192.168.1.10:51252 | sbtest | Killed  |   47 | Sending data | select sleep(100) from sbtest1  |
| 36 | root | 192.168.1.10:51304 | sbtest | Query   |   20 | Sending data | select sleep(3600) from sbtest1 |
+----+------+--------------------+--------+---------+------+--------------+---------------------------------+

原因分析

遇事不决先翻官方文档,这里摘取部分官方文档的内容:

When you use KILL, a thread-specific kill flag is set for the thread. In most cases, it might take some time for the thread to die because the kill flag is checked only at specific intervals:During SELECT operations, for ORDER BY and GROUP BY loops, the flag is checked after reading a block of rows. If the kill flag is set, the statement is aborted.
      ALTER TABLE operations that make a table copy check the kill flag periodically for each few copied rows read from the original table. If the kill flag was set, the statement is aborted and the temporary table is deleted.
      The KILL statement returns without waiting for confirmation, but the kill flag check aborts the operation within a reasonably small amount of time. Aborting the operation to perfORM any necessary cleanup also takes some time.
      During UPDATE or DELETE operations, the kill flag is checked after each block read and after each updated or deleted row. If the kill flag is set, the statement is aborted. If you are not using transactions, the changes are not rolled back.
      GET_LOCK() aborts and returns NULL.
      If the thread is in the table lock handler (state: Locked), the table lock is quickly aborted.
      If the thread is waiting for free disk space in a write call, the write is aborted with a “disk full” error message.

官方文档第一段就很明确的说清楚了 kill 的作用机制:会给连接的线程设置一个线程级别的 kill 标记,等到下一次“标记检测”的时候才会生效。这也意味着如果下一次“标记检测”迟迟没有发生,那么就有可能会出现问题描述中的现象。

官方文档中列举了不少的场景,这里根据官方的描述列举几个比较常见的问题场景:

  • select 语句中进行 order by,group by 的时候,如果服务器 CPU 资源比较紧张,那么读取/获取一批数据的时间会变长,从而影响下一次“标记检测”的时间。
  • 对大量数据进行 DML 操作的时候,kill 这一类 sql 语句会触发事务回滚(InnoDB引擎),虽然语句被 kill 掉了,但是回滚操作也会非常久。
  • kill alter 操作时,如果服务器的负载比较高,那么操作一批数据的时间会变长,从而影响下一次“标记检测”的时间。
  • 其实参考 kill 的作用机制,做一个归纳性的描述的话,那么:任何阻塞/减慢 SQL 语句正常执行的行为,都会导致下一次“标记检测”推迟、无法发生,最终都会导致 kill 操作的失败。

模拟一下

这里借用一个参数innodb_thread_concurrency来模拟阻塞 SQL 语句正常执行的场景:

Defines the maximum number of threads permitted inside of InnoDB. A value of 0 (the default) is interpreted as infinite concurrency (no limit). This variable is intended for performance tuning on high concurrency systems.

参照官方文档的描述,这个参数设置得比较低的时候,超过数量限制的 InnoDB 查询会被阻塞。因此在本次模拟中,这个参数被设置了一个非常低的值。


mysql> show variables like '%innodb_thread_concurrency%';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_thread_concurrency | 1     |
+---------------------------+-------+
1 row in set (0.00 sec)

然后开两个数据库连接(Session 1 和 Session 2),分别执行select sleep(3600) from sbtest.sbtest1语句,然后在第三个连接上 kill 掉 Session 2 的查询:


Session 1:
mysql> select sleep(3600) from sbtest.sbtest1;

Session 2:
mysql> select sleep(3600) from sbtest.sbtest1;
ERROR 2013 (HY000): Lost connection to MySQL Server during query
mysql>

Session 3:
mysql> show processlist;
+----+------+--------------------+------+---------+------+--------------+----------------------------------------+
| Id | User | Host               | db   | Command | Time | State        | Info                                   |
+----+------+--------------------+------+---------+------+--------------+----------------------------------------+
| 44 | root | 172.16.64.10:39290 | NULL | Query   |   17 | User sleep   | select sleep(3600) from sbtest.sbtest1 |
| 45 | root | 172.16.64.10:39292 | NULL | Query   |    0 | starting     | show processlist                       |
| 46 | root | 172.16.64.10:39294 | NULL | Query   |    5 | Sending data | select sleep(3600) from sbtest.sbtest1 |
+----+------+--------------------+------+---------+------+--------------+----------------------------------------+
3 rows in set (0.00 sec)

mysql> kill 46;
Query OK, 0 rows affected (0.00 sec)

mysql> show processlist;
+----+------+--------------------+------+---------+------+--------------+----------------------------------------+
| Id | User | Host               | db   | Command | Time | State        | Info                                   |
+----+------+--------------------+------+---------+------+--------------+----------------------------------------+
| 44 | root | 172.16.64.10:39290 | NULL | Query   |   26 | User sleep   | select sleep(3600) from sbtest.sbtest1 |
| 45 | root | 172.16.64.10:39292 | NULL | Query   |    0 | starting     | show processlist                       |
| 46 | root | 172.16.64.10:39294 | NULL | Killed  |   14 | Sending data | select sleep(3600) from sbtest.sbtest1 |
+----+------+--------------------+------+---------+------+--------------+----------------------------------------+
3 rows in set (0.00 sec)

mysql>

可以看到,kill 命令执行之后,Session 2 的连接马上就断开了,但是 Session 2 发起的查询仍旧残留在 MySQL 中。当然,如果是因为innodb_thread_concurrency这个参数导致了类似的问题的话,直接使用set global的命令调高上限,或者直接设置为 0 就可以解决,这个参数的变更是实时对所有连接生效的。

总结一下

MySQL 的 kill 操作并不是想象中的直接强行终止数据库连接,只是发送了一个终止的信号,如果 SQL 自身的执行效率过慢,或者受到其他的因素影响(服务器负载高,触发大量数据回滚)的话,那么这个 kill 的操作很有可能并不能及时终止这些问题查询,反而可能会因为程序侧连接被断开之后触发重连,产生更多的低效查询,进一步拖垮数据库。

以上就是MySQL kill不掉线程的原因的详细内容,更多关于MySQL kill线程的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL kill不掉线程的原因

本文链接: https://www.lsjlt.com/news/10304.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL kill不掉线程的原因
    背景 在日常的使用过程中,时不时会遇到个别,或者大量的连接堆积在 MySQL 中的现象,这时一般会考虑使用 kill 命令强制杀死这些长时间堆积起来的连接,尽快释放连接数和数据库服务器的 CPU 资源。 问题描述 ...
    99+
    2022-05-15
    MySQL kill线程 MySQL kill不掉线程
  • MySQL中无法使用kill掉线程的原因是什么
    这篇文章将为大家详细讲解有关MySQL中无法使用kill掉线程的原因是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。问题描述在实际操作 kill 命令的时候,有时候会发现连接并没有第一时...
    99+
    2023-06-14
  • simpledateformat线程不安全的原因
    这篇文章将为大家详细讲解有关simpledateformat线程不安全的原因,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。原因:在多线程环境下,当多个线程同时使用相同的SimpleDateFormat对象...
    99+
    2023-06-15
  • Linux中kill命令杀不掉进程的解决办法
    1、进程杀不掉的原因有两种: (1)这个进程是僵尸进程 ; (2)此进程是"核心态"进程。 2、解决办法: (1)进入到“/proc/进程号”目录下,执行“cat status”命令可以查询到指定进程的父进程 ...
    99+
    2023-09-03
    linux 服务器 java Powered by 金山文档
  • java线程不安全的原因是什么
    今天就跟大家聊聊有关java线程不安全的原因是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;...
    99+
    2023-06-14
  • 云服务器掉线什么原因造成的
    硬件故障 硬件故障是云服务器掉线最常见的原因之一。硬件故障指的是服务器的硬件出现故障,包括电源、内存、磁盘等。这些故障可能导致服务器无法正常工作,从而造成数据丢失或响应延迟。常见的硬件故障包括硬盘故障、CPU故障、内存故障、磁盘故障等...
    99+
    2023-10-28
    掉线 原因 服务器
  • win10网络掉线的常见原因有哪些
    这篇文章主要为大家展示了“win10网络掉线的常见原因有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“win10网络掉线的常见原因有哪些”这篇文章吧。1 windows系统的电源管理现在很多...
    99+
    2023-06-27
  • StringBuilder是线程不安全的原因是什么
    这篇文章主要介绍了StringBuilder是线程不安全的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇StringBuilder是线程不安全的原因是什么文章都会有所收获,下面我们一起来看看吧。原因分...
    99+
    2023-06-27
  • win11防火墙关不掉的原因有哪些
    Win11防火墙关不掉的原因可能包括以下几点:1. 系统权限不足:防火墙通常需要管理员权限才能进行关闭操作,如果当前用户权限不足,则...
    99+
    2023-09-09
    win11
  • SQLServer lrtrim() 去不掉空格的原因是什么
    本篇文章给大家分享的是有关SQLServer lrtrim() 去不掉空格的原因是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。...
    99+
    2022-10-19
  • 使用拨号VPS挂机掉线的原因有哪些
    使用拨号VPS挂机掉线的原因有:1、同一个IP挂太多软件,触发检测机制,只能减少挂机的软件数量来解决;2、同一个IP登录过很多一样的软件,导致被游戏服务端检测;3、挂机软件的服务器出现异常,只能联系软件提供商经行处理;4、受到其他软件的干扰...
    99+
    2022-10-20
  • 使用http代理总是掉线的原因是什么
    这篇文章主要讲解了“使用http代理总是掉线的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“使用http代理总是掉线的原因是什么”吧!1、同一个IP挂的软件太多了。例如一台电脑有十...
    99+
    2023-06-20
  • redis是单线程的原因
    本篇文章给大家分享的是有关redis是单线程的原因,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。redis简介是一个key-value存储系统...
    99+
    2022-10-18
  • 线程崩溃不会导致 JVM 崩溃的原因解析
    目录线程崩溃,进程一定会崩溃吗进程是如何崩溃的-信号机制简介为什么线程崩溃不会导致 JVM 进程崩溃openJDK 源码解析总结参考文章网上看到一个很有意思的据说是美团的面试题:为什...
    99+
    2022-11-13
  • 深入探究Java线程不安全的原因与解决
    目录一、什么是线程安全二、线程不安全的原因1、修改共享数据2、原子性3、内存可见性4、指令重排序三、解决线程安全方案一、什么是线程安全 想给出一个线程安全的确切定义是复杂的,但我们可...
    99+
    2022-11-13
  • 阿里云服务器总掉线的原因与解决方案
    阿里云服务器是目前市面上较为常见的云服务器之一,因其稳定性和高性能受到了广大用户的青睐。然而,有些用户反映阿里云服务器总掉线的情况,这可能是由多种因素引起的。本文将深入探讨阿里云服务器总掉线的原因,并提出相应的解决方案。 一、阿里云服务器总...
    99+
    2023-11-03
    阿里 掉线 解决方案
  • 阿里云服务器SSH掉线的原因及解决方法
    阿里云服务器是许多企业和个人选择的云服务器之一,它提供了稳定、高效、安全的服务。然而,有时在使用阿里云服务器的过程中,可能会遇到SSH掉线的问题,这可能会导致无法连接到服务器,从而影响到工作的进行。本文将详细介绍阿里云服务器SSH掉线的原因...
    99+
    2023-11-21
    阿里 解决方法 掉线
  • redis单线程速度快的原因
    小编给大家分享一下redis单线程速度快的原因,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!Redis之所以执行速度很快,主要依赖于以下几个原因:(一)纯内存操作,避免大量访问数据库,减少直接...
    99+
    2022-10-18
  • MySQL启动不了的原因有哪些
    MySQL启动不了的原因可能有以下几种:1. 配置错误:MySQL配置文件(my.cnf)中的某些配置项可能有误,如端口号、数据目录...
    99+
    2023-09-26
    MySQL
  • 腾讯云服务器掉线:可能的原因和解决方法
    1. 网络问题导致服务器掉线 网络问题是导致腾讯云服务器掉线的常见原因之一。可能的情况包括: 网络连接中断:检查服务器的网络连接是否正常。可以尝试重新启动服务器或检查网络配置。 网络延迟:如果服务器的网络延迟过高,可能会导致连接超时或掉...
    99+
    2023-10-27
    腾讯 解决方法 掉线
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作