在日常運維中,快速掌握 MySQL 實例的運行狀態至關重要。雖然有諸如 Prometheus + Grafana、Percona Monitoring and Management (PMM) 等成熟的監控體系,但在臨時排查、無法部署重組件或需要極簡依賴的場景下,一個基於原生工具 mysqladmin 的 Shell 腳本往往能發揮「四兩撥千斤」的效果。本文分享一個輕量級的 MySQL 性能查詢腳本,能夠每秒輸出 QPS、增刪改查計數、InnoDB 行操作及緩衝池讀取情況等關鍵指標。
腳本利用 mysqladmin extended-status 配合 -r (relative) 和 -i 1 (interval 1 second) 參數,獲取服務器狀態變量的增量值。通過 awk 解析輸出,提取所需計數器並按固定格式打印,實現類似 vmstat / iostat 風格的實時滾動輸出。
#!/bin/sh
mysqladmin -P3306 -uroot -p'password' -r -i 1 ext | \
awk -F"|" '
BEGIN { count=0; }
{
if ($2 ~ /Variable_name/ && ((++count)%20 == 1)) {
print "----------|---------|--- MySQL Command Status --|----- Innodb row operation ----|-- Buffer Pool Read --";
print "---Time---|---QPS---|select insert update delete| read inserted updated deleted| logical physical";
}
else if ($2 ~ /Queries/) { queries=$3; }
else if ($2 ~ /Com_select/) { com_select=$3; }
else if ($2 ~ /Com_insert/) { com_insert=$3; }
else if ($2 ~ /Com_update/) { com_update=$3; }
else if ($2 ~ /Com_delete/) { com_delete=$3; }
else if ($2 ~ /Innodb_rows_read/) { innodb_rows_read=$3; }
else if ($2 ~ /Innodb_rows_deleted/) { innodb_rows_deleted=$3; }
else if ($2 ~ /Innodb_rows_inserted/) { innodb_rows_inserted=$3; }
else if ($2 ~ /Innodb_rows_updated/) { innodb_rows_updated=$3; }
else if ($2 ~ /Innodb_buffer_pool_read_requests/) { innodb_lor=$3; }
else if ($2 ~ /Innodb_buffer_pool_reads/) { innodb_phr=$3; }
else if ($2 ~ /Uptime/ && count >= 2) {
printf(" %s |%9d", strftime("%H:%M:%S"), queries);
printf("|%6d %6d %6d %6d", com_select, com_insert, com_update, com_delete);
printf("|%6d %8d %7d %7d", innodb_rows_read, innodb_rows_inserted, innodb_rows_updated, innodb_rows_deleted);
printf("|%10d %11d\n", innodb_lor, innodb_phr);
}
}'
執行後將輸出如下格式的實時數據(截圖來源原文):

| 列組 | 指標 | 含義 |
|---|---|---|
| MySQL Command Status | QPS | 每秒查詢總數,包含所有類型的 SQL 語句 |
| Com_select / insert / update / delete | 每秒 SELECT/INSERT/UPDATE/DELETE 執行次數 | |
| InnoDB Row Operation | Rows read / inserted / updated / deleted | 存儲引擎層面的行讀寫量,比 Com_* 更精確反映底層負載 |
| Buffer Pool Read | Logical reads | 邏輯讀請求數,即從緩衝池滿足的讀取 |
| Physical reads | 物理讀次數,需從磁盤加載頁面,關係到 I/O 壓力 |
PROCESS、REPLICATION CLIENT 權限。>> mysql_perf.log),配合 logrotate 實現歷史歸檔。awk 中加入閾值判斷,超標時調用 Webhook 或發送郵件。這個腳本零依賴、啟動即用,適合應急排查、臨時性能基線建立或作為輕量級監控組件的補充。掌握 mysqladmin extended-status 的輸出結構,你還可以輕鬆擴展出更多自定義指標(如臨時表創建數、鎖等待時間、線程並發數等),打造屬於自己的「瑞士軍刀」監控工具箱。