首頁  >  文章  >  資料庫  >  詳解MySQL執行緒狀態

詳解MySQL執行緒狀態

coldplay.xixi
coldplay.xixi轉載
2021-04-16 10:48:393795瀏覽

詳解MySQL執行緒狀態

文章目錄

    • #一、show processlist
    • #2、command指令類型
    • 三、使用者執行緒狀態
    • 四、dump執行緒狀態
    • 五、IO執行緒狀態
    • 六、SQL 執行緒狀態
    • 七、 主從連線執行緒狀態
    • 八、事件調度執行緒狀態

相關免費學習推薦:mysql影片教學

一、show processlist

  • Id:連線行程識別碼。是由 CONNECTION_ID() 函數傳回的值
  • User:執行語句的 MySQL 使用者名稱。如果顯示的是“system user”,它指的是由MySQL產生的非客戶端執行緒正在執行內部任務。例如主備複製中從
    庫上使用的 I/O 或 SQL 執行緒或延遲行處理程序的執行緒。 「unauthenticated user」指的是用戶端已經和服務端建立了 TCP/IP 連線但是還沒有對客戶端的使用者進行使用者密碼認證的執行緒。 「event_scheduler」指監視計畫任務調度事件的執行緒。
  • Host:執行語句的客戶端的主機名,以host_name:client_port顯示(如果啟用了skip_name_resolve 參數,則顯示為ip:client_port 格式)
  • Db:客戶端連線的預設資料庫(如果連線時指定了庫名),否則顯示為NULL 。
  • Command:執行緒正在執行的命令的類型。
  • Time:執行緒處於目前狀態的時間數(以秒為單位)。對於從庫 SQL 線程,該值是最後複製事件的時間和從庫的實際時間之間的秒數。
  • State:提示執行緒正在做什麼樣的操作,事件或狀態。
  • Info:執行緒正在執行的語句。

二、command命令類型

  • Binlog Dump:主庫執行緒用於將二進位日誌內容傳送到從庫
  • Change user:執行緒正在執行變更使用者操作
  • Close stmt:執行緒正在關閉一個預先編譯好的語句
  • Connect:從函式庫執行緒已經連線到主函式庫
  • # Connect Out:從庫正在連接到主庫
  • Create DB:線程正在執行一個建庫操作
  • Daemon:這個是server 內部線程,不是客戶端連接的線程
  • #Debug:執行緒正在產生偵錯資訊
  • Delayed insert:是延遲插入處理程序的執行緒
  • Drop DB:執行緒正在執行drop database 操作
  • Execute:執行緒正在執行一個預先編譯好的語句
  • Fetch:執行緒正在執行語句並從中取得結果集
  • Field List:執行緒正在檢索表格列的資訊
  • Init DB:執行緒正在選擇預設資料庫
  • Kill:執行緒正在殺死其他執行緒
  • Long Data:執行緒在執行語句並從中檢索並傳回長欄位(大欄位)類型的資料結果集
  • Ping:執行緒正在處理伺服器ping 請求
  • Prepare:執行緒正在執行預先編譯一個語句
  • Processlist:執行緒正在產生有關server 執行緒的資訊
  • Query :執行緒正在執行查詢語句
  • Quit:執行緒正在終止
  • Refresh:執行緒正在刷新表,日誌或高速緩存,或重置狀態變數或複製server 資訊
  • Register Slave:線程正在主庫上註冊從庫
  • Reset stmt:線程正在重置預編譯語句
  • Set option:線程正在設定或重置客戶端語句執行選項
  • Shutdown:執行緒正在執行關閉server
  • Sleep:執行緒正在等待客戶端向其發送新語句請求
  • Statistics:執行緒正在產生server 狀態資訊
  • # Table Dump:執行緒正在將表格內容傳送到從函式庫

