溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

show full processlist在Mysql當(dāng)中的作用

發(fā)布時間:2020-05-19 13:42:38 來源:億速云 閱讀:435 作者:Leah 欄目:MySQL數(shù)據(jù)庫

今天小編就為大家?guī)硪黄嘘P(guān)Mysql當(dāng)中show full processlist的文章。小編覺得挺實(shí)用的,為此分享給大家做個參考。一起跟隨小編過來看看吧。

show full processlist 返回的結(jié)果是實(shí)時變化的,是對 mysql 鏈接執(zhí)行的現(xiàn)場快照,所以用來處理突發(fā)事件非常有用。

這個 sql,一般就是充當(dāng)救火隊(duì)員的角色,解決一些突發(fā)性的問題。

它可以查看當(dāng)前 mysql 的一些運(yùn)行情況,是否有壓力,都在執(zhí)行什么 sql,語句耗時幾何,有沒有慢 sql 在執(zhí)行等等。

當(dāng)發(fā)現(xiàn)一些執(zhí)行時間很長的 sql 時,就需要多注意一下了,必要時 kill 掉,先解決問題。

命令有三種執(zhí)行方式:

1、這種是直接在命令行查詢,末尾帶 \G 是表示將查詢結(jié)果進(jìn)行按列打印,可以使每個字段打印到單獨(dú)的行。

mysql> show full processlist;
+--------+------+----------------------+-------+---------+------+----------+-----------------------+
| Id     | User | Host                 | db    | Command | Time | State    | Info                  |
+--------+------+----------------------+-------+---------+------+----------+-----------------------+
| 449000 | root | 127.123.213.11:59828 | stark | Sleep   | 1270 |          | NULL                  |
| 449001 | root | 127.123.213.11:59900 | stark | Sleep   | 1241 |          | NULL                  |
| 449002 | root | 127.123.213.11:59958 | stark | Sleep   | 1216 |          | NULL                  |
| 449003 | root | 127.123.213.11:60088 | stark | Sleep   | 1159 |          | NULL                  |
| 449004 | root | 127.123.213.11:60108 | stark | Sleep   | 1151 |          | NULL                  |
| 449005 | root | 127.123.213.11:60280 | stark | Sleep   | 1076 |          | NULL                  |
| 449006 | root | 127.123.213.11:60286 | stark | Sleep   | 1074 |          | NULL                  |
| 449007 | root | 127.123.213.11:60344 | stark | Sleep   | 1052 |          | NULL                  |
| 449008 | root | 127.123.213.11:60450 | stark | Sleep   | 1005 |          | NULL                  |
| 449009 | root | 127.123.213.11:60498 | stark | Sleep   |  986 |          | NULL                  |
| 449013 | root | localhost            | NULL  | Query   |    0 | starting | show full processlist |
+--------+------+----------------------+-------+---------+------+----------+-----------------------+
11 rows in set (0.01 sec)
mysql> show full processlist\G;
*************************** 1. row ***************************
     Id: 449000
   User: root
   Host: 127.123.213.11:59828
     db: stark
Command: Sleep
   Time: 1283
  State: 
   Info: NULL
*************************** 2. row ***************************
     Id: 449001
   User: root
   Host: 127.123.213.11:59900
     db: stark
Command: Sleep
   Time: 1254
  State: 
   Info: NULL

2、通過查詢鏈接線程相關(guān)的表來查看快照

SELECT id, db, USER, HOST, command, time, state, info FROM information_schema. PROCESSLIST WHERE command != 'Sleep' ORDER BY time DESC;

3、通過 navicat 中的【工具】=> 【服務(wù)器監(jiān)控】進(jìn)行查看。

這種方式比較方便,還可以排序。

簡單介紹一下,每列的含義:

Id:鏈接 mysql 服務(wù)器線程的唯一標(biāo)識,可以通過 kill 來終止此線程的鏈接。

User:當(dāng)前線程鏈接數(shù)據(jù)庫的用戶

Host:顯示這個語句是從哪個 ip 的哪個端口上發(fā)出的??捎脕碜粉櫝鰡栴}語句的用戶

db: 線程鏈接的數(shù)據(jù)庫,如果沒有則為 null

Command: 顯示當(dāng)前連接的執(zhí)行的命令,一般就是休眠或空閑(sleep),查詢(query),連接(connect)

Time: 線程處在當(dāng)前狀態(tài)的時間,單位是秒

State:顯示使用當(dāng)前連接的 sql 語句的狀態(tài),很重要的列,后續(xù)會有所有的狀態(tài)的描述,請注意,state 只是語句執(zhí)行中的某一個狀態(tài),一個 sql 語句,已查詢?yōu)槔赡苄枰?jīng)過 copying to tmp table,Sorting result,Sending data 等狀態(tài)才可以完成

Info: 線程執(zhí)行的 sql 語句,如果沒有語句執(zhí)行則為 null。這個語句可以使客戶端發(fā)來的執(zhí)行語句也可以是內(nèi)部執(zhí)行的語句

發(fā)現(xiàn)問題之后怎樣解決它呢?

1、可以單獨(dú) kill 掉上面有問題的行

kill 449000

2、也可以批量結(jié)束時間超過 3 分鐘的線程

-- 查詢執(zhí)行時間超過3分鐘的線程,然后拼接成 kill 語句

select concat('kill ', id, ';')

from information_schema.processlist

where command != 'Sleep'

and time > 3*60

order by time desc;

當(dāng)然問題到這,一般都能解決了,但是本次在 show processlist 過程中,只是看到了前面的 truncate 和 drop 操作,把這兩個線程 kill 了,也沒啥用。。。。

當(dāng)然上面這些不是廢話昂,這就是類似方法論的東西,就像【中國機(jī)長】里面,遇到飛行事故時,首先按照手冊,檢查一遍,排查原因,解決問題。

繼續(xù)

緊接著,又用 navicat 執(zhí)行了修復(fù)表操作,結(jié)果返回了 Waiting for table metadata lock

當(dāng) MySQL 在進(jìn)行一些 alter table 等 DDL 操作時,如果該表上有未提交的事務(wù)則會出現(xiàn) Waiting for table metadata lock,而一旦出現(xiàn) metadata lock,該表上的后續(xù)操作都會被阻塞。

解決辦法:

1、從 information_schema.innodb_trx 表中查看當(dāng)前未提交的事務(wù)

select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx\G

字段意義:

trx_state: 事務(wù)狀態(tài),一般為 RUNNING

trx_started: 事務(wù)執(zhí)行的起始時間,若時間較長,則要分析該事務(wù)是否合理

trx_mysql_thread_id: MySQL 的線程 ID,用于 kill

trx_query: 事務(wù)中的 sql

一般只要 kill 掉這些線程,DDL 操作就不會 Waiting for table metadata lock。

2、調(diào)整鎖超時閾值

lock_wait_timeout 表示獲取 metadata lock 的超時(單位為秒),允許的值范圍為 1 到 31536000(1 年)。 默認(rèn)值為 31536000。

詳見 https://dev.mysql.com/doc/refman/5.6/en/se...

默認(rèn)值為一年。。。。

將其調(diào)整為 30 分鐘

set session lock_wait_timeout = 1800;

set global lock_wait_timeout = 1800;

好讓出現(xiàn)該問題時快速失?。╢ailfast)。

關(guān)于show full processlist在Mysql當(dāng)中的作用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI