一个 Kill 不掉的 MySQL 会话

news2024/11/26 21:52:24

究竟是什么原因,导致主从切换过程中存在一个无法 kill 的会话?

作者:秦广飞

爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查,对数据库有兴趣,对技术有想法。一入 IT 深似海,从此节操是路人。

本文来源:原创投稿

  • 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

背景

照例要先讲下本文档背景的,不过在介绍背景之前,先简单说下 MySQL 主从切换的过程。

正常来说,当要发生主从切换时,主库要做下面几个动作:

  1. 断开流量入口(解绑 VIP)
  2. 设置只读
  3. Kill 掉数据库残留连接

而从库,要做下面几个动作:

  1. 补全与主库差异的 binlog 日志
  2. 关闭只读
  3. 清除复制信息
  4. 开启流量入口(绑定 VIP)

我们公司自研的数据库集群管理平台 云树® DMP 大概也是这么个切换过程,而这个切换过程跟本文的关联点,就在主库 Kill 掉残留连接上。

偶然间发现,DMP 在切换过程中 Kill 残留连接时,日志中有时会出现 warn 信息:[warn] kill process warning:Error 1094:Unknown thread id:4

后来观察到,MySQL 5.7 的主从切换时,就不会出现这个 warning 信息,而 MySQL 8.0 就会稳定复现。进一步测试验证后,终于发现了这个 Unknown thread id 的真面目,就是 USER 为 event_scheduler 的这个"连接"。

什么是 event_scheduler?

event_scheduler 到底是什么呢?毕竟从 processlist 信息中可以看到,它与普通的会话似乎不太一样。

其实它是 MySQL 中的一个特殊线程,主要负责执行 MySQL 事件调度器所创建的事件。我们知道 MySQL 是有 event 的,可以像 Linux 中 crontab 一样,定时执行一些任务。

The MySQL Event Scheduler manages the scheduling and execution of events, that is, tasks that run according to a schedule

当 MySQL 事件调度器启用时 event_scheduler=ON,MySQL 就会在后台启动一个 event_scheduler 线程,并且 event_scheduler 线程将一直运行,直到 MySQL 服务停止。该线程会负责检查当前时间和已定义的事件,如果事件需要执行,则 event_scheduler 线程将启动一个新的会话来执行事件。

需要注意的是,在 MySQL 5.7中,event_scheduler 默认是关闭的,而 MySQL 8.0 中则默认打开了,而这也就是为什么在 MySQL 5.7 的切换过程中没有发现 warning 信息的原因。

为什么 Kill 不掉?

了解 event_scheduler 大概是什么之后,我们再来看看,为什么 Kill 时,会报 Unknown thread id

注意看 processlist 信息,我们发现 event_scheduler 的 COMMAND 值为 Daemon。从字面意思上看,Daemon 为后台守护的意思,其实在 MySQL 中,当在后台运行一些特殊的功能时,会话 COMMAND 可能被标记为 Daemon(实际工作场景中,只注意到过 event_scheduler)。

因为这类会话并不是由用户直接发起的连接,而是 MySQL 内部的线程,所以无法像普通会话一样被 Kill 掉。

官方文档中,给出的信息较少,大家有兴趣的可以自己翻下代码。

如何使用定时任务?

具体如何使用定时任务,其实网上也有很多资料,如果真有需要使用的,建议最好参考官方文档。下面我们简单使用下 event 看看效果。

启用/关闭/禁用

-- 修改变量 event_scheduler 来动态启用或者关闭 event
mysql> show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> 

-- 关闭
mysql> SET GLOBAL event_scheduler = 0;

-- 启用
mysql> SET GLOBAL event_scheduler = 1;

-- 禁用 event_scheduler,只能在配置文件中设置 event_scheduler 为 disable 并重启服务,而不能动态修改
[mysqld]
event_scheduler=DISABLED

创建

