1. 程式人生 > >mysql show processlist命令 詳解

mysql show processlist命令 詳解

出處:http://renxiangzyq.iteye.com/blog/835397

processlist 命令的輸出結果顯示了有哪些執行緒在執行,可以幫助識別出有問題的查詢語句,兩種方式使用這個命令。

1.        進入 mysql/bin 目錄下輸入 mysqladmin processlist;

2.        啟動 mysql ,輸入 show processlist;

如果有 SUPER 許可權,則可以看到全部的執行緒,否則,只能看到自己發起的執行緒(這是指,當前對應的 MySQL 帳戶執行的執行緒)。

得到資料形式如下(只截取了三 條):

mysql> show processlist;

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

| Id | User  | Host             | db    | Command | Time| State      | Info                                                                                            

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

|207|root  |192.168.0.20:51718 |mytest | Sleep     | 5     |          | NULL                                                                                                  

|208|root  |192.168.0.20:51719 |mytest | Sleep    | 5    |          | NULL        

|220|root  |192.168.0.20:51731 |mytest |Query    | 84   | Locked  |

select bookname,culture,value,type  from book where id=001

先簡單說一下各列的含義和用途,第一列, id , 不用說了吧,一個標識,你要 kill 一個語句的時候很有用。 user列, 顯示單前使用者,如果不是 root ,這個命令就只顯示你許可權範圍內的 sql 語 句。 host 列,顯示這個語句是從哪個 ip 的哪 個埠上發出的。呵呵,可以用來追蹤出問題語句的使用者。 db 列,顯示這個程序目前連線的是 哪個資料庫 。command 列,顯示當前連線的執行的命令,一般就是休眠( sleep ),查詢( query ),連線( connect )。 time 列,此這個狀態持續的時間,單位是秒。 state 列,顯示使用當前連線的 sql 語句的狀態,很重要的列,後續會有所有的狀態的描述,請注意, state 只是語句執行中的某一個狀態,一個 sql 語 句,已查詢為例,可能需要經過 copying to tmp table ,Sorting result , Sending data 等狀態才 可以完成, info 列,顯示這個 sql 語 句,因為長度有限,所以長的 sql 語句就顯示不全,但是一個判斷問題語句的重要依據。

這個命令中最關鍵的就是 state 列, mysql 列出的狀態主要有以下幾 種:

   Checking table
 正在檢查資料表(這是自動的)。 
  Closing tables
 正在將表中修改的資料重新整理到磁碟中,同時正在關閉已經用完的表。這是一個很快的操作,如果不是這 樣的話,就應該確認磁碟空間是否已經滿了或者磁碟是否正處於重負中。 
  Connect Out
 複製從伺服器正在連線主伺服器。 
  Copying to tmp table on disk
 由於臨時結果集大 於 tmp_table_size ,正在將臨時表從記憶體儲存轉為磁碟儲存以此節省記憶體。 
  Creating tmp table
 正在建立臨時表以存放部分查詢結果。 
  deleting from main table
 伺服器正在執行多表刪除中 的第一部分,剛刪除第一個表。 
  deleting from reference tables
 伺服器正在執行多表刪除中的第二部 分,正在刪除其他 表的記錄。 
  Flushing tables
 正在執行 FLUSH TABLES ,等待其他執行緒關閉資料表。 
  Killed
 傳送了一個 kill 請 求給某執行緒,那麼這個執行緒將會檢查 kill 標誌位,同時會放棄下一個 kill 請 求。 MySQL 會在每次的主迴圈中檢查 kill 標 志位,不過有些情況下該執行緒可能會過一小段才能死掉。如果該執行緒程被其他執行緒鎖住了,那麼 kill請 求會在鎖釋放時馬上生效。 
  Locked
 被其他查詢鎖住了。 
  Sending data
 正在處理 SELECT 查詢的記錄,同時正在把結果傳送給客戶端。 
  Sorting for group
 正在為 GROUP BY 做排序。 
  Sorting for order
 正在為 ORDER BY 做排序。 
  Opening tables
 這個過程應該會很快,除非受到其他因素的干擾。例如,在執 ALTER TABLE 或 LOCK TABLE 語句行完以 前,資料表無法被其他執行緒開啟。 正嘗試開啟一個表。 
  Removing duplicates
 正在執行一個 SELECT DISTINCT 方式的查詢,但是 MySQL 無 法在前一個階段優化掉那些重複的記錄。因此, MySQL需要再次去掉重複的記錄,然後再 把結果傳送給客戶端。 
  Reopen table
 獲得了對一個表的鎖,但是必須在表結構修改之後才能獲得這個鎖。已經釋放鎖,關閉資料表,正嘗試 重新開啟資料表。 
  Repair by sorting
 修復指令正在排序以建立索引。 
  Repair with keycache
 修復指令正在利用索引快取一個 一個地建立新索引。它會比 Repair by sorting 慢些。 
  Searching rows for update
 正在講符合條件的記錄找 出來以備更新。它必須在 UPDATE 要修改相關的記錄之前就完成了。 
  Sleeping
 正在等待客戶端傳送新請求 .
  System lock
 正在等待取得一個外部的系統鎖。如果當前沒有執行多個 mysqld 伺服器同時請求同一個表,那麼可以通過增加 --skip-external-locking 引數來禁止外部系統鎖。 
  Upgrading lock
  INSERT DELAYED 正在 嘗試取得一個鎖表以插入新記錄。 
  Updating
 正在搜尋匹配的記錄,並且修改它們。 
  User Lock
 正在等待 GET_LOCK() 。 
  Waiting for tables
 該執行緒得到通知,資料表結構已經被修改了,需要重新開啟資料表以取得新的結構。然後,為了能的重 新開啟資料表,必須等到所有其他執行緒關閉這個表。以下幾種情況下會產生這個通知: FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或 OPTIMIZE TABLE 。 
  waiting for handler insert
  INSERT DELAYED 已經處理完了所有待處理的插入操作,正在等待新的請求。 
 大 部分狀態對應很快的操作,只要有一個執行緒保持同一個狀態好幾秒鐘,那麼可能是有問題發生了,需要檢查一下。 
 還 有其他的狀態沒在上面中列出來,不過它們大部分只是在檢視伺服器是否有存在錯誤是才用得著。

