學會用 Mysql show processlist 排查問題

2021-03-02 碼農編程進階筆記

mysql show full processlist 查看當前線程處理情況

事發現場

每次執行看到的結果應該都有變化,因為是實時的,所以我定義為:「事發現場」,每次執行就相當於現場的快照

一般用到 show processlist 或 show full processlist 都是為了查看當前 mysql 是否有壓力,都在跑什麼語句,當前語句耗時多久了,有沒有什麼慢 SQL 正在執行之類的

可以看到總共有多少連結數,哪些線程有問題(time是執行秒數,時間長的就應該多注意了),然後可以把有問題的線程 kill 掉,這樣可以臨時解決一些突發性的問題

有時候一個快照可能看不出什麼問題,那麼可以頻發的刷新試試

問題排查

show full processlist 可以看到所有連結的情況,但是大多連結的 state 其實是 Sleep 的,這種的其實是空閒狀態,沒有太多查看價值

我們要觀察的是有問題的,所以可以進行過濾:

select id, db, user, host, command, time, state, infofrom information_schema.processlistwhere command != 'Sleep'order by time desc 

這樣就過濾出來哪些是正在幹活的,然後按照消耗時間倒敘展示,排在最前面的,極大可能就是有問題的連結了,然後查看 info 一列,就能看到具體執行的什麼 SQL 語句了,針對分析 

展示列解釋:

id - 線程ID,可以用:kill id; 殺死一個線程,很有用

db - 資料庫

user - 用戶

host - 連庫的主機IP

command - 當前執行的命令,比如最常見的:Sleep,Query,Connect 等

time - 消耗時間,單位秒,很有用

state - 執行狀態,比如:Sending data,Sorting for group,Creating tmp table,Locked等等,很有用,其他狀態可以看看本文最後的參考文章

info - 執行的SQL語句,很有用

kill 使用

上面提到的 線程ID 是可以通過 kill 殺死的;所以上面基本上可以把有問題的執行語句找出來,然後就可以 kill 掉了,那麼一個一個來 kill 麼?

select concat('kill ', id, ';')from information_schema.processlistwhere command != 'Sleep'and time > 2*60order by time desc 

在下一步我就不用說了吧,把拼接 kill 的執行結果跑一遍就搞定了

這個有時候非常好用,誰用誰知道

常見問題

一些問題會導致連鎖反應,而且不太好定位,有時候以為是慢查詢,很可能是大多時間是在等在CPU、內存資源的釋放,所以有時候同一個查詢消耗的時間有時候差異很大

總結了一些常見問題:

CPU報警:很可能是 SQL 裡面有較多的計算導致的

連接數超高:很可能是有慢查詢,然後導致很多的查詢在排隊,排查問題的時候可以看到」事發現場「類似的 SQL 語句一大片,那麼有可能是沒有索引或者索引不好使,可以用:explain 分析一下 SQL 語句