-- 准备测试表和数据
mysql> CREATE TABLE logs(id INT(11) primary key AUTO_INCREMENT,log_message VARCHAR(255) NOT NULL,log_time TIMESTAMP NOT NULL);
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> INSERT INTO logs (log_message, log_time) VALUES
    -> ('君不见黄河之水天上来,奔流到海不复回', '2023-06-07 09:01:00'),
    -> ('君不见高堂明镜悲白发,朝如青丝暮成雪', '2023-06-07 23:02:00'),
    -> ('人生得意须尽欢,莫使金樽空对月', '2023-06-08 01:03:00'),
    -> ('天生我材必有用,千金散尽还复来', '2023-06-08 18:04:00'),
    -> ('烹羊宰牛且为乐,会须一饮三百杯', '2023-06-09 23:05:00'),
    -> ('钟鼓馔玉不足贵,但愿长醉不复醒', '2023-06-09 11:06:00'),
    -> ('古来圣贤皆寂寞,惟有饮者留其名', '2023-06-10 23:02:00'),
    -> ('陈王昔时宴平乐,斗酒十千恣欢谑', '2023-06-11 01:03:00'),
    -> ('主人何为言少钱,径须沽取对君酌', '2023-06-12 18:04:00'),
    -> ('五花马、千金裘', '2023-06-13 23:05:00'),
    -> ('呼儿将出换美酒,与尔同销万古愁', '2023-06-14 11:06:00');
Query OK, 11 rows affected (0.01 sec)
Records: 11  Duplicates: 0  Warnings: 0

mysql> 

-- 创建event,实现定时将该日志表中 7 天之前的数据删除
-- 为了快速看到效果,我们每分钟执行一次,一次删除 1 行
mysql> CREATE EVENT delete_logs_event
    ->   ON SCHEDULE EVERY 1 MINUTE STARTS '2023-06-19 00:00:00'
    ->   DO
    ->     DELETE FROM logs
    ->     WHERE log_time < DATE_SUB(NOW(), INTERVAL 7 DAY) limit 1;
Query OK, 0 rows affected (0.01 sec)

查看

-- 执行 show events 查看,需要先进到 event 所在的 schema
mysql> use universe
mysql> show events\G
*************************** 1. row ***************************
                  Db: universe
                Name: delete_logs_event
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: MINUTE
              Starts: 2023-06-19 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1862993913
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_bin
1 row in set (0.00 sec)

mysql>

-- 通过 information_schema.events 可以看到更详细的信息
mysql> select * from information_schema.events\G
*************************** 1. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: universe
          EVENT_NAME: delete_logs_event
             DEFINER: root@localhost
           TIME_ZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: DELETE FROM logs
    WHERE log_time < DATE_SUB(NOW(), INTERVAL 7 DAY) limit 1
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 1
      INTERVAL_FIELD: MINUTE
            SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
              STARTS: 2023-06-19 00:00:00
                ENDS: NULL
              STATUS: ENABLED
       ON_COMPLETION: NOT PRESERVE
             CREATED: 2023-06-18 23:54:23
        LAST_ALTERED: 2023-06-18 23:54:23
       LAST_EXECUTED: 2023-06-19 00:00:00
       EVENT_COMMENT: 
          ORIGINATOR: 1862993913
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4_0900_ai_ci
  DATABASE_COLLATION: utf8mb4_bin
1 row in set (0.00 sec)

mysql> 

-- 查看表中是否被定时删除
mysql> select * from logs;
+----+--------------------------------------------------------+---------------------+
| id | log_message                                            | log_time            |
+----+--------------------------------------------------------+---------------------+
|  2 | 君不见高堂明镜悲白发,朝如青丝暮成雪                   | 2023-06-07 23:02:00 |
|  3 | 人生得意须尽欢,莫使金樽空对月                         | 2023-06-08 01:03:00 |
|  4 | 天生我材必有用,千金散尽还复来                         | 2023-06-08 18:04:00 |
|  5 | 烹羊宰牛且为乐,会须一饮三百杯                         | 2023-06-09 23:05:00 |
|  6 | 钟鼓馔玉不足贵,但愿长醉不复醒                         | 2023-06-09 11:06:00 |
|  7 | 古来圣贤皆寂寞,惟有饮者留其名                         | 2023-06-10 23:02:00 |
|  8 | 陈王昔时宴平乐,斗酒十千恣欢谑                         | 2023-06-11 01:03:00 |
|  9 | 主人何为言少钱,径须沽取对君酌                         | 2023-06-12 18:04:00 |
| 10 | 五花马、千金裘                                         | 2023-06-13 23:05:00 |
| 11 | 呼儿将出换美酒,与尔同销万古愁                         | 2023-06-14 11:06:00 |
+----+--------------------------------------------------------+---------------------+
10 rows in set (0.00 sec)

