mysql優化: show processlist 詳解

原文鏈接:https://www.jianshu.com/p/b05a0f8a8da5

最近排查一些MySQL的問題,會經常用到 show processlist,所以在這裏把這個命令總結一下,做個備忘,以備不時只需。

show processlist 是顯示用戶正在運行的線程,需要注意的是,除了 root 用戶能看到所有正在運行的線程外,其他用戶都只能看到自己正在運行的線程,看不到其它用戶正在運行的線程。除非單獨個這個用戶賦予了PROCESS 權限。

root用戶,可以看到全部線程運行情況

普通的activiti用戶只能看到自己的

單獨給activiti用戶授PROCESS權限,(授權後需要退出重新登錄)

show processlist 顯示的信息都是來自MySQL系統庫 information_schema 中的 processlist 表。所以使用下面的查詢語句可以獲得相同的結果:

select * from information_schema.processlist

瞭解這些基本信息後,下面我們看看查詢出來的結果都是什麼意思。

Id: 就是這個線程的唯一標識,當我們發現這個線程有問題的時候,可以通過 kill 命令,加上這個Id值將這個線程殺掉。前面我們說了show processlist 顯示的信息時來自information_schema.processlist 表,所以這個Id就是這個表的主鍵。

User: 就是指啓動這個線程的用戶。

Host: 記錄了發送請求的客戶端的 IP 和 端口號。通過這些信息在排查問題的時候,我們可以定位到是哪個客戶端的哪個進程發送的請求。

DB: 當前執行的命令是在哪一個數據庫上。如果沒有指定數據庫,則該值爲 NULL 。

Command: 是指此刻該線程正在執行的命令。這個很複雜,下面單獨解釋

Time: 表示該線程處於當前狀態的時間。

State: 線程的狀態,和 Command 對應,下面單獨解釋。

Info: 一般記錄的是線程執行的語句。默認只顯示前100個字符,也就是你看到的語句可能是截斷了的,要看全部信息,需要使用 show full processlist。

下面我們單獨看一下 Command 的值:

Binlog Dump: 主節點正在將二進制日誌 ,同步到從節點

Change User: 正在執行一個 change-user 的操作

Close Stmt: 正在關閉一個Prepared Statement 對象

Connect: 一個從節點連上了主節點

Connect Out: 一個從節點正在連主節點

Create DB: 正在執行一個create-database 的操作

Daemon: 服務器內部線程,而不是來自客戶端的鏈接

Debug: 線程正在生成調試信息

Delayed Insert: 該線程是一個延遲插入的處理程序

Drop DB: 正在執行一個 drop-database 的操作

Execute: 正在執行一個 Prepared Statement

Fetch: 正在從Prepared Statement 中獲取執行結果

Field List: 正在獲取表的列信息

Init DB: 該線程正在選取一個默認的數據庫

Kill : 正在執行 kill 語句,殺死指定線程

Long Data: 正在從Prepared Statement 中檢索 long data

Ping: 正在處理 server-ping 的請求

Prepare: 該線程正在準備一個 Prepared Statement

ProcessList: 該線程正在生成服務器線程相關信息

Query: 該線程正在執行一個語句

Quit: 該線程正在退出

Refresh:該線程正在刷表,日誌或緩存;或者在重置狀態變量,或者在複製服務器信息

Register Slave: 正在註冊從節點

Reset Stmt: 正在重置 prepared statement

Set Option: 正在設置或重置客戶端的 statement-execution 選項

Shutdown: 正在關閉服務器

Sleep: 正在等待客戶端向它發送執行語句

Statistics: 該線程正在生成 server-status 信息

Table Dump: 正在發送表的內容到從服務器

Time: Unused

如果有歧義可以查看官方文檔: 8.14.1 Thread Command Values

下面我們看看 State 的值有哪些:

… 發現有大神已經總結的超好了:MySQL SHOW PROCESSLIST協助故障診斷

… 所以大家直接看大神的文章就好了。好尷尬,但我是個有始有終的人,就醬紫吧。

官方文檔關於 State 的解釋: 8.14.2 General Thread States

下面是常用到的SQL,記錄下來便於使用。

按客戶端 IP 分組,看哪個客戶端的鏈接數最多

select client_ip,count(client_ip) as client_num from (select substring_index(host,':' ,1) as client_ip from processlist ) as connect_info group by client_ip order by client_num desc;

查看正在執行的線程,並按 Time 倒排序,看看有沒有執行時間特別長的線程

select * from information_schema.processlist where Command != 'Sleep' order by Time desc;

找出所有執行時間超過 5 分鐘的線程,拼湊出 kill 語句,方便後面查殺

select concat('kill ', id, ';') from information_schema.processlist where Command != 'Sleep' and Time > 300 order by Time desc;

後面,還有什麼發現,在繼續更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章