精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

一個Kill不掉的MySQL會話

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

作者:秦廣飛

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

本文來源:愛可生開源社區(qū)

1背景

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

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

斷開流量入口(解綁 VIP)

設置只讀

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

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

補全與主庫差異的 binlog 日志

關閉只讀

清除復制信息

開啟流量入口(綁定 VIP)

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

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

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

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

2什么是 event_scheduler?

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

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

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

當 MySQL 事件調(diào)度器啟用時 event_scheduler=ON,MySQL 就會在后臺啟動一個 event_scheduler 線程,并且 event_scheduler 線程將一直運行,直到 MySQL 服務停止。該線程會負責檢查當前時間和已定義的事件,如果事件需要執(zhí)行,則 event_scheduler 線程將啟動一個新的會話來執(zhí)行事件。

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

3為什么 Kill 不掉?

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

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

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

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

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

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

4如何使用定時任務?

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

啟用/關閉/禁用

--修改變量event_scheduler來動態(tài)啟用或者關閉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并重啟服務,而不能動態(tài)修改
[mysqld]
event_scheduler=DISABLED

創(chuàng)建

--準備測試表和數(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
->('君不見黃河之水天上來,奔流到海不復回','2023-06-070900'),
->('君不見高堂明鏡悲白發(fā),朝如青絲暮成雪','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>

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

查看

--執(zhí)行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|君不見高堂明鏡悲白發(fā),朝如青絲暮成雪|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,因此不用擔心從庫重復執(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語句修改,其他高權限用戶也可以執(zhí)行,且event的用戶會變成最后一個ALTER的用戶
mysql>ALTEREVENTdelete_logs_event
->ONSCHEDULEEVERY1DAYSTARTS'2023-06-190000'
->DO
->DELETEFROMlogs
->WHERElog_time

--可以看到DEFINER已經(jīng)變成了修改的用戶,且時間間隔也修改為了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)

切換時注意

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

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

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

5總結

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

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

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

審核編輯:湯梓紅

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

    關注

    7

    文章

    3767

    瀏覽量

    64280
  • MySQL
    +關注

    關注

    1

    文章

    802

    瀏覽量

    26452
  • kill
    +關注

    關注

    0

    文章

    9

    瀏覽量

    2101
  • 調(diào)度器

    關注

    0

    文章

    98

    瀏覽量

    5243

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

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

收藏 人收藏

    評論

    相關推薦

    mysql中文參考手冊chm

    運營使用MySQL的Web服務器   3.5 MySQL的許可證和技術支持費用 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單片機嗎,51單片機的固件庫是什么?[size=13.63636302947998px]裝kill4的時候 里面沒有STM32的固件庫,同時裝kill4和
    發(fā)表于 03-09 22:50

    VDSP建立會話出現(xiàn)了窗口

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

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

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

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

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

    kill結構中的參數(shù)RFU和RECOM是什么意思

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

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

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

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

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

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

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

    Linux使用kill命令的注意事項

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

    會話式機器閱讀理解概述

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

    保持SSH會話不掉

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

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

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

    mysql什么類型的數(shù)據(jù)庫

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

    mysql怎么新建數(shù)據(jù)庫

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