mysql> 

-- 查看 show processlist 中 event_scheduler 的信息,可以看到 stats 为 Waiting for next activation
mysql> select * from information_schema.processlist where user='event_scheduler';
+-------+-----------------+-----------+------+---------+------+-----------------------------+------+
| ID    | USER            | HOST      | DB   | COMMAND | TIME | STATE                       | INFO |
+-------+-----------------+-----------+------+---------+------+-----------------------------+------+
| 12869 | event_scheduler | localhost | NULL | Daemon  |   58 | Waiting for next activation | NULL |
+-------+-----------------+-----------+------+---------+------+-----------------------------+------+
1 row in set (0.00 sec)

mysql>

-- 我们在从库上看下 event 的信息,可以看到 STATUS 为 SLAVESIDE_DISABLED,因此不用担心从库重复执行 event
mysql> select * from information_schema.events\G
*************************** 1. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: universe
          EVENT_NAME: delete_logs_event
             DEFINER: root@localhost
           TIME_ZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: DELETE FROM logs
    WHERE log_time < DATE_SUB(NOW(), INTERVAL 7 DAY) limit 1
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 1
      INTERVAL_FIELD: MINUTE
            SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
              STARTS: 2023-06-19 00:00:00
                ENDS: NULL
              STATUS: SLAVESIDE_DISABLED
       ON_COMPLETION: NOT PRESERVE
             CREATED: 2023-06-18 23:54:23
        LAST_ALTERED: 2023-06-18 23:54:23
       LAST_EXECUTED: NULL
       EVENT_COMMENT: 
          ORIGINATOR: 1862993913
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4_0900_ai_ci
  DATABASE_COLLATION: utf8mb4_bin
1 row in set (0.00 sec) 

修改

-- 使用 ALTER 语句修改,其他高权限用户也可以执行,且 event 的用户会变成最后一个 ALTER 的用户
mysql> ALTER EVENT delete_logs_event
    ->   ON SCHEDULE EVERY 1 DAY STARTS '2023-06-19 00:00:00'
    ->   DO
    ->     DELETE FROM logs
    ->     WHERE log_time < DATE_SUB(NOW(), INTERVAL 7 DAY);
Query OK, 0 rows affected (0.01 sec)

mysql>

-- 可以看到 DEFINER 已经变成了修改的用户,且时间间隔也修改为了 1 天,DELETE 语句也去掉了 LIMIT
mysql> select * from information_schema.events\G
*************************** 1. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: universe
          EVENT_NAME: delete_logs_event
             DEFINER: qin@%
           TIME_ZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: DELETE FROM logs
    WHERE log_time < DATE_SUB(NOW(), INTERVAL 7 DAY)
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 1
      INTERVAL_FIELD: DAY
            SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
              STARTS: 2023-06-19 00:00:00
                ENDS: NULL
              STATUS: ENABLED
       ON_COMPLETION: NOT PRESERVE
             CREATED: 2023-06-18 23:54:23
        LAST_ALTERED: 2023-06-19 00:23:03
       LAST_EXECUTED: 2023-06-19 00:23:00
       EVENT_COMMENT: 
          ORIGINATOR: 1862993913
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4_0900_ai_ci
  DATABASE_COLLATION: utf8mb4_bin
1 row in set (0.00 sec)

删除

mysql> drop event delete_logs_event;
Query OK, 0 rows affected (0.01 sec)

mysql> show events\G
Empty set (0.00 sec)

切换时注意

  1. 当在主库上创建了 event,之后发生了主从切换。此时 event 并不会随着切换而变成在新主上执行,且状态也不会发生改变。
  2. 即原主 event 的状态还是 ENABLED,而新主 event 的状态还是 DISABLED

总结

  1. show processlist 中看到的 User 为 event_scheduler 的会话为 MySQL 内部线程,无法被 Kill 掉。
  2. 在主库上创建的 event,定时执行的 SQL 语句,在从库上会正常随着复制回放,但不会被重复执行。
  3. 主从切换后,原主上的 event 不会在新主上执行。

