0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一個(gè)Kill不掉的MySQL會(huì)話

OSC開源社區(qū) ? 來(lái)源:愛(ài)可生開源社區(qū) ? 2023-07-10 14:47 ? 次閱讀

作者:秦廣飛

愛(ài)可生 DBA 團(tuán)隊(duì)成員,負(fù)責(zé)項(xiàng)目日常問(wèn)題處理及公司平臺(tái)問(wèn)題排查,對(duì)數(shù)據(jù)庫(kù)有興趣,對(duì)技術(shù)有想法。一入 IT 深似海,從此節(jié)操是路人。

本文來(lái)源:愛(ài)可生開源社區(qū)

1背景

照例要先講下本文檔背景的,不過(guò)在介紹背景之前,先簡(jiǎn)單說(shuō)下 MySQL 主從切換的過(guò)程。

正常來(lái)說(shuō),當(dāng)要發(fā)生主從切換時(shí),主庫(kù)要做下面幾個(gè)動(dòng)作:

斷開流量入口(解綁 VIP)

設(shè)置只讀

Kill 掉數(shù)據(jù)庫(kù)殘留連接

而從庫(kù),要做下面幾個(gè)動(dòng)作:

補(bǔ)全與主庫(kù)差異的 binlog 日志

關(guān)閉只讀

清除復(fù)制信息

開啟流量入口(綁定 VIP)

我們公司自研的數(shù)據(jù)庫(kù)集群管理平臺(tái) 云樹 DMP[1] 大概也是這么個(gè)切換過(guò)程,而這個(gè)切換過(guò)程跟本文的關(guān)聯(lián)點(diǎn),就在主庫(kù) Kill 掉殘留連接上。

偶然間發(fā)現(xiàn),DMP 在切換過(guò)程中 Kill 殘留連接時(shí),日志中有時(shí)會(huì)出現(xiàn) warn 信息:[warn] kill process warning:Error 1094:Unknown thread id:4

后來(lái)觀察到,MySQL 5.7 的主從切換時(shí),就不會(huì)出現(xiàn)這個(gè) warning 信息,而 MySQL 8.0 就會(huì)穩(wěn)定復(fù)現(xiàn)。進(jìn)一步測(cè)試驗(yàn)證后,終于發(fā)現(xiàn)了這個(gè) Unknown thread id 的真面目,就是 USER 為 event_scheduler 的這個(gè)"連接"。

d6074344-1cb1-11ee-962d-dac502259ad0.png

2什么是 event_scheduler?

event_scheduler 到底是什么呢?畢竟從 processlist 信息中可以看到,它與普通的會(huì)話似乎不太一樣。

其實(shí)它是 MySQL 中的一個(gè)特殊線程,主要負(fù)責(zé)執(zhí)行 MySQL 事件調(diào)度器所創(chuàng)建的事件。我們知道 MySQL 是有 event 的,可以像 Linux 中 crontab 一樣,定時(shí)執(zhí)行一些任務(wù)。

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

當(dāng) MySQL 事件調(diào)度器啟用時(shí) event_scheduler=ON,MySQL 就會(huì)在后臺(tái)啟動(dòng)一個(gè) event_scheduler 線程,并且 event_scheduler 線程將一直運(yùn)行,直到 MySQL 服務(wù)停止。該線程會(huì)負(fù)責(zé)檢查當(dāng)前時(shí)間和已定義的事件,如果事件需要執(zhí)行,則 event_scheduler 線程將啟動(dòng)一個(gè)新的會(huì)話來(lái)執(zhí)行事件。

需要注意的是,在 MySQL 5.7中,event_scheduler 默認(rèn)是關(guān)閉的,而 MySQL 8.0 中則默認(rèn)打開了,而這也就是為什么在 MySQL 5.7 的切換過(guò)程中沒(méi)有發(fā)現(xiàn) warning 信息的原因。

3為什么 Kill 不掉?

了解 event_scheduler 大概是什么之后,我們?cè)賮?lái)看看,為什么 Kill 時(shí),會(huì)報(bào) Unknown thread id。

