色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一個Kill不掉的MySQL會話

OSC開源社區 ? 來源:愛可生開源社區 ? 2023-07-10 14:47 ? 次閱讀

作者:秦廣飛

愛可生 DBA 團隊成員,負責項目日常問題處理及公司平臺問題排查,對數據庫有興趣,對技術有想法。一入 IT 深似海,從此節操是路人。

本文來源:愛可生開源社區

1背景

照例要先講下本文檔背景的,不過在介紹背景之前,先簡單說下 MySQL 主從切換的過程。

正常來說,當要發生主從切換時,主庫要做下面幾個動作:

斷開流量入口(解綁 VIP)

設置只讀

Kill 掉數據庫殘留連接

而從庫,要做下面幾個動作:

補全與主庫差異的 binlog 日志

關閉只讀

清除復制信息

開啟流量入口(綁定 VIP)

我們公司自研的數據庫集群管理平臺 云樹 DMP[1] 大概也是這么個切換過程,而這個切換過程跟本文的關聯點,就在主庫 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 的這個"連接"。

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

2什么是 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 信息的原因。

3為什么 Kill 不掉?

了解 event_scheduler 大概是什么之后,我們再來看看,為什么 Kill 時,會報 Unknown thread id。

注意看 processlist 信息,我們發現 event_scheduler 的 COMMAND 值為 Daemon。從字面意思上看,Daemon 為后臺守護的意思,其實在 MySQL 中,當在后臺運行一些特殊的功能時,會話 COMMAND 可能被標記為 Daemon(實際工作場景中,只注意到過 event_scheduler)。

因為這類會話并不是由用戶直接發起的連接,而是 MySQL 內部的線程,所以無法像普通會話一樣被 Kill 掉。

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

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

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

4如何使用定時任務?

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

啟用/關閉/禁用

--修改變量event_scheduler來動態啟用或者關閉event
mysql>showvariableslike'%event_scheduler%';
+-----------------+-------+
|Variable_name|Value|
+-----------------+-------+
|event_scheduler|ON|
+-----------------+-------+
1rowinset(0.00sec)

mysql>

--關閉
mysql>SETGLOBALevent_scheduler=0;

--啟用
mysql>SETGLOBALevent_scheduler=1;

--禁用event_scheduler,只能在配置文件中設置event_scheduler為disable并重啟服務,而不能動態修改
[mysqld]
event_scheduler=DISABLED

創建

--準備測試表和數據
mysql>CREATETABLElogs(idINT(11)primarykeyAUTO_INCREMENT,log_messageVARCHAR(255)NOTNULL,log_timeTIMESTAMPNOTNULL);
QueryOK,0rowsaffected,1warning(0.02sec)

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

mysql>

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

查看

--執行showevents查看,需要先進到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>

--通過information_schema.events可以看到更詳細的信息
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

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

--我們在從庫上看下event的信息,可以看到STATUS為SLAVESIDE_DISABLED,因此不用擔心從庫重復執行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語句修改,其他高權限用戶也可以執行,且event的用戶會變成最后一個ALTER的用戶
mysql>ALTEREVENTdelete_logs_event
->ONSCHEDULEEVERY1DAYSTARTS'2023-06-190000'
->DO
->DELETEFROMlogs
->WHERElog_time

--可以看到DEFINER已經變成了修改的用戶,且時間間隔也修改為了1天,DELETE語句也去掉了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)

切換時注意

當在主庫上創建了 event,之后發生了主從切換。此時 event 并不會隨著切換而變成在新主上執行,且狀態也不會發生改變。

即原主 event 的狀態還是 ENABLED,而新主 event 的狀態還是 DISABLED。

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

5總結

show processlist 中看到的 User 為 event_scheduler 的會話為 MySQL 內部線程,無法被 Kill 掉。

在主庫上創建的 event,定時執行的 SQL 語句,在從庫上會正常隨著復制回放,但不會被重復執行。

主從切換后,原主上的 event 不會在新主上執行。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3842

    瀏覽量

    64574
  • MySQL
    +關注

    關注

    1

    文章

    826

    瀏覽量

    26664
  • kill
    +關注

    關注

    0

    文章

    9

    瀏覽量

    2115
  • 調度器
    +關注

    關注

    0

    文章

    98

    瀏覽量

    5268