三、使用者執行緒狀態

  • After create:當執行緒建立一個表格完成時(包括內部臨時表),就會出現這種狀態。
    即使因為某些錯誤而導致建立表最終出錯,也會出現此狀態
  • Analyzing:執行緒正在ANALYZE TABLE
  • checking permissions:正在server 中檢查執行緒是否具有執行語句所需的權限
  • Checking table:線程正在執行表檢查操作
  • cleaning up:線程已經執行完成了一個命令,並準備釋放所佔用的記憶體和重置某些狀態變量
  • closing tables:線程正在將表發生更改的資料刷新到磁碟並關閉表。
  • converting HEAP to MyISAM:執行緒正在將內部臨時表從 MEMORY 引擎表轉換為磁碟 MyISAM 引擎的臨時表
  • copy to tmp table:執行緒正在執行 ALTER TABLE 語句。此狀態發生在新結構的表已經建立好之後,執行copy 舊表資料到新表中之前出現
  • Copying to group table:如果語句使用了不同的ORDER BY 和GROUP BY 條件列,則依照group by 對這些行資料進行排序,並將排序結果複製到臨時表
  • Copying to tmp table:server 正在複製資料到記憶體臨時表
  • altering table:server 正在執行in -place 的ALTER TABLE 的過程
  • Copying to tmp table on disk:server 正在複製資料到磁碟臨時表。因為暫存結果集太大,所以,執行緒正在將記憶體暫存表轉換為基於磁碟的暫存表,以節省記憶體
  • Creating index:執行緒正在執行一個ALTER TABLE …ENABLE KEYS 語句
  • Creating sort index:執行緒正在執行SELECT 且使用到了內部暫存表
  • creating table:執行緒正在建立表。包含建立暫存表時也會使用此狀態
  • Creating tmp table:執行緒正在記憶體或磁碟上建立一個暫存表。如果表在記憶體中創建,但後來被轉換為磁碟表,則該操作期間的狀態將為「Copying to tmp table on disk」
  • committing alter table to storage engine:server 已執行完成in- place 演算法的ALTER TABLE 語句,正在提交
  • deleting from main table:server 正在執行多表刪除語句中的第一部分。看到這個
    狀態表示正在從第一個表中刪除,並保存後續用於刪除其他表的列資料和偏移量
  • deleting from reference tables:server 正在執行多表刪除語句的第二部分,從其他表中刪除匹配的行
  • discard_or_import_tablespace :線程正在執行ALTER TABLE … DISCARD TABLESPACE 或ALTER TABLE …IMPORT TABLESPACE 語句
  • #end:這發生在語句執行結束時,但在清除ALTER TABLE,CREATE VIEW,DELETE,INSERT,SELECT 或UPDATE 語句之前出現該狀態
  • executing:線程正在執行語句中
  • Execution of init_command:線程正在執行一個初始化系統變數的語句
  • freeing items:執行緒已經執行完成了一個指令。釋放一些涉及到 query cache 狀態
    的 items。這種狀態後通常緊接著cleaning up 狀態之後
  • FULLTEXT initialization:server 正在準備執行自然語言全文搜尋
  • init:這在ALTER TABLE,DELETE,INSERT,SELECT 或UPDATE 語句初始化之前發生的狀態。 server 在此狀態下執行的操作包括刷新二進位日誌,InnoDB 日誌和一些查詢快取清理操作。對於這個狀態結束時,可能會有以下一些操作:
    當表中的資料變更後刪除查詢快取條目
    將事件寫入二進位日誌
    釋放記憶體緩衝區,包括 blob
  • Killed:向執行緒發起一個 kill 操作,執行緒應該執行終止操作。在 MySQL 的每個主循環中檢查執行緒的 kill 標誌,但在某些情況下,殺死執行緒可能只需要很短的時間。但如果被 kill 的執行緒被其他執行緒鎖定,則需要等待其他執行緒釋放鎖定之後,kill 指令才會生效並執行。
  • logging slow query:線程正在向慢查詢日誌寫一條語句
  • login:連接線程的初始狀態,直到客戶端成功通過身份驗證
  • manage keys:server正在啟用或停用表索引
  • NULL:此狀態用於SHOW PROCESSLIST 語句
  • Opening tables:執行緒正嘗試開啟一個表。開啟表操作應該非常快,除非開啟操作被阻止。例如,ALTER TABLE 或 LOCK TABLE 語句可以防止開啟資料表,直到該語句完成。另外也可能是 table_open_cache 不夠大導致無法開啟表格。
  • optimizing:server 正在對查詢執行初始最佳化
  • preparing:此狀態發生在查詢最佳化期間
  • Purging old relay logs:執行緒正在刪除不需要的中繼日誌檔案
  • query end:此狀態出現在執行查詢語句之後但在釋放該查詢語句相關狀態items 之前
  • Reading from net:server 正在從網路讀取封包。在 MySQL 5.7.8 之後該狀態叫做「Receiving from client」 - Receiving from client:server 正在從客戶端讀取封包。在 MySQL 5.7.8 稱為「Reading from net」
  • Removing duplicates:查詢使用 SELECT DISTINCT 語句時,使 MySQL 無法在早期階段優化掉 distinct 操作。因此,MySQL 需要一個額外的階段來刪除所有重複的行,然後將結果傳送到客戶端
  • removing tmp table:執行緒在 SELECT 語句執行完成後,正在刪除內部暫存表。如果SELECT 語句未建立暫存表,則不會出現此狀態
  • rename:執行緒正在執行rename 語句重新命名表
  • rename result table:執行緒正在執行ALTER TABLE 語句重命名表,已經建立完成新表,並正在使用新表替換舊表名稱
  • Reopen tables:線程獲得了表鎖,但是獲得鎖後,發現基礎表結構已經被改變了。
    於是釋放表鎖,並關閉表,嘗試重新開啟表
  • Repair by sorting:修復程式碼正在使用排序來建立索引
  • preparing for alter table:server 正在準備執行in -place 演算法的ALTER TABLE 語句- Repair done:該執行緒已完成MyISAM 表的多執行緒修復
  • Repair with keycache:修正程式碼正在使用透過key cache 逐一建立key 的方法修復索引。這比透過排序索引修復的方法慢得多
  • Rolling back:執行緒正在回滾事務
  • Saving state:對於MyISAM 表操作(如修復或分析),執行緒正在將新表狀態儲存到.MYI 文件頭。狀態包括:表格資料行數,AUTO_INCREMENT 計數器和 key
    分佈之類的資訊
  • Searching rows for update:執行緒正在進行第一階段查找所有符合的行,然後再更新它們。如果UPDATE 正在更改用於查找涉及的行的索引,則必須先把update 滿足匹配的行先查找出來
  • Sending data:線程正在讀取和處理SELECT 語句產生的資料行,並將資料傳送到客戶端。因為在此狀態期間發生的操作可能產生大量的磁碟存取(讀取),所以它通常是給定查詢的生存期內最長的運行狀態
  • Sending to client:server 正在向客戶端寫入資料包。在MySQL 5.7.8 之前叫做「Writing to net」
  • setup:執行緒正在執行ALTER TABLE 操作
  • Sorting for group:執行緒正在執行一個GROUP BY 排序操作
  • Sorting for order:線程正在執行一個ORDER BY 排序操作
  • Sorting index:線程正在排序索引頁面,以便在MyISAM 表優化操作期間實現更有效率的存取
  • Sorting result:對於SELECT語句,這類似「Creating sort index」狀態,但是針對於非臨時表
  • statistics:server 正在計算統計資訊以最佳化查詢執行計劃。如果一個執行緒在這個狀態很長一段時間,server 可能是磁碟執行其他工作而阻塞了統計資料的操作,也有可能發生了鎖等待。
  • System lock:執行緒呼叫了mysql_lock_tables(),執行緒狀態從未更新過。這是一個非常常見的狀態,出現該狀態的原因有很多。例如,線程將請求或正在等待表的內部或外部系統鎖定。當 InnoDB 在執行 LOCK TABLES 期間等待表級鎖定時,可能會發生這種情況。如果此狀態是由外部鎖定請求引起的,如果您不使用多個mysqld 伺服器存取相同 MyISAM 表,則可以使用–skip-external-locking 選項停用外部系統鎖定。但是,預設情況下外部鎖定是停用的,因此此選項可能無效。
    對於SHOW PROFILE,此狀態表示執行緒正在要求鎖定
  • update:執行緒準備開始更新表
  • Updating:執行緒搜尋且正在更新資料行
  • ##updating main table:server正在執行多表更新語句的第一部分。該狀態表示正在
  • 更新第一個表,並保存列值和偏移量以用於更新其他(引用)表
  • updating reference tables:server 正在執行多表更新語句的第二部分,更新其他表格
  • 的符合行
  • User lock:執行緒將請求或正在等待透過GET_LOCK() 呼叫請求的建議鎖。對於SHOW PROFILE,此狀態表示執行緒正在要求鎖定(無需等待)
  • User sleep:執行緒已呼叫SLEEP() 呼叫
  • Waiting for commit lock:FLUSH TABLES WITH READ LOCK 語句正在取得提交鎖定
  • Waiting for global read lock:FLUSH TABLES WITH READ LOCK 正在等待獲取全域讀鎖或全域read_only 系統變數設定
  • Waiting for tables:執行緒取得到一個通知,表的底層結構已經改變,它需要重新開啟表格以獲得新的結構。但是,要重新開啟表,它必須等待,直到所有其他線
  • 程都關閉了舊資料結構的表的存取。如果另一個執行緒已在表中使用FLUSH TABLES 或下列語句之一,則會出現這個通知:
    FLUSH TABLES tbl_name
  • ALTER TABLE
  • RENAME TABLE * REPAIR TABLE
  • ANALYZE TABLE
  • OPTIMIZE TABLE
    Waiting for table flush:執行緒正在執行FLUSH TABLES,並且正在等待所有執行緒關閉所存取的表,或執行緒得到一個表的底層結構已經改變的通知,它需要重新開啟表以獲得新的結構。但是,要重新開啟表,它必須等待,直到所有其他執行緒都關閉了舊表結構的存取。如果另一個執行緒已在表中使用FLUSH TABLES 或下列語句之一,則會出現這個通知:
    FLUSH TABLES tbl_name
  • ALTER TABLE
  • RENAME TABLE
  • REPAIR TABLE
  • ANALYZE TABLE
  • OPTIMIZE TABLE
    Waiting for lock_type lock:server 正在等待取得一個THR_LOCK 鎖或從元資料鎖定子系統中取得一個MDL 鎖,其中lock_type 表示正在等待取得的MDL 鎖的類型,THR_LOCK 只有一種(Waiting for table level lock),MDL 鎖有以下幾種:
    Waiting for event metadata lock
  • Waiting for global read lock
  • Waiting for schema metadata lock
  • Waiting for stored function metadata lock
  • Waiting for stored procedure metadata lock
  • Waiting for table metadata lock
  • Waiting for trigger metadata lock
    #Waiting on cond:線程正在等待條件變為true 的通用狀態。沒有特定的狀態資訊可用
  • Writing to net:server 正在寫入資料包到網路。從MySQL 5.7.8 之後叫做「Sending to client」