注意看 processlist 信息,我們發(fā)現(xiàn) event_scheduler 的 COMMAND 值為 Daemon。從字面意思上看,Daemon 為后臺(tái)守護(hù)的意思,其實(shí)在 MySQL 中,當(dāng)在后臺(tái)運(yùn)行一些特殊的功能時(shí),會(huì)話 COMMAND 可能被標(biāo)記為 Daemon(實(shí)際工作場(chǎng)景中,只注意到過(guò) event_scheduler)。

因?yàn)檫@類會(huì)話并不是由用戶直接發(fā)起的連接,而是 MySQL 內(nèi)部的線程,所以無(wú)法像普通會(huì)話一樣被 Kill 掉。

d64c8184-1cb1-11ee-962d-dac502259ad0.png

官方文檔中,給出的信息較少,大家有興趣的可以自己翻下代碼。

d6994f50-1cb1-11ee-962d-dac502259ad0.png

4如何使用定時(shí)任務(wù)?

具體如何使用定時(shí)任務(wù),其實(shí)網(wǎng)上也有很多資料,如果真有需要使用的,建議最好參考官方文檔。下面我們簡(jiǎn)單使用下 event 看看效果。

啟用/關(guān)閉/禁用

--修改變量event_scheduler來(lái)動(dòng)態(tài)啟用或者關(guān)閉event
mysql>showvariableslike'%event_scheduler%';
+-----------------+-------+
|Variable_name|Value|
+-----------------+-------+
|event_scheduler|ON|
+-----------------+-------+
1rowinset(0.00sec)

mysql>

--關(guān)閉
mysql>SETGLOBALevent_scheduler=0;

--啟用
mysql>SETGLOBALevent_scheduler=1;

--禁用event_scheduler,只能在配置文件中設(shè)置event_scheduler為disable并重啟服務(wù),而不能動(dòng)態(tài)修改
[mysqld]
event_scheduler=DISABLED

創(chuàng)建

--準(zhǔn)備測(cè)試表和數(shù)據(jù)
mysql>CREATETABLElogs(idINT(11)primarykeyAUTO_INCREMENT,log_messageVARCHAR(255)NOTNULL,log_timeTIMESTAMPNOTNULL);
QueryOK,0rowsaffected,1warning(0.02sec)

mysql>INSERTINTOlogs(log_message,log_time)VALUES
->('君不見黃河之水天上來(lái),奔流到海不復(fù)回','2023-06-070900'),
->('君不見高堂明鏡悲白發(fā),朝如青絲暮成雪','2023-06-072300'),
->('人生得意須盡歡,莫使金樽空對(duì)月','2023-06-080100'),
->('天生我材必有用,千金散盡還復(fù)來(lái)','2023-06-081800'),
->('烹羊宰牛且為樂(lè),會(huì)須一飲三百杯','2023-06-092300'),
->('鐘鼓饌玉不足貴,但愿長(zhǎng)醉不復(fù)醒','2023-06-091100'),
->('古來(lái)圣賢皆寂寞,惟有飲者留其名','2023-06-102300'),
->('陳王昔時(shí)宴平樂(lè),斗酒十千恣歡謔','2023-06-110100'),
->('主人何為言少錢,徑須沽取對(duì)君酌','2023-06-121800'),
->('五花馬、千金裘','2023-06-132300'),
->('呼兒將出換美酒,與爾同銷萬(wàn)古愁','2023-06-141100');
QueryOK,11rowsaffected(0.01sec)
Records:11Duplicates:0Warnings:0

mysql>

--創(chuàng)建event,實(shí)現(xiàn)定時(shí)將該日志表中7天之前的數(shù)據(jù)刪除
--為了快速看到效果,我們每分鐘執(zhí)行一次,一次刪除1行
mysql>CREATEEVENTdelete_logs_event
->ONSCHEDULEEVERY1MINUTESTARTS'2023-06-190000'
->DO
->DELETEFROMlogs
->WHERElog_time

查看

