獲取MySQL歷史session

        MySQL的show processlist命令可以顯示當時的會話情況,但很多時候都需要查看出問題當時的狀態,可惜MySQL沒有提供類似history session這樣的功能。於是爲了方便問題排查,自己寫了一個非常簡單的抓取MySQL現場session的腳本,生產數據庫已經用了很長時間,感覺對trouble shooting還是挺有用的。腳本文件get_processlist.sh內容如下:

#!/bin/bash
source /home/mysql/.bashrc
dt=`date '+%y%m%d_%h%m%s'`

mysql -uroot -p123456 -p3306 -h127.0.0.1 -e "
select t1.* 
  from information_schema.processlist t1,
       (select count(1) c from information_schema.processlist where info is not null) t2 
 where t2.c>=50;" > /home/mysql/processlist.txt 

if test -s /home/mysql/processlist.txt; then
    mv /home/mysql/processlist.txt /home/mysql/processlist_18251/processlist_${dt}.txt
    mysql -uroot -p123456 -p18251 -h127.0.0.1 -e "
    select * from information_schema.innodb_trx; 
    select * from information_schema.innodb_lock_waits;
    select * from information_schema.innodb_locks;" > /home/mysql/processlist/innodb_locks_${dt}.txt

else
    rm /home/mysql/processlist.txt
fi

find /home/mysql/processlist/* -type f -mtime +10 -exec rm {} \;

        說明:

  1. 只抓取當時正在執行的SQL數量大於等於50的會話情況,輸出文件名帶有抓取時間。
  2. 同時取得事務和鎖的相關信息。
  3. 爲防止文件數量過多,只保留最近10天的歷史會話文件。

        將腳本放到crontab中,每分鐘執行一次:

* * * * * /home/mysql/dbbat/get_processlist.sh

        嚴格說獲得的是1分鐘之內的準現場,這種設計一是實現簡單,二是對生產負載無影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章