四、dump執行緒狀態

##Finished reading one binlog; switching to next binlog :執行緒已經完成讀取binlog 文字
    件,並切換到下一個binlog 檔案

  • Master has sent all binlog to slave; waiting for more updates:執行緒已經從二進位日誌中讀取了所有剩餘的更新日誌,並將它們發送到從庫。線程目前處於空閒狀態,正在等待新的更新資料的事件寫入二進位日誌中
  • Sending binlog event to slave:線程已經從二進位日誌中讀取了一個事件,現在將其發送到從庫(二進位日誌由事件組成,一個事件通常是由發生更新的資料和一些其他資訊組成)
  • Waiting to finalize termination:執行緒停止時發生的非常短暫的狀態,執行緒正在執行停止執行緒相關的動作
五、IO執行緒狀態

#

  • Checking master version:建立與主庫的連線之後非常短暫的狀態,表示正在檢查主庫的版本號
  • Connecting to master:執行緒嘗試連線到主庫
  • Queueing master event to the relay log:線程已讀取一個事件,並將其複製到中繼日誌,以便SQL 線程進行重播
  • Reconnecting after a failed binlog dump request:線程正在嘗試重新連接到主庫
  • Reconnecting after a failed master event read:線程正在嘗試重新連接到主庫,當重連連接成功時,狀態將變為“Waiting for master to send event” - Registering slave on master:連接到主庫成功之後非常短暫的狀態,表示正在向主庫註冊從庫的連接資訊(如從庫的IP 和連接埠資訊等)
  • Requesting binlog dump:在與主庫建立連線成功之後非常短暫的狀態,使用當
    前的I/O 執行緒位置,向主庫發送從目前位置開始的二進位日誌的內容的請求
  • Waiting for its turn to commit :如果啟用了slave_preserve_commit_order 參數,則
    表示從庫I/O 執行緒正在等待較舊的工作執行緒提交資料
  • Waiting for master to send event:執行緒已經連接到主庫並且正在等待新的二進位
    日誌事件,如果主庫空閒,這可能會持續很長時間。如果等待時間持續超過slave_net_timeout 秒,則從庫 I/O 執行緒發生逾時。此時,從庫I/O 執行緒認為主庫的連線斷開,會嘗試重新連接主庫
  • Waiting for master update:連接到主庫之前的初始狀態
  • Waiting for slave mutex on exit:執行緒停止時短暫發生的狀態,表示正在回收I/O 執行緒的相關互斥資源
  • Waiting for the slave SQL thread to free enough relay log space:如果relay_log_space_limit 變數設定值不為0,那麼當中繼日誌總大小成長到超過此值時。 I/O 執行緒會等待,直到SQL 執行緒透過重播中繼日誌內容並刪除重播完成的中繼日誌以釋放中繼日誌佔用的空間,使其滿足中繼日誌中大小不大於relay_log_space_limit 變數的值時,I/O 執行緒才可以繼續寫入中繼日誌操作。
  • Waiting to reconnect after a failed binlog dump request:如果二進位日誌dump 請求失敗(由於斷開連接),那麼線程在進入sleep 狀態,此時出現此狀態,然後I/O 線程定期嘗試重新連接主庫。重試之間的間隔時間可以使用CHANGE MASTER TO 語句的MASTER_CONNECT_RETRY 選項指定
  • 要注意,從庫的I/O 執行緒連接主庫是有心跳機制的,當主庫超過這個心跳時間沒有發送新的event 到slave 上時,I/O 線程就對主庫發起一個心跳請求,如果請求成功就重置心跳時間,當主庫有新的event 發送到slave 時,這個心跳時間也會進行重置。心 跳 時 間 由 change master 語句的MASTER_HEARTBEAT_PERIOD 選項設定(以秒為單位),範圍 0 到 4294967 秒,解析度(毫秒)最小非零值為0.001,表示 1 毫秒。將間隔設為 0 時表示停用心跳。預設值是slave_net_timeout 配置參數的二分之一。 so,理論上是不會出現主從資料庫正常的情況下因為主庫沒有寫資料而導致從庫 I/O 執行緒斷開的情況。
  • Waiting to reconnect after a failed master event read:讀取主函式庫 binlog 時發生錯誤(因為斷線)。 I/O 執行緒在嘗試重新連接主庫之前,執行緒正在以CHANGE MASTER TO 語句的MASTER_CONNECT_RETRY 選項(預設為60)設定的秒數進行sleep(該時間是重連失敗之後的重試間隔時間)

