showfullprocesslist在Mysql當(dāng)中的作用

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

創(chuàng)新互聯(lián)公司專注于新鄉(xiāng)企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城網(wǎng)站建設(shè)。新鄉(xiāng)網(wǎng)站建設(shè)公司,為新鄉(xiāng)等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

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

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

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

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

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

1、這種是直接在命令行查詢,末尾帶 \G 是表示將查詢結(jié)果進(jìn)行按列打印,可以使每個(gè)字段打印到單獨(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)識(shí),可以通過 kill 來終止此線程的鏈接。

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

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

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

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

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

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

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

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

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

kill 449000

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

-- 查詢執(zhí)行時(shí)間超過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 操作,把這兩個(gè)線程 kill 了,也沒啥用。。。。

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

繼續(xù)

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

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

解決辦法:

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í)行的起始時(shí)間,若時(shí)間較長,則要分析該事務(wù)是否合理

trx_mysql_thread_id: MySQL 的線程 ID,用于 kill

trx_query: 事務(wù)中的 sql

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

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

lock_wait_timeout 表示獲取 metadata lock 的超時(shí)(單位為秒),允許的值范圍為 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)該問題時(shí)快速失?。╢ailfast)。

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

網(wǎng)站標(biāo)題:showfullprocesslist在Mysql當(dāng)中的作用
URL網(wǎng)址:http://bm7419.com/article40/igidho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作外貿(mào)網(wǎng)站建設(shè)、Google品牌網(wǎng)站建設(shè)、App開發(fā)、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站