當MySQL繁忙的時候執行show processlist,會發現有很多行輸出,每行輸出對應一個MySQL連線。怎麼診斷髮起連線的程序是哪個?它當前正在幹嘛呢?

首先,需要通過TCP Socket而不是Unix Socket連線MySQL,這樣在show processlist的輸出中就會有來源埠號。如下,

mysql> show processlist;
+——–+——–+—————–+——+———+——+——-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+——–+——–+—————–+——+———+——+——-+——————+
| 277801 | mydbuser | localhost:35558 | mydb | Sleep | 1 | | NULL |
| 277804 | mydbuser | localhost:35561 | mydb | Sleep | 1 | | NULL |
| 277805 | mydbuser | localhost:35562 | mydb | Sleep | 0 | | NULL |
+——–+——–+—————–+——+———+——+——-+——————+

在Host列有來源IP和埠號,然後我們從連線機器檢視埠號是誰開啟的,

[[email protected] ~]# netstat -ntp | grep 35558
… 124.115.0.68:35558 ESTABLISHED 18783/httpd

可知程序18783發起的MySQL連線來源埠是35558,然後就可以用strace觀察這個程序了。如果是Apache的PHP指令碼,還可以 用proctitle模組( http://pecl.php.net/package/proctitle/ )設定指令碼的狀態資訊。

lsof也能根據埠號顯示程序號,細節請參考手冊。
http://www.mysqlperformanceblog.com/2007/02/08/debugging-sleeping-connections-with-mysql/

相關推薦

MySQL show processlist;命令

order by 檢查 否則 操作 locked 等待 inf 可能 增加 SHOW PROCESSLIST顯示哪些線程正在運行,如果您有SUPER權限,您可以看到所有線程,否則,您只能看到您自己的線程(也就是,與您正在使用的MySQL賬戶相關的線程),如果您不使用FULL

mysql show processlist命令

出處:http://renxiangzyq.iteye.com/blog/835397 processlist 命令的輸出結果顯示了有哪些執行緒在執行,可以幫助識別出有問題的查詢語句,兩種方式使用這個命令。 1.        進入 mysql/bin 目錄下輸入 mysq

show processlist 命令

 某社群資料庫阻塞,求救,經查,其伺服器存在多個數據庫應用和網站,其中一個不常用的小網站資料庫產生了一個恐怖的copy to tmp table操作,導致整個硬碟i/o和cpu壓力超載。Kill掉該操作一切恢復。

mysql show prifile基本

show profile預設情況下,引數處於關閉狀態,並儲存最近15次的執行結果檢視profile是否開啟   show variables like '%profi%';開啟profile記錄功能   set profiling=on; #永久生效需要在配置檔案my.cnf修改檢視執行了哪些命令   sho

MySQL檢視操作命令

MySQL檢視操作命令詳解   建立檢視 在MySQL中,建立檢視的完整語法如下: CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_l

mysql匯入匯出命令

mysql匯入匯出命令詳解 一、匯出資料庫用mysqldump命令(注意mysql的安裝路徑,即此命令的路徑):/usr/local/mysql/bin/  --->  mysql的data目錄1、匯出資料和表結構:mysqldump -u使用者名稱 -p密碼 資料庫名 >

Mysql中grant命令

1.遠端登入mysql mysql -h ip -u root -p 密碼 2.建立使用者 格式:grant 許可權 on 資料庫.* to 使用者名稱@登入主機 identified by “密碼”; 例1:增加一個test1使用者,密碼為123456,可以在任何主機上登入,並對所有資料庫有查詢,增加,修

MySQL show status引數

狀態名 作用域 詳細解釋 Aborted_clients Global 由於客戶端沒有正確關閉連線導致客戶端終止而中斷的連線數 Aborted_connects Global 試圖連線到MySQL伺服器而失敗的連線數 Binlog_ca

MYSQL-EXPLAIN 命令 (轉載)

test cacheable sel exp 打開慢 一起 select語句 方式 命令詳解 在工作中,我們用於捕捉性能問題最常用的就是打開慢查詢,定位執行效率差的SQL,那麽當我們定位到一個SQL以後還不算完事,我們還需要知道該SQL的執行計劃,比如是全表掃描,還是索引掃

mysql 學習與提高5:explain命令

目錄 Explain 簡介 Explain 使用 Explain 欄位 1. id欄位 2.select_type 3.table 4.type 5.possible_keys 6.key 7.key_len 8.ref 9.rows 10.ext

MYSQL資料庫基本操作和命令

在學習MySQL資料庫之前我們要知道MySQL資料庫的操作語言的分類; DDL(資料定義語言) 表的定義、使用者的定義… create drop alter DML(資料操控語言) 對資料的增加、修改、刪除、查詢 insert update delete select

mysqlshow slave status

===想確認sql_thread執行緒是否應用完了io_thread接收到的了relay log,看 Master_Log_File=Relay_Master_Log_File , Read_Master_Log_Pos=Exec_Master_Log_Pos Master_Log_File: mys

MySQL常用命令

使用MySQL資料庫 登入到MySQL 當MySQL服務已經執行時,我們可以通過MySQL自帶的客戶端工具登入到MySQL資料庫中,首先開啟終端,輸入以下格式的命令: mysql -h 主機名 -u 使用者名稱 -p -h:該引數用於指定

Ubuntu下Mysql常用命令

Mysql安裝目錄 資料庫目錄 /var/lib/mysql/ 配置檔案 /usr/share/mysql(mysql.server命令及配置檔案) 相關命令 /usr/bin(mysqladmin mysqldump等命令) 啟動指令碼 /et

mysql命令

首先建立一個簡單的user表 CREATE TABLE `user` ( `id`  int NOT NULL AUTO_INCREMENT , `name`  varchar(255) NULL , `sex`  varchar(255) NULL , `age`  in

MySQL EXPLAIN 命令

 在工作中,我們用於捕捉效能問題最常用的就是開啟慢查詢,定位執行效率差的SQL,那麼當我們定位到一個SQL以後還不算完事,我們還需要知道該SQL的執行計劃,比如是全表掃描,還是索引掃描,這些都需要通過EXPLAIN去完成。EXPLAIN命令是檢視優化器如何決定執行查詢的主

MySQL的常用操作命令

系統管理 啟動MySQL服務 通過windows服務管理器啟動MySQL服務 開始-->執行-->輸入services.msc命令-->啟動MySQL服務 通過DOS命令啟動MySQL服務 net start my

tar命令

pan 詳解 time border 設備 lin bsp force names 解壓到指定目錄 tar -zxvf flash_player_npapi_linux.x86_64.tar.gz -C mmtar -zxvf flash_player_npapi_linu

Linux下安裝軟件命令

代碼包 相關信息 make bin 一個 軟件包 輸入 -i bin文件 Linux下軟件安裝方法總結:一、rpm包安裝方式步驟:1、找到相應的軟件包,比如soft.version.rpm,下載到本機某個目錄;2、打開一個終端,su -成root用戶;3、cd soft.v

Docker常用命令

nbsp 詳解 .cn 本地 test 並且 www 更多 top docker ps 查看當前正在運行的容器 docker ps -a 查看所有容器的狀態 docker start/stop id/name 啟動/停止某個容器 docker attach id 進