关于 SQLE

爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【钱处理】商业计算怎样才能保证精度不丢失

以项目驱动学习&#xff0c;以实践检验真知 前言 很多系统都有「处理金额」的需求&#xff0c;比如电商系统、财务系统、收银系统&#xff0c;等等。只要和钱扯上关系&#xff0c;就不得不打起十二万分精神来对待&#xff0c;一分一毫都不能出错&#xff0c;否则对系统和用户来…

集群 第一章

目录 1.群集的含义 2.群集分类 3.群集架构 4.负载调度工作模式 5.lvs 虚拟服务器 6.nat 模式 lvs 负载均衡群集部署 7.总结 1.群集的含义 由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供一个访问入口&#xff08;域名与IP地址&#xff09;&#…

建筑师们,你们该把三维模型弄到PPT里做汇报了!

➤如何实现项目汇报效率比传统的PPT高&#xff0c;同时汇报效果更直观&#xff1f; ➤如何摆脱方案汇报只能向客户交付数据&#xff0c;安装专业软件查看项目成果&#xff1f; ➤如何将无人机航测数据、CAD图纸、BIM设计成果进行融合&#xff0c;挖掘出更深层次的应用&#x…

mysql体系结构及安装部署mysql

目录 1.体系结构 2.安装mysql 1.yum 源安装 2. 第二种安装方式-通用二进制方式 3.mysql改密方式 第一种&#xff0c;知道密码的情况下 第二种&#xff0c;不知道密码 1.体系结构 MySQL server连接层连接池&#xff08;缓冲池&#xff09;SQL层系统管理和控制工具SQL…

亿级日活业务稳如磐石 华为云发布性能测试服务CodeArts PerfTest

HDC期间可参与华为云PaaS生态抽奖活动&#xff0c;活动链接在文末 计算机软件作为人类逻辑智慧的伟大结晶之一&#xff0c;已经渗透到了人类社会的各个角落。早期的计算机发展对硬件有很强的依赖性&#xff0c;只有少数的个人或者机构才能拥有软件这种“奢侈品”。但随着软件行…

了解和搭建zabbix 6.0(来日方长)

前言&#xff1a; 作为一个运维&#xff0c;需要会使用监控系统查看服务器系统性能、应用服务状态和网站流量指标等&#xff0c;利用监控系统的数据去了解网站上线发布的结果和健康状态。 利用一个优秀的监控软件&#xff0c;我们可以: 通过一个友好的界面进行浏览整个网站所有…

OpenAI呼吁超级智能需要被监管

ChatGPT的创建者OpenAI发出了对超级智能监管的发人深省的呼吁&#xff0c;并与核能的监管进行了类比。在最近的一篇博客文章中&#xff0c;OpenAI强调了人工智能快速发展可能产生的影响以及这个不断变化的领域治理的紧迫性。该公司表示&#xff0c;预计人工智能系统将在未来十年…

你一定要用这个API管理工具,看完你就知道为什么了

以下是经常发生在程序员之间的对话&#xff1a; 小张&#xff1a;你知道为什么程序员不喜欢写文档&#xff1f; 小王&#xff1a;因为代码就是最好的文档啊&#xff01;谁还需要写那些冗长的说明呢&#xff1f; 小张&#xff1a;那你知道为什么程序员也不喜欢别人不写文档吗…

JAVA POI的excel中包含图片进行读取保存,单张图片,多张图片

JAVA POI的excel中包含图片进行读取保存,单张图片,多张图片 ---------------------------------------------效果---------------------------------------------------------- 1.单张图片 2.多张图片 import java.io.FileInputStream; import java.io.FileOutputStream;…

途乐证券|有色金属板块崛起涨超2%,云南锗业两连板

周三(7月5日)&#xff0c;A股三大股指震荡整理。截至上午收盘&#xff0c;上证指数跌幅达0.51%&#xff0c;报3228.68点&#xff1b;深证成指和创业板指跌幅分别为0.53%和0.59%&#xff1b;沪深两市合计成交额5310.1.6亿元&#xff0c;总体来看&#xff0c;两市个股跌多涨少。 …

