mysql排查線上數據庫問題,經常會用到 show processlist和show full processlist這兩條命令
processlist命令的輸出結果顯示了有哪些線程在運行,不僅可以查看當前所有的連接數,還可以查看當前的連接狀態幫助識別出有問題的查詢語句等。
如果是root帳號,能看到所有用戶的當前連接。如果是其他普通帳號,則只能看到自己占用的連接。showprocesslist只能列出當前100條。如果想全部列出,可以使用SHOW FULL PROCESSLIST命令
各個列的含義:
1、id列,用戶登錄mysql時,系統分配的"connection_id",可以使用函數connection_id()查看
2、user列,顯示當前用戶。如果不是root,這個命令就只顯示用戶權限范圍的sql語句
3、host列,顯示這個語句是從哪個ip的哪個端口上發的,可以用來跟蹤出現問題語句的用戶
4、db列,顯示這個進程目前連接的是哪個數據庫
5、command列,顯示當前連接的執行的命令,一般取值為休眠(sleep),查詢(query),連接(connect)等
6、time列,顯示這個狀態持續的時間,單位是秒
7、state列,顯示使用當前連接的sql語句的狀態,很重要的列。state描述的是語句執行中的某一個狀態。一個sql語句,以查詢為例,可能需要經過copying to tmp table、sorting result、sending data等狀態才可以完成
8、info列,顯示這個sql語句,是判斷問題語句的一個重要依據,一般記錄的是線程執行的語句。默認只顯示前100個字符,也就是你看到的語句可能是截斷了的,要看全部信息,需要使用 show full processlist。
備注:
1、按客戶端的 IP 分組,查看各個客戶端的鏈接數情況
select
client_ip,
count
(client_ip)
as
client_num
from
(
select
substring_index(host,
':'
,1)
as
client_ip
from
information_schema.processlist )
as
connect_info
group
by
client_ip
order
by
client_num
desc
;
select
*
from
information_schema.processlist
where
Command !=
'Sleep'
order
by
Time
desc
;
select
concat(
'kill '
, id,
';'
)
from
information_schema.processlist
where
Command !=
'Sleep'
and
Time
> 60
order
by
Time
desc
;