Innotop 是基於 Perl 的 MySQL 實時監控工具,類似 top/htop 但專為 MySQL 設計,支援多實例、多視圖模式,能直觀展示查詢、事務、鎖、InnoDB 內部狀態等關鍵指標。本文詳述安裝依賴、配置慢查詢日誌、常用視圖操作與實戰技巧。
安裝部署
系統依賴
# CentOS/RHEL
yum install -y perl-CPAN perl-Time-HiRes perl-TermReadKey perl-DBI perl-DBD-MySQL
# Ubuntu/Debian
apt-get install -y libtime-hires-perl libterm-readkey-perl libdbi-perl libdbd-mysql-perl
# 或通用 CPAN 安裝
perl -MCPAN -e 'install Time::HiRes; install Term::ReadKey; install DBI; install DBD::mysql'
Innotop 安裝
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/innotop/innotop-1.9.0.tar.gz
tar -zxvf innotop-1.9.0.tar.gz
cd innotop-1.9.0
perl Makefile.PL
make && make install
# 驗證
innotop --version
慢查詢日誌配置(Innotop SLOW 視圖依賴)
# 1. 檢查當前狀態
mysql> SHOW VARIABLES LIKE '%slow%';
mysql> SHOW VARIABLES LIKE 'long_query_time';
# 2. 修改配置文件 /etc/my.cnf
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1 # 記錄超過 1 秒的查詢
log_queries_not_using_indexes = 1 # 記錄無索引查詢
# 3. 建立日誌目錄並重啟
mkdir -p /var/log/mysql
chown mysql:mysql /var/log/mysql
systemctl restart mysqld
# 4. 驗證
mysql> SHOW VARIABLES LIKE 'slow_query_log';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| slow_query_log | ON |
+------------------+-------+
Innotop 核心視圖與操作
啟動:innotop -u root -p -h 127.0.0.1 -P 3306
| 快捷鍵 | 視圖模式 | 核心用途 |
| Q | Query List | 實時查詢列表,支援 SLOW 標記高亮慢查詢 |
| T | InnoDB Transactions | 活躍事務、鎖等待、執行時間、隔離級別 |
| L | Locks | 表鎖/行鎖詳情、阻塞鏈分析 |
| I | InnoDB Status | SHOW ENGINE INNODB STATUS 圖形化:Buffer Pool、Log、Row Operations、Deadlock |
| R | Replication | 主從同步狀態:IO/SQL Thread、Seconds_Behind_Master、Relay Log |
| S | Variables & Status | 全域變數與狀態值實時刷新 |
| O | Open Tables | 表快取命中率、打開表數量 |
| U | User Statistics | 按用戶統計 Queries、Connections、Rows_read |
通用操作鍵
d:切換刷新間隔(預設 1 秒)
s:排序欄位切換
f:過濾條件輸入
k:Kill 選中查詢/線程
?:幫助文檔
q:退出
實戰場景演練
場景 1:定位慢查詢
- 進入 Q 模式
- 觀察
Time 欄位,紅色高亮表示超過 long_query_time
- 按
s 切換排序至 Time 降序
- 選中目標查詢按
Enter 查看完整 SQL
- 複製 SQL 到客戶端執行
EXPLAIN 分析
場景 2:死鎖排查
- 進入 I 模式 → 翻頁至
LATEST DEADLOCK 區塊
- 或進入 T 模式 查看
State=LOCK WAIT 的事務
- 按
Enter 查看事務執行的完整 SQL 歷史
- 分析加鎖順序、索引缺失、隔離級別衝突
場景 3:主從延遲監控
- 進入 R 模式
- 關注
Seconds_Behind_Master、SQL_Delay、Relay_Log_Space
- 若延遲持續增長:檢查從庫長事務、大事務、單線程 SQL Thread 瓶頸
場景 4:Buffer Pool 命中率優化
# 在 I 模式中關注:
Buffer pool hit rate = 1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)
# 目標 > 99.9%,否則考慮擴大 innodb_buffer_pool_size
進階配置技巧
多實例監控
# 配置文件 ~/.innotop/innotop.conf
[connections]
prod1 = host=10.0.1.10 user=monitor pass=xxx port=3306
prod2 = host=10.0.1.11 user=monitor pass=xxx port=3306
dr = host=10.0.2.10 user=monitor pass=xxx port=3306
# 啟動時切換
innotop --connection prod1
# 運行中按 'C' 切換連接
自動化告警腳本
#!/bin/bash
# check_long_query.sh
THRESHOLD=10 # 秒
QUERY_COUNT=$(innotop --count --mode Q --filter "Time > $THRESHOLD" -u monitor -p xxx -h 10.0.1.10 2>/dev/null | tail -1)
if [ "$QUERY_COUNT" -gt 0 ]; then
echo "Alert: $QUERY_COUNT queries running > ${THRESHOLD}s" | mail -s "MySQL Slow Query Alert" dba@example.com
fi
常見問題排查
| 問題 | 原因 | 解決 |
| 啟動報 Can't locate Time/HiRes.pm | Perl 模組缺失 | cpanm Time::HiRes 或 yum/apt 安裝對應包 |
| 連接失敗 Access denied | 權限不足 | 授予 PROCESS、REPLICATION CLIENT、SELECT ON performance_schema.* |
| 顯示亂碼/介面錯亂 | 終端編碼/寬度 | export LANG=en_US.UTF-8; 調整終端寬度 > 120 列 |
| SLOW 視圖無數據 | 慢查詢日誌未開啟 | 配置 slow_query_log=1 並重啟 |
替代工具對比
| 工具 | 類型 | 優勢 | 適用場景 |
| Innotop | TUI 互動式 | 輕量、鍵盤操作、多視圖、無依賴 Web | 堡壘機/跳板機、SSH 環境、DBA 日常巡檢 |
| Prometheus + Grafana | 時序監控 | 歷史趨勢、告警、儀表板、多目標 | 生產環境全鏈路監控、容量規劃 |
| PMM (Percona Monitoring) | 整合平台 | QAN 查詢分析、Advisor 建議、一鍵部署 | 企業級標準化監控、團隊協作 |
| MySQL Workbench | GUI | 可視化 EXPLAIN、Schema 設計、管理 | 開發環境、偶爾排查 |