机器学习25:《数据准备和特征工程-III》采样和分隔

目录 1.采样和分割数据 1.1 抽样简介 1.2 过滤 PII&#xff08;个人身份信息&#xff09; 2.数据不平衡 2.1 下采样和增加权重 3.数据分割示例 3.1 随机分割可能不是最好的方法 4.分割数据 5.随机化 5.1 实际考虑 5.2 散列的注意事项 6.参考文献 1.采样和分割数据-…

2023,中国电商重回元老时代

中国的历史上不缺“太上皇”&#xff0c;但“太上皇”再度站到台前的很少。公元1457年&#xff0c;被囚禁在南宫的“太上皇”朱祁镇复位&#xff0c;上演了中国历史上少见的南宫复辟。而危机时刻被推举为皇帝的朱祁钰&#xff0c;后来的庙号是代宗&#xff0c;阴阳怪气十足。 …

php://input文件包含

实验目的 通过本实验&#xff0c;了解php封装伪协议&#xff0c;掌握php://input文件包含的用法 实验环境 操作机&#xff1a;kali 靶机&#xff1a;Windows 实验地址&#xff1a;http://靶机ip/exp/include2/input/input2/ 工具&#xff1a;burpsuite 用户名&#xff1a…

好用的屏幕录制工具--Bandicam(班迪录屏)

最近准备录个电脑的音频&#xff0c;找了好多个软件&#xff0c;除了收费就是功能有限&#xff0c;经过好一番折腾试用&#xff0c;发现了2个介面友好功能强大的录屏、录音软件&#xff1a; ① Bandicam(班迪录屏)&#xff08;强烈推荐&#xff09; ② 数据蛙录屏 Bandicam(班迪…

【PC】CPU与GPU

文章目录 CPU与主板CPU是什么主板是什么功能 GPU与显卡GPU是什么显卡是什么功能 CPU与GPU的关系 ALU&#xff1a; 算术单元&#xff08;Arithmetic Unit&#xff09;&#xff1a;算术单元执行基本的算术运算&#xff0c;如加法、减法、乘法和除法。它能够对整数、浮点数和定点数…

适合成长型企业的4个 CRM 工作流程

如果你在繁琐的任务上花费太多的时间并难以让你的业务井井有条&#xff0c;CRM工作流程自动化可能会解决你的问题。 CRM&#xff08;客户关系管理系统&#xff09;是自动化工作流程最有效的工具之一&#xff0c;因为它可以帮助你从一个地方完成关键工作流程。CRM工作流程使你能…

软件测试技能,JMeter压力测试教程,获取post请求x-www-form-urlencoded格式的数据(二十四)

一、前言 post请求的参数有一些是json格式&#xff0c;也有一些是x-www-form-urlencoded格式&#xff0c;前面讲签名的时候获取到post请求的是json格式 本篇继续讲x-www-form-urlencoded格式的请求body如何获取到 二、x-www-form-urlencoded 在请求头部添加Content-Type类型…

CodeForces..移位密码器.[简单].[字符比较]

题目描述&#xff1a; 题目解读&#xff1a; 对字符串 a 进行加密后得到j加密字符串 s 。 加密规则为&#xff1a; 在字符串 a 的每个字符之后&#xff0c;添加任意(可能为零)数量的小写字母&#xff0c;与字符本身不同。 在每次这样的添加之后&#xff0c;我们将原字符添加…

【来不及刷题之】42、括号生成(递归)

常规的方法是用回溯来写这个题&#xff0c;但是回溯理解起来实在是有一点困难&#xff0c;下面这个思路是直接用递归来生成&#xff0c;首先要明确的是&#xff0c;在已经生成的字符串中&#xff0c;左括号的数量一定要大于等于右括号的数量&#xff0c;否则就不合法&#xff0…

ADSCOPE加入中国广告协会!

近日&#xff0c;经协会批准&#xff0c;上海倍孜网络技术有限公司正式加入中国广告协会&#xff0c;成为会员单位。上海倍孜将在中广协的组织和引导下&#xff0c;依托自身在行业深耕多年的优势&#xff0c;为中国数字营销领域贡献力量。 中国广告协会&#xff08;中广协&…