2012-03-19 93 views
2

我們的mysql進程有時會積壓,進程開始排隊。我想通過在緩慢的時間內記錄進程列表來調試何時以及爲何發生這種情況。如果有超過n個查詢,我該如何記錄「show processlist」?

我想通過cron作業運行show full processlist;,並且如果返回的行數多於50,則將輸出保存到文本文件。

您能否指點我正確的方向?

例如:

echo "show full processlist;" | mysql -uroot > processlist-`date +%F-%H-%M`.log 

我想運行,只有當結果包含文本50 rows in set(或大於50行)。

+0

你能通過'cron'成功運行'show full processlist'嗎? – sarnold 2012-03-19 22:42:57

+0

使用cron作業運行顯示,輸出返回到文件。檢查退貨,如果超過50,請保留,如果不是,請刪除文件。 – PasteBT 2012-03-19 22:48:08

回答

3

首先,確保MySQL的慢查詢日誌不是你所需要的。此外,MySQL的-e參數允許您在命令行上指定查詢。

扭轉的邏輯,這樣可以節省進程列表,並刪除它時,進程列表不夠長:

date=$(date +...) # set the desired date format here 
[ $(mysql -uroot -e "show full processlist" | tee plist-$date.log | wc -l) -lt 51 ] && rm plist-$date.log 
+0

一個班輪的加分!做得好。謝謝。 – Ryan 2012-03-19 23:38:29

+1

* * * * * [$(mysql -uroot -e「show full processlist」| tee plist- \'date +%F-%H-%M \'.log | wc -l)-lt 51] && rm plist- \'日期+%F-%H-%M \'.log – Ryan 2012-03-19 23:46:58

+2

我肯定會按照Aaron Brown的建議使用pt-stalk。不要重新發明輪子;實際上有很多問題是pt-stalk防範的。 – 2012-03-21 12:50:33

11

pt-stalk是專爲這一確切目的。它每秒都會對進程列表進行採樣(或者您指定的任何時間),然後當達到閾值(Threads_running是默認值並且是您想要的情況)時,收集大量數據,包括磁盤活動,tcpdumps,多個進程列表的樣本,服務器狀態變量,互斥/ innodb狀態等等。

以下是如何開始的:

pt-stalk --daemonize --dest /var/lib/pt-stalk --collect-tcpdump --threshold 50 --cycles 1 --disk-pct-free 20 --retention-time 3 -- --defaults-file=/etc/percona-toolkit/pt-stalk_my.cnf 

上面的命令將採樣Threads_running(--threshold;這設置爲你的ñ值),每一秒(的--interval默認)和火災數據收集,如果對於1個連續樣本,Threads_running大於50(--cycles)。如果少於20%的磁盤空閒(--disk-pct-free),則3天(--retention-time)的樣本將被保留並收集不會觸發。在每次收集時,將執行一個pcap格式的tcpdump(--collect-tcpdump),可以使用傳統的tcpdump工具或許多其他Percona工具包工具(包括pt-query-digestpt-tcp-model)分析tcpdump。樣品之間會有5分鐘的休息時間(默認爲--sleep),以防止自行拒絕。這個過程將被守護進程(--daemonize)。 --之後的參數將被傳遞給所有的mysql/mysqladmin命令,因此這是一個設置--defaults-file這樣的地方的好地方,您可以在其中存儲您的登錄憑據以防窺探。

相關問題