--執(zhí)行showevents查看,需要先進(jìn)到event所在的schema
mysql>useuniverse
mysql>showeventsG
***************************1.row***************************
Db:universe
Name:delete_logs_event
Definer:root@localhost
Timezone:SYSTEM
Type:RECURRING
Executeat:NULL
Intervalvalue:1
Intervalfield:MINUTE
Starts:2023-06-190000
Ends:NULL
Status:ENABLED
Originator:1862993913
character_set_client:utf8mb4
collation_connection:utf8mb4_0900_ai_ci
DatabaseCollation:utf8mb4_bin
1rowinset(0.00sec)

mysql>

--通過(guò)information_schema.events可以看到更詳細(xì)的信息
mysql>select*frominformation_schema.eventsG
***************************1.row***************************
EVENT_CATALOG:def
EVENT_SCHEMA:universe
EVENT_NAME:delete_logs_event
DEFINER:root@localhost
TIME_ZONE:SYSTEM
EVENT_BODY:SQL
EVENT_DEFINITION:DELETEFROMlogs
WHERElog_time

--查看表中是否被定時(shí)刪除
mysql>select*fromlogs;
+----+--------------------------------------------------------+---------------------+
|id|log_message|log_time|
+----+--------------------------------------------------------+---------------------+
|2|君不見高堂明鏡悲白發(fā),朝如青絲暮成雪|2023-06-072300|
|3|人生得意須盡歡,莫使金樽空對(duì)月|2023-06-080100|
|4|天生我材必有用,千金散盡還復(fù)來(lái)|2023-06-081800|
|5|烹羊宰牛且為樂(lè),會(huì)須一飲三百杯|2023-06-092300|
|6|鐘鼓饌玉不足貴,但愿長(zhǎng)醉不復(fù)醒|2023-06-091100|
|7|古來(lái)圣賢皆寂寞,惟有飲者留其名|2023-06-102300|
|8|陳王昔時(shí)宴平樂(lè),斗酒十千恣歡謔|2023-06-110100|
|9|主人何為言少錢,徑須沽取對(duì)君酌|2023-06-121800|
|10|五花馬、千金裘|2023-06-132300|
|11|呼兒將出換美酒,與爾同銷萬(wàn)古愁|2023-06-141100|
+----+--------------------------------------------------------+---------------------+
10rowsinset(0.00sec)

mysql>

--查看showprocesslist中event_scheduler的信息,可以看到stats為Waitingfornextactivation
mysql>select*frominformation_schema.processlistwhereuser='event_scheduler';
+-------+-----------------+-----------+------+---------+------+-----------------------------+------+
|ID|USER|HOST|DB|COMMAND|TIME|STATE|INFO|
+-------+-----------------+-----------+------+---------+------+-----------------------------+------+
|12869|event_scheduler|localhost|NULL|Daemon|58|Waitingfornextactivation|NULL|
+-------+-----------------+-----------+------+---------+------+-----------------------------+------+
1rowinset(0.00sec)

mysql>

--我們?cè)趶膸?kù)上看下event的信息,可以看到STATUS為SLAVESIDE_DISABLED,因此不用擔(dān)心從庫(kù)重復(fù)執(zhí)行event
mysql>select*frominformation_schema.eventsG
***************************1.row***************************
EVENT_CATALOG:def
EVENT_SCHEMA:universe
EVENT_NAME:delete_logs_event
DEFINER:root@localhost
TIME_ZONE:SYSTEM
EVENT_BODY:SQL
EVENT_DEFINITION:DELETEFROMlogs
WHERElog_time

修改

--使用ALTER語(yǔ)句修改,其他高權(quán)限用戶也可以執(zhí)行,且event的用戶會(huì)變成最后一個(gè)ALTER的用戶
mysql>ALTEREVENTdelete_logs_event
->ONSCHEDULEEVERY1DAYSTARTS'2023-06-190000'
->DO
->DELETEFROMlogs
->WHERElog_time