相關焦點

  • mysql show processlist Time為負數的思考
    想閱讀八怪源碼文章歡迎訂閱本文建議橫屏觀看,效果更佳一、問題來源這是一個朋友問我的一個問題,問題如下,在MTS中Worker線程看到Time為負數是怎麼回事,如下:二、關於show processlist中的Time實際上show processlist中的信息基本都來自函數 mysqld_list_processes,也就是說每次執行show
  • 5 分鐘小技巧系列 | 定製化 MySQL Show Processlist 輸出結果
    本文就來介紹一種簡單又實用的方法來解決此問題。在 MySQL 的命令提示符下,可以使用 \P 的命令設定要過濾的內容,步驟如下:$ mysql -u root -p$ mysql> \P grep -v Sleep# 此時輸出結果就沒有 Sleep 相關的信息了$ mysql> Show Full Processlist; 在使用
  • 技術分享 | mysql show processlist Time 為負數的思考
    文章末尾有他著作的《深入理解 MySQL 主從原理 32 講》,深入透徹理解 MySQL 主從,GTID 相關技術知識。
  • 幾個常見而嚴重的 MySQL 問題分析 | 運維進階
    很多時候發生資料庫報錯時,不一定就是資料庫的問題,不一定非得急著呼叫資料庫人員解決。我們要形成這樣一種意識,我們不只是寫應用的,我們是寫金融系統的,我們理應具備一定的問題排查解決能力。本文將抽取幾個常見而嚴重的MySQL問題進行分析,並給出深度解答。藉以大家幫助思考。
  • Mysql--show命令
    * 顯示所有的資料庫名稱mysql root@localhost:sakila> show
  • MySQL 常用show命令
    命令也是其中之一,在很多使用者中對show命令的使用還容易產生混淆,本文匯集了show命令的眾多用法。a. show tables或show tables from database_name; -- 顯示當前資料庫中所有表的名稱。b. show databases; -- 顯示mysql中所有資料庫的名稱。
  • 詳解MySQL資料庫中Show命令的用法
    MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中對show命令的使用還容易產生混淆,本文主要介紹了show命令的主要用法。 a. show tables或show tables from database_name; -- 顯示當前資料庫中所有表的名稱。
  • 終於學會了 MySQL 主從配置和讀寫分離
    使用 show processlist語句可查看線程狀態,可以看到第一個線程的 State 是 「Master has sent all binlog to slave; waiting for more updates」,說明同步線程一直在運行中
  • MySQL如何查詢當前正在運行的SQL語句
    queries這一項,如果值長時間>0,說明有查詢執行時間過長 以下為引用的內容: mysqlQuestions: 706 Slow queries: 0 Opens: 177 Flush tables: 1 Open tables: 52 Queries per second avg: 0.002 -------------- 這時再通過show
  • MySQL優化:定位慢查詢的兩種方法以及使用explain分析SQL
    一般定位慢查詢會有兩種解決方案:根據慢查詢日誌定位使用show processlist定位,查詢正在執行的慢查詢NO.1 慢查詢日誌定位解析確定慢查詢日誌路徑:mysql> show global variables like "datadir";確定慢查詢日誌文件名:mysql> show
  • 生產MySQL資料庫執行一次analyze採集信息,應用炸了
    > select * from t_test_1 where id=5;session4:查詢所有會話信息mysql> select * from processlist order by time desc;+----+-+-++----+-++-+| ID | USER | HOST
  • mysql 常用命令一
    【資料庫連接】 mysql -h ip -u name -ppassword -P port -D database_name>【資料庫SHOW命令】 顯示mysql中所有資料庫的名稱 show databases;#顯示mysql中的相關 show tables [ from db_name
  • 發現一個關於MySQL的metadata lock的BUG
    int ,    -> name varchar(2),    -> addr varchar(200));會話A:mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> insert into xcy_test_utf8
  • MySQL 默認最大連接數是多少?
    上午剛工作10分左右,同事說在使用jira時出現問題,具體截圖如下:通過上圖的報錯信息:定位為mysql資料庫連接數的問題解決方法:後來想一下可能是版本不同的問題,默認連接數也不同。為了確認mysql5.5.3默認的最大連接數為151,去mysql官網查看了一下:mysql默認的最大連接數為151,上限為100000。另外,MySQL 系列面試題和答案我都整理好了,關注公眾號Java技術棧回復 "面試" 獲取。
  • scrapy爬取list頁面下級詳細頁的翻頁,及mysql相關
    問題描述: 想抓取某類列表頁中的新聞詳細頁,其中遇見有的新聞詳細頁有翻頁,就是一長篇文章用分頁來隔開,有的則沒有。
  • 常用的三種修改mysql最大連接數的方法
    默認最大連接數是100,一般流量稍微大一點的論壇或網站這個連接數是遠遠不夠的,增加默認MYSQL連接數的方法有兩個方法一:進入MYSQL安裝目錄 打開MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100   修改為 max_connections=1000 服務裡重起MYSQL即可方法二:MySQL的最大連接數默認是100客戶端登錄:mysql
  • MySQL優化:學會使用show profile和trace分析慢查詢
    :show profiles;得到profile id。小計:實用show profile 可以直接查看上一條SQL語句的執行開銷MySQL [test]> show profile;NOTE:show profile自身不會產生Profiling。
  • 一文詳解MySQL權限
    Insert權限代表是否允許在表裡插入數據,同時在執行analyze table,optimize table,repair table語句的時候也需要insert權限• Lock權限代表允許對擁有select權限的表進行鎖定,以防止其他連結對此表 的讀或寫MySQL權限詳解(3)• Process權限代表允許查看MySQL中的進程信息,比如執行showprocesslist