文章目錄
- 安裝指南
- 日志文件內容
- 日志分析參考
- 1.簡單檢索
- 2.統計不同狀態的語句的數量
- 3.按照時間統計
- 注意事項
- 倉庫
這是一個純腳本工具,用于從MySQL的information_schema.processlist
視圖中定期收集數據并保存到本地日志文件。支持MYSQL5.7-9.4版本。
template copy from PostgreSQL version : https://github.com/yansheng836/pg_collect_pgsa .
相關背景:
- 某個慢SQL打滿內存,導致系統kill掉mysql的進程,進而導致mysql進程重啟,沒有現場排查不了具體原因。(即使開啟了慢SQL日志,沒有執行完也不會記錄到數據庫日志中)
- 數據庫連接數被打滿,MYSQL相關監控數據丟失(因為也連不上數據庫了),沒有現場,不知道異常請求來源。
特性:
- 定期收集MySQL活動會話信息
- 支持通過定時任務配置收集頻率
- 提供日志文件自動分割功能
- 包含豐富的日志分析示例
安裝指南
拉取代碼,修改參數,設置定時任務。
# 克隆代碼
git clone git@github.com:yansheng836/mysql_collect_processlist.git
cd mysql_collect_processlist# 修改必要參數(均以 MYSQL_ 開頭,例如:MYSQL_PATH、MYSQL_HOST 等)
vi mysql_collect_processlist.sh# 查路徑
pwd# crontab -e
# 每分鐘執行
* * * * * sh pwd路徑/mysql_collect_processlist.sh# 如果需要更頻繁,比如每5秒執行(可自行調整秒數)
* * * * * sh pwd路徑/mysql_collect_processlist_gap_second.sh 5
日志文件內容
測試版本:mysql Ver 8.0.43 for Linux on x86_64 (MySQL Community Server - GPL)
CI版本:MYSQL5.7-9.4
輸出字段為:now(),ID,USER,HOST,DB,COMMAND,TIME,STATE,INFO
2025-09-09 14:44:02|42|root|localhost|mysql|Query|0|executing|SELECT now(),ID,USER,HOST,DB,COMMAND,TIME,STATE,INFO from information_schema.processlist
2025-09-09 14:44:02|5|event_scheduler|localhost|NULL|Daemon|8000|Waiting on empty queue|NULL
日志分析參考
1.簡單檢索
# cat/more/less/grep
grep 'executing' processlist.log# 查找具體時間的相關日志
grep '2025-09-04 12:59' processlist.log# 在歸檔日志中,查找具體時間的相關日志
zless logs/processlist-20250904-12.log.gz | grep '2025-09-04 12:59'
2.統計不同狀態的語句的數量
# 第8列是狀態:state
awk -F '|' '{print $8}' processlist.log | sort | uniq -c1 executing1 Waiting on empty queue
3.按照時間統計
# 按天統計
awk -F '|' '{print $1}' processlist.log | cut -d ' ' -f1 | sort | uniq -c2 2025-09-09
# 按小時統計
awk -F '[| ]' '{print $1 " " $2}' processlist.log | cut -d: -f1 | sort | uniq -c2 2025-09-09 14
# 按分鐘統計
awk -F '[| ]' '{print $1 " " $2}' processlist.log | cut -d: -f1-2 | sort | uniq -c2 2025-09-09 14:44
注意事項
-
在業務繁忙的數據庫上使用時,需要注意日志文件可能會快速增長,建議在特殊情況下短暫使用,并密切關注磁盤空間。
-
info
字段的長度受MySQL常量PROCESS_LIST_INFO_WIDTH
限制,默認為65535(寫死在源碼中),超出部分會被截斷。(足以滿足絕大多數場景。) -
賬號權限問題,可不使用mysql。推薦最小權限:[創建空庫,]創建普通用戶,授予
PROCESS
權限即可。-- CREATE DATABASE processlist_db; GRANT PROCESS ON *.* TO 'processlist_user'@'hostname';
倉庫
詳見::
GitHub:https://github.com/yansheng836/mysql_collect_processlist/issues
Gitee:https://gitee.com/yansheng0083/mysql_collect_processlist/issues