--可以看到DEFINER已經(jīng)變成了修改的用戶,且時(shí)間間隔也修改為了1天,DELETE語(yǔ)句也去掉了LIMIT
mysql>select*frominformation_schema.eventsG
***************************1.row***************************
EVENT_CATALOG:def
EVENT_SCHEMA:universe
EVENT_NAME:delete_logs_event
DEFINER:qin@%
TIME_ZONE:SYSTEM
EVENT_BODY:SQL
EVENT_DEFINITION:DELETEFROMlogs
WHERElog_time

刪除

mysql>dropeventdelete_logs_event;
QueryOK,0rowsaffected(0.01sec)

mysql>showeventsG
Emptyset(0.00sec)

切換時(shí)注意

當(dāng)在主庫(kù)上創(chuàng)建了 event,之后發(fā)生了主從切換。此時(shí) event 并不會(huì)隨著切換而變成在新主上執(zhí)行,且狀態(tài)也不會(huì)發(fā)生改變。

即原主 event 的狀態(tài)還是 ENABLED,而新主 event 的狀態(tài)還是 DISABLED。

d6bee4e0-1cb1-11ee-962d-dac502259ad0.pngd6e6dff4-1cb1-11ee-962d-dac502259ad0.png

5總結(jié)

show processlist 中看到的 User 為 event_scheduler 的會(huì)話為 MySQL 內(nèi)部線程,無(wú)法被 Kill 掉。

在主庫(kù)上創(chuàng)建的 event,定時(shí)執(zhí)行的 SQL 語(yǔ)句,在從庫(kù)上會(huì)正常隨著復(fù)制回放,但不會(huì)被重復(fù)執(zhí)行。

主從切換后,原主上的 event 不會(huì)在新主上執(zhí)行。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3737

    瀏覽量

    64173
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    793

    瀏覽量

    26353
  • kill
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    2091
  • 調(diào)度器
    +關(guān)注

    關(guān)注

    0

    文章

    98

    瀏覽量

    5223

原文標(biāo)題:一個(gè)Kill不掉的MySQL會(huì)話