原文標題:一個Kill不掉的MySQL會話

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    mysql中文參考手冊chm

    運營使用MySQL的Web服務器   3.5 MySQL的許可證和技術支持費用 3.5.1 付款信息 3.5.2 聯系信息 3.6 商業性支持的類型 3.6.
    發表于 12-26 13:32

    新人剛接觸kill5,求助

    [size=13.63636302947998px]kill5能開發51單片機嗎,51單片機的固件庫是什么?[size=13.63636302947998px]裝kill4的時候 里面沒有STM32的固件庫,同時裝kill4和
    發表于 03-09 22:50

    VDSP建立會話出現了窗口

    是這樣子的,我需要建立會話跟蹤數據,我根據書本建立了非模擬器環境下的會話窗口,他提示了我這樣
    發表于 12-06 09:21

    labview 錯誤-1074395214發生于 IMAQ OCR Create Session。打開的OCR會話太多。必須先關閉會話,然后才能打開另一個會話

    `想做一個數字識別,運行時失敗了彈出錯誤-1074395214發生于 IMAQ OCR Create Session。打開的OCR會話太多。必須先關閉會話,然后才能打開另一個
    發表于 06-23 01:49

    如何利用ESP8266模塊去制作WIFI kill固件呢

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

    kill結構中的參數RFU和RECOM是什么意思

    我嘗試殺死 TAG,我使用不同的配置但沒有得到不同的答案。我相信如果殺死標簽,我的讀者就不可能識別出她,但在我使用 kill 命令后
    發表于 12-23 06:22

    Web應用程序會話安全模塊的設計

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

    以多種方式使用”kill”命令終結應用

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

    如何在調試會話中編程EEPROM記憶?

    Atmel小貼士 在調試會話中如何編程 EEPROM 記憶
    的頭像 發表于 07-10 10:51 ?8653次閱讀

    Linux使用kill命令的注意事項

     Linux系統下有直接終止進程的命令,這個命令的代碼也是非常霸氣,直接就是英文的kill。既然這個命令這么有“殺氣”,為了防止“誤傷”,下面小編就給大家來普及下Linux使用
    發表于 07-16 14:30 ?702次閱讀

    會話式機器閱讀理解概述

    理解的類型: 第種是標準的閱讀理解,該模式是指,給定篇描述型的文章和基于事實型的問題,通過匹配文章和問題,從文章中抽取
    的頭像 發表于 11-25 16:07 ?2312次閱讀

    保持SSH會話不掉

    如果我們看到這個錯誤消息,意味著我們需要手動創建這個配置文件。如果 .ssh 目錄不存在,首先創建 .ssh 目錄,使用命令 mkdir $HOME/.ssh 來創建目錄,如果提示目錄已經存在,我們將會看到消息 “File exists”,請忽略即可;如果目錄創建成功
    的頭像 發表于 05-05 10:41 ?2575次閱讀

    mysql表能存多少數據

    mysql表能存多少數據 MySQL種關系型數據庫管理系統(RDBMS),它允許用戶在計算機上存儲和訪問數據。
    的頭像 發表于 08-28 17:15 ?1012次閱讀

    mysql什么類型的數據庫

    MySQL種關系型數據庫管理系統(RDBMS),用于存儲和管理大量結構化數據。它被廣泛用于各種應用程序和網站的后端,包括電子商務平臺、社交媒體網站、金融系統等等。MySQL的特點是性能高、可靠性
    的頭像 發表于 11-16 14:43 ?1862次閱讀

    mysql怎么新建數據庫

    mysql怎么新建數據庫 如何新建數據庫在MySQL中 創建
    的頭像 發表于 12-28 10:01 ?941次閱讀
    主站蜘蛛池模板: 亚洲人成电影网站色2017| 91精品国产色综合久久不| 99久久人妻无码精品系列性欧美| 狠狠色香婷婷久久亚洲精品| 亚瑟天堂久久一区二区影院| 国产成人无码精品久久久按摩| 日本久久久免费高清| 粉嫩小护士| 无修肉动漫在线观看影片| 国产精品www视频免费看| 午夜dj影院视频观看| 国产人成精品综合欧美成人| 亚洲国产av| 久久精品视频在线看| 91精品国产91| 青柠在线观看视频在线高清完整| 芭乐视频网页版在线观看| 日韩亚射吧| 国产亚洲精品AV片在线观看播放| 亚洲精品AV中文字幕在线| 久9青青cao精品视频在线| 2020精品极品国产色在线| 内射一区二区精品视频在线观看 | 一区二区三区福利视频| 久久精品国产欧美| 99国产在线精品观看二区| 中国二级毛片| 毛茸茸womansex| 扒开她的黑森林让我添动态图| 三叶草未满十八岁| 国产麻豆AV伦| 又紧又大又爽精品一区二区| 男同志video最新猛男| 国产不卡视频在线观看| 一本大道熟女人妻中文字幕在线| 麻豆一二三四区乱码| 饱满奶大30p| 亚洲精品久久久久一区二区三| 老师湿乎乎两半嫩| 成人国内精品久久久久影院| 亚洲国产精品综合久久一线|