首页
/
每日頭條
/
職場
/
kill命令的使用技巧
kill命令的使用技巧
更新时间:2025-07-01 07:00:32
前言

在平時使用MySQL的過程中,不知道你是否遇到一個查詢很長時間沒有出結果,這個時候,你可能會:執行kill query 線程id來終止這個查詢語句;或者,kill connectIOn 線程id斷開連接;又或者,Ctrl C結束線程終止查詢。

但是,是不是會發現一個奇怪的現象,可能你在客戶端感覺不到,但是這個時候如果有交易并且涉及剛剛查詢的表,可能就會超時,看binlog日志會發現查詢并沒有結束?這是為什麼呢?

其實大多數情況下,kill query/connection 命令是有效的。比如,執行一個查詢的過程中,發現執行時間太久,要放棄繼續查詢,這時我們就可以用 kill query 命令,終止這條查詢語句。

還有一種情況是,語句處于鎖等待的時候,直接使用 kill 命令也是有效的。如下:

kill命令的使用技巧(老闆不了解kill原理)1

但是,我們思考一下:session B 是直接終止掉線程,什麼都不管就直接退出嗎?顯然,這是不行的。

線程收到kill指令後做什麼呢?

了解一定MySQL的人應該都知道,當對一個表做增删改查操作時,會在表上加 MDL 讀鎖。上圖session B 雖然處于 blocked 狀态,但還是拿着一個 MDL 讀鎖的。如果線程被 kill 的時候,就直接終止,那之後這個 MDL 讀鎖就沒機會被釋放了。

由此,我們可以了解到,線程收到kill指令後并不會馬上停止,而是會等執行完當前的操作才會停止。

其實,這跟 Linux 的 kill 命令類似,kill -N pid 并不是讓進程直接停止,而是給進程發一個信号,然後進程處理這個信号,進入終止邏輯。隻是對于 MySQL 的 kill 命令來說,不需要傳信号量參數,就隻有“停止”這個命令。

kill query thread_id過程

MySQL線程收到kill query thread_id_B指令後,做了兩件事:

  1. 把 session B 的運行狀态改成 THD::KILL_QUERY(将變量 killed 賦值為 THD::KILL_QUERY);
  2. 給 session B 的執行線程發一個信号。發一個信号的目的,就是讓 session B 退出等待,來處理這個 THD::KILL_QUERY 狀态。
kill不掉的查詢-線程沒有執行到判斷線程狀态
  • 前提

setglobal InnoDB_thread_concurrency=2,将 InnoDB 的并發線程上限數設置為 2;

kill命令的使用技巧(老闆不了解kill原理)2

可以看到:

  1. sesssion C 執行的時候被堵住了;
  2. 但是 session D 執行的 kill query C 命令卻沒什麼效果,
  3. 直到 session E 執行了 kill connection 命令,才斷開了 session C 的連接,提示“Lost connection to MySQL server during query”
  4. 但是這時候,如果在 session E 中執行 show processlist,你就能看到下面這個圖。

kill命令的使用技巧(老闆不了解kill原理)3

在這個例子裡,12 号線程的等待邏輯是這樣的:每 10 毫秒判斷一下是否可以進入 InnoDB 執行,如果不行,就調用 nanosleep 函數進入 sleep 狀态。

也就是說,雖然 12 号線程的狀态已經被設置成了 KILL_QUERY,但是在這個等待進入 InnoDB 的循環過程中,并沒有去判斷線程的狀态,因此根本不會進入終止邏輯階段。

那為什麼執行 show processlist 的時候,會看到 Command 列顯示為 killed 呢?其實,這就是因為在執行 show processlist 的時候,有一個特别的邏輯:

如果一個線程的狀态是KILL_CONNECTION,就把Command列顯示成Killed。

這個例子是 kill 無效的第一類情況,即:線程沒有執行到判斷線程狀态的邏輯。跟這種情況相同的,還有由于 IO 壓力過大,讀寫 IO 的函數一直無法返回,導緻不能及時判斷線程的狀态。

kill不掉的查詢-終止邏輯耗時較長

這類情況常見的幾種場景:

  1. 超大事務執行期間被 kill。這時候,回滾操作需要對事務執行期間生成的所有新數據版本做回收操作,耗時很長。
  2. 大查詢回滾。如果查詢過程中生成了比較大的臨時文件,加上此時文件系統壓力大,删除臨時文件可能需要等待 IO 資源,導緻耗時較長。
  3. DDL 命令執行到最後階段,如果被 kill,需要删除中間過程的臨時文件,也可能受 IO 資源影響耗時較久。
Ctrl C

相信大家一定在客戶端執行查詢時,使用過Ctrl C終止查詢吧,在客戶端看起來是終止,但是,其實查詢并不一定立馬終止了的。

其實在客戶端的操作隻能操作到客戶端的線程,客戶端和服務端隻能通過網絡交互,是不可能直接操作服務端線程的。