六、SQL 執行緒狀態

  • Killing slave:執行緒正在處理STOP SLAVE 語句
  • Making temporary file(append)before replaying LOAD DATA INFILE:執行緒正在執行LOAD DATA INFILE 語句,並將從庫中讀取的資料新增至暫存檔案
  • Making temporary file(create)before replaying LOAD DATA INFILE:執行緒正在執行LOAD DATA INFILE 語句,且正在建立臨時文件,臨時檔案中包含了從庫將要讀取行資料。注意:只有在MySQL 5.0.3 之前的版本中,主函式庫記錄了原始LOAD DATA INFILE 語句時,才能遇到此狀態
  • Reading event from the relay log:執行緒正在從中繼日誌中讀取事件,以便進行重播
  • Slave has read all relay log; waiting for more updates:線程已重做完所有的中繼日誌檔案中的所有事件,正在等待I/O 線程向中繼日誌中寫入新的事件
  • Waiting for an event from Coordinator:從庫使用多執行緒複製時(slave_parallel_workers 大於1),此狀態表示一個slave works 執行緒正在等待協調器執行緒(Coordinator 執行緒)分配日誌事件
  • Waiting for slave mutex on exit:在執行緒停止時發生的非常短暫的狀態
  • Waiting for Slave Workers to free pending events:當Workers 執行緒處理的事件的總數大小超過slave_pending_joslave_pending_josize_size_max系統變數的大小時,會發生等待操作(協調器執行緒不進行分配事件給worker 執行緒)。當 Workers 執行緒處理的事件的總數量大小低於 slave_pending_jobs_size_max 限制時,協調器恢復調度。只有當slave_parallel_workers 設定為大於0 時,此狀態才會出現
  • Waiting for the next event in relay log:「Reading event from the relay log」狀態之前的初始狀態
  • Waiting until MASTER_DELAY seconds after master executed event:SQL 執行緒已讀取事件,但並沒有進行應用,而是正在等待從庫設定的延遲複製時間失效。此延遲時間使用 CHANGE MASTER TO 的 MASTER_DELAY 選項設定
    ⚫ SQL 執行緒的 Info 欄位也可以顯示語句的文字。這表示執行緒已經從中繼日誌中讀取了一個事件,並從中提取了 SQL 語句,目前可能正在執行這個語句對應的事件。

七、 主從連線執行緒狀態

  • #Changing master:執行緒正在處理CHANGE MASTER TO 語句
  • Killing slave:執行緒正在處理STOP SLAVE 語句
  • Opening master dump table:此狀態發生在主庫建立dump 表之後
  • Reading master dump table data:"Opening master dump table"狀態後出現的狀態,表示正在從主函式庫dump 表讀取資料
  • Rebuilding the index on master dump table:「Reading master dump table data」狀態之後出現的狀態,表示正在重建主函式庫dump 表索引

#八、事件調度執行緒狀態

  • Clearing:調度程序執行緒正在停止執行事件
  • Initialized:調度程式執行緒已初始化完成,將要執行調度事件
  • Waiting for next activation:調度程式具有非空事件佇列時,正在等待未來某個時間點啟動佇列中的某個事件,以便進行排程並執行
  • # Waiting for scheduler to stop:線程發出SET GLOBAL event_scheduler = OFF 並等待調度程序停止
  • Waiting on empty queue:調度程序的事件隊列為空,因此調度程序處於休眠狀態

##相關免費學習推薦:##mysql資料庫#(影片)

###

以上是詳解MySQL執行緒狀態的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除
上一篇:mysql修改語句下一篇:mysql修改語句