文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    mysql中文參考手冊(cè)chm

    運(yùn)營(yíng)個(gè)使用MySQL的Web服務(wù)器   3.5 MySQL的許可證和技術(shù)支持費(fèi)用 3.5.1 付款信息 3.5.2 聯(lián)系信息 3.6 商業(yè)性支持的類型 3.6.
    發(fā)表于 12-26 13:32

    新人剛接觸kill5,求助

    [size=13.63636302947998px]kill5能開發(fā)51單片機(jī)嗎,51單片機(jī)的固件庫(kù)是什么?[size=13.63636302947998px]裝kill4的時(shí)候 里面沒(méi)有STM32的固件庫(kù),同時(shí)裝kill4和
    發(fā)表于 03-09 22:50

    VDSP建立會(huì)話出現(xiàn)了個(gè)窗口

    是這樣子的,我需要建立會(huì)話跟蹤數(shù)據(jù),我根據(jù)書本建立了個(gè)非模擬器環(huán)境下的會(huì)話窗口,他提示了我這樣個(gè)
    發(fā)表于 12-06 09:21

    labview 錯(cuò)誤-1074395214發(fā)生于 IMAQ OCR Create Session。打開的OCR會(huì)話太多。必須先關(guān)閉會(huì)話,然后才能打開另一個(gè)會(huì)話。

    `想做一個(gè)數(shù)字識(shí)別,運(yùn)行時(shí)失敗了彈出錯(cuò)誤-1074395214發(fā)生于 IMAQ OCR Create Session。打開的OCR會(huì)話太多。必須先關(guān)閉會(huì)話,然后才能打開另一個(gè)
    發(fā)表于 06-23 01:49

    如何利用ESP8266模塊去制作個(gè)WIFI kill固件呢

    如何利用ESP8266模塊去制作個(gè)WIFI kill固件呢?有哪些制作流程?
    發(fā)表于 02-24 07:29

    kill結(jié)構(gòu)中的參數(shù)RFU和RECOM是什么意思

    我嘗試殺死個(gè) TAG,我使用不同的配置但沒(méi)有得到不同的答案。我相信如果殺死個(gè)標(biāo)簽,我的讀者就不可能識(shí)別出她,但在我使用 kill 命令后
    發(fā)表于 12-23 06:22

    Web應(yīng)用程序會(huì)話安全模塊的設(shè)計(jì)

    為阻止會(huì)話劫持攻擊的發(fā)生,設(shè)計(jì)個(gè)HTTP會(huì)話安全模塊。該模塊將條哈希代碼附加到會(huì)話 ID后,
    發(fā)表于 04-15 08:35 ?15次下載

    以多種方式使用”kill”命令終結(jié)應(yīng)用

    無(wú)論你使用哪種操作系統(tǒng),你定會(huì)遇到某個(gè)行為失常的應(yīng)用,它把自己鎖死并拒絕關(guān)閉。在Linux(還有Mac),你可以用個(gè)kill”命令強(qiáng)制終結(jié)它。在這個(gè)教程中,我們將展示給你多種方式
    的頭像 發(fā)表于 04-20 16:36 ?4983次閱讀
    以多種方式使用”<b class='flag-5'>kill</b>”命令終結(jié)應(yīng)用

    如何在調(diào)試會(huì)話中編程EEPROM記憶?

    Atmel小貼士 在個(gè)調(diào)試會(huì)話中如何編程 EEPROM 記憶
    的頭像 發(fā)表于 07-10 10:51 ?8524次閱讀

    Linux使用kill命令的注意事項(xiàng)

     Linux系統(tǒng)下有個(gè)直接終止進(jìn)程的命令,這個(gè)命令的代碼也是非常霸氣,直接就是英文的kill。既然這個(gè)命令這么有“殺氣”,為了防止“誤傷”,下面小編就給大家來(lái)普及下Linux使用
    發(fā)表于 07-16 14:30 ?674次閱讀

    會(huì)話式機(jī)器閱讀理解概述

    理解的類型: 第種是標(biāo)準(zhǔn)的閱讀理解,該模式是指,給定篇描述型的文章和個(gè)基于事實(shí)型的問(wèn)題,通過(guò)匹配文章和問(wèn)題,從文章中抽取
    的頭像 發(fā)表于 11-25 16:07 ?2237次閱讀

    保持SSH會(huì)話不掉

    如果我們看到這個(gè)錯(cuò)誤消息,意味著我們需要手動(dòng)創(chuàng)建這個(gè)配置文件。如果 .ssh 目錄不存在,首先創(chuàng)建 .ssh 目錄,使用命令 mkdir $HOME/.ssh 來(lái)創(chuàng)建目錄,如果提示目錄已經(jīng)存在,我們將會(huì)看到個(gè)消息 “File exists”,請(qǐng)忽略即可;如果目錄創(chuàng)建成功
    的頭像 發(fā)表于 05-05 10:41 ?2426次閱讀

    mysql個(gè)表能存多少數(shù)據(jù)

    mysql個(gè)表能存多少數(shù)據(jù) MySQL種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),它允許用戶在計(jì)算機(jī)上存儲(chǔ)和訪問(wèn)數(shù)據(jù)。
    的頭像 發(fā)表于 08-28 17:15 ?943次閱讀

    mysql個(gè)什么類型的數(shù)據(jù)庫(kù)

    MySQL種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),用于存儲(chǔ)和管理大量結(jié)構(gòu)化數(shù)據(jù)。它被廣泛用于各種應(yīng)用程序和網(wǎng)站的后端,包括電子商務(wù)平臺(tái)、社交媒體網(wǎng)站、金融系統(tǒng)等等。MySQL的特點(diǎn)是性能高、可靠性
    的頭像 發(fā)表于 11-16 14:43 ?1561次閱讀

    mysql怎么新建個(gè)數(shù)據(jù)庫(kù)

    mysql怎么新建個(gè)數(shù)據(jù)庫(kù) 如何新建個(gè)數(shù)據(jù)庫(kù)在MySQL中 創(chuàng)建
    的頭像 發(fā)表于 12-28 10:01 ?806次閱讀