而由于 MySQL 是停等協議,所以這個線程執行的語句還沒有返回的時候,再往這個連接裡面繼續發命令也是沒有用的。

實際上,執行 Ctrl C 的時候,是 MySQL 客戶端另外啟動一個連接,然後發送一個 kill query 命令。所以,Ctrl C最終還是要執行kill query的流程的。

總結

今天,給大家介紹了一些kill不掉的情況,這些“kill 不掉”的情況,其實是因為發送 kill 命令的客戶端,并沒有強行停止目标線程的執行,而隻是設置了個狀态,并喚醒對應的線程。而被 kill 的線程,需要執行到判斷狀态的“埋點”,才會開始進入終止邏輯階段。并且,終止邏輯本身也是需要耗費時間的。

所以,如果你發現一個線程處于 Killed 狀态,你可以做的事情就是,通過影響系統環境,讓這個 Killed 狀态盡快結束。

另外,這裡還有一點要跟大家強調下的,也是我在實際工作中的了解:

  1. 如果我們要查詢一些數據,盡量不要查詢主庫,因為主庫上有很多交易的寫操作,盡量在從庫執行,影響小一些。
  2. 不要在生産執行複雜的大查詢,即使是從庫也是會影響到正常交易的讀操作的。
  3. 如果真的需要周期性查詢一些數據,可以選擇從大數據中心的備份數據裡讀取,大數據中心一般都會同步生産系統的相關表和數據的。或者可以通過程序在非交易時間段(或交易量少的時候)進行查詢。

以上,希望有幫助到大家,在客戶端執行查詢一定要先分析sql是否可以在生産執行呢~可以先在準生産環境先執行也是能防患未然的呢。

(歡迎關注留言~一起學習進步呀)

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
打卡許昕乒乓球館(許昕球館開業迎客)
打卡許昕乒乓球館(許昕球館開業迎客)
  #頭條創作挑戰賽#      乒乓球友您好,我是乒談。   許昕的品牌球館昨天在上海正式營業。開業儀式上可謂是大咖非常多,包括徐寅生、曹燕華、王勵勤等人。   可以看出來,許昕的人緣是非常好的,這主要是得益于他高超的技戰術、情商等因素。      許昕的球館品牌叫Xuperman,昨天一大早,球館外就擺滿了鮮花,這也象征着許昕即将開啟新的、更為美好的人生...
2025-07-01
dnf鬼劍士二覺技能欄推薦(鬼劍士全體削弱)
dnf鬼劍士二覺技能欄推薦(鬼劍士全體削弱)
  不知不覺,距離8月20日冬季發布會結束,已經有一小段時間了!這次發布會公告9月會加入的内容有很多,例如日常/周常副本減負、神話改版、罩子兵削弱,以及第3波職業平衡等等,其中要說玩家最關心的,莫過于第3波職業平衡了。這次平衡總共涉及22個職業,除了劍帝、刃影、外傳職業之外,未加強過的職業都有在其中。   策劃提前爆料氣功罩子削弱  而在這次平衡的22個職業...
2025-07-01
18大稅種完整版實操攻略圖(老闆必懂的3大稅種)
18大稅種完整版實操攻略圖(老闆必懂的3大稅種)
  老闆作為最高決策者,有必要去了解一些基本的财稅知識,這樣才能更好地掌握公司的财務狀況,更有利于企業的運營與管理。   我國現行的稅種有18種,企業一般要繳的稅費大約6-10種。但對于老闆,其中3大稅種必須要懂:   一、增值稅:公司有收入交增值稅   ① 一般納稅人:6%、9%、13%   ② 小規模納稅人:2023年執行   1)月收入>10萬/季度3...
2025-07-01
小叮當成長點滴記錄(我是小叮當工作特别忙)
小叮當成長點滴記錄(我是小叮當工作特别忙)
  本文資料由小編整理自“清靜化城”的新浪博客、會員chaoyueshikong的360doc個人圖書館、百度百科“孫進修”等。   來源:樂亭故鄉人網站(www.guxiangren.com)            “小朋友,小喇叭開始廣播啦。嗒嘀嗒、哒嘀哒、嗒嘀嗒、哒嗒。”相信每一個1985年前出生的人,再一次聽到這段音樂時都會感到無比熟悉、親切。從19...
2025-07-01
時尚又減齡的圍巾系法一定要學會(時髦有型的8種圍巾系法)
時尚又減齡的圍巾系法一定要學會(時髦有型的8種圍巾系法)
  尤其是像時尚博主Leonie Hanne這種粗棒針的針織款,堆砌會讓人顯得很臃腫,而随意的披挂反而成為搭配增添了亮點。      時尚博主Leonie Hanne   時尚博主Charlotte Bridgeman、和時尚博主Marina the Moss這種亮色的流蘇圍巾也很适合冬天,輕輕松松就能從滿大街的黑白灰中跳脫出來!      時尚博主Char...
2025-07-01
Copyright 2023-2025 - www.tftnews.com All Rights Reserved