`mysqlreport` 是一個 Perl 腳本,能將 `SHOW GLOBAL STATUS`、`SHOW VARIABLES` 輸出轉化為易讀的效能報告,指導參數調優。適合定時任務收集高峰/低峰期基準線。
# 1. 安裝 Perl 依賴
yum install perl-DBI perl-DBD-MySQL -y
# 或 Ubuntu
apt-get install libdbi-perl libdbd-mysql-perl -y
# 2. 下載 mysqlreport
wget https://hackmysql.com/scripts/mysqlreport
chmod +x mysqlreport
# 3. 測試執行
./mysqlreport --user root --password 'pass' --host 127.0.0.1 --port 3306
MySQL 5.6.25-log uptime 0 5:34:3 -- 運行時間 5小時34分
__ Key _________________________________________________________________
Buffer used 0 of 2.00G %Used: 0.00 -- Key Buffer 使用率
Current 373.45M %Usage: 18.24 -- 當前實際使用
Write hit 0.00% Read hit 0.00% -- 命中率(寫/讀)
__ Questions ___________________________________________________________
Total 757 0.0/s -- 總查詢數/每秒
Com_ 1.26k 0.1/s %Total: 166.31 -- Com_* 命令計數
-Unknown 805 0.0/s 106.34 -- 未分類命令
DMS 294 0.0/s 38.84 -- 資料操作(SELECT/INSERT/UPDATE/DELETE)
COM_QUIT 9 0.0/s 1.19 -- 連線斷開
Slow 5 s 13 0.0/s 1.72 -- 慢查詢數
%DMS: 4.42 -- 慢查詢佔 DMS 比例
__ SELECT and Sort _____________________________________________________
Scan 337 0.0/s %SELECT: 114.63 -- 全表掃描次數 (超過 100% 表示重複掃描)
Range 51 0.0/s 17.35 -- 範圍查詢
Full join 0 0/s 0.00 -- 無索引 Join
Sort scan 64 0.0/s -- 掃描排序
Sort range 1 0.0/s -- 範圍排序
__ Query Cache _________________________________________________________
Memory usage 16.81k of 1.00M %Used: 1.64 -- 查詢快取使用率
Block Fragmnt 100.00% -- 碎片率
Hits 0 0/s Inserts 1 0/s -- 命中/插入
__ Table Locks _________________________________________________________
Waited 0 0/s %Total: 0.00 -- 表鎖等待
Immediate 208 0.0/s -- 立即獲取
__ Tables ______________________________________________________________
Open 1 of 2000 %Cache: 0.05 -- 開啟表數/快取上限
Opened 240 0.0/s -- 歷史開啟總數
__ Connections _________________________________________________________
Max used 4 of 1000 %Max: 0.40 -- 最大並發連線/上限
Total 15 0.0/s -- 總連線數
__ Created Temp ________________________________________________________
Disk table 20 0.0/s -- 磁碟臨時表 (應盡量為 0)
Table 472 0.0/s -- 總臨時表
Size: 16.0M -- tmp_table_size/max_heap_table_size
__ Threads _____________________________________________________________
Running 1 of 2 -- 運行中/總執行緒
Cached 2 of 18 %Hit: 73.33 -- 執行緒快取命中率
Created 4 0.0/s -- 新建執行緒數
Slow 0 0/s -- 慢啟動執行緒
__ InnoDB Buffer Pool __________________________________________________
Usage 127.98M of 127.98M %Used: 100.00 -- Buffer Pool 使用率 100% (需擴容)
Read hit 97.36% -- 讀命中率 (目標 >99%)
Pages Free 0 %Total: 0.00 -- 空閒頁為 0
Data 7.87k 96.12% %Drty: 0.00 -- 髒頁比例
Reads 92.16M 4.6k/s From file 2.43M 121.3/s 2.64% -- 磁碟讀取比例
__ InnoDB Lock _________________________________________________________
Waits 0 0/s Current 0 -- 鎖等待
Time acquiring Total 0 ms Avg 0 ms Max 0 ms
| 指標 | 健康閾值 | 異常時調優方向 |
|---|---|---|
| Key Read hit rate | > 99% | 增大 key_buffer_size |
| InnoDB Buffer Pool Read hit | > 99% | 增大 innodb_buffer_pool_size |
| InnoDB Buffer Pool %Used | < 90% | 擴容或檢查大查詢沖刷 |
| Table Locks Waited % | < 1% | 優化長查詢、引擎遷移 InnoDB |
| Created_tmp_disk_tables | 接近 0 | 增大 tmp_table_size/max_heap_table_size、優化 GROUP BY |
| Thread Cache Hit | > 90% | 增大 thread_cache_size |
| Select Scan / Select | < 10% | 補索引、避免全表掃描 |
| Slow Queries | 0 | 開啟慢查詢日誌、EXPLAIN 優化 |
| InnoDB Log Waits | 0 | 增大 innodb_log_buffer_size、innodb_log_file_size |
| Max Used Connections % | < 80% | 增大 max_connections、檢查連線洩漏 |
#!/bin/bash
# /usr/local/bin/mysqlreport_cron.sh
# 每小時執行: 0 * * * * /usr/local/bin/mysqlreport_cron.sh
OUT_DIR="/var/log/mysqlreport"
mkdir -p $OUT_DIR
DATE=$(date +%F_%H-%M)
./mysqlreport --user root --password 'xxx' --host 127.0.0.1 --port 3306 \
> $OUT_DIR/report_$DATE.txt 2>&1
# 保留 30 天
find $OUT_DIR -name "report_*.txt" -mtime +30 -delete