整理自實戰維護經驗,涵蓋服務存活、連線狀態、QPS/TPS、緩衝區命中率、鎖等待、複寫延遲、臨時表、Binlog Cache 等核心指標。所有命令經生產環境驗證,可直接納入 Zabbix/Prometheus/Grafana/自建巡檢系統。
# 服務存活檢查 (回傳 "mysqld is alive")
mysqladmin -u monitor -p'pwd' -h localhost ping
# 核心狀態快照 (Uptime, Threads, Questions, Opens, Flush tables, Open tables, Queries)
mysqladmin -u monitor -p'pwd' -h localhost status
# 當前連線程序列表 (併發分析首選)
mysqladmin -u monitor -p'pwd' -h localhost processlist
# 按客戶端 IP 統計連線數
mysql -u monitor -p'pwd' -BNe "SELECT host, COUNT(*) FROM information_schema.processlist GROUP BY host;"
# 顯示 Uptime (小時)
mysql -e "SHOW GLOBAL STATUS LIKE 'Uptime'" | awk '/Uptime/ { printf \"%.2f Hours\\n\", $2/3600 }'
# 各資料庫總大小 (MB, 含資料+索引)
mysql -u monitor -p'pwd' -e "
SELECT table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size_MB'
FROM information_schema.tables
GROUP BY table_schema;"
# 指定表欄位資訊 (輸出欄位名逗號分隔,適合動態建構 SELECT)
mysql -u user -ppwd -e "SHOW COLUMNS FROM \`table\`" db | awk '{print $1}' | tr "\\n" "," | sed 's/,$//'
# 執行 SQL 腳本檔
mysql -u user -ppwd < script.sql
# mysqldump 導出 (CSV 格式,指定分隔符/包裹符)
mysqldump -u root -p'pwd' -T /tmp/mysqldump db_name table_name --fields-enclosed-by='\"' --fields-terminated-by=','
# mysqlimport 導入 (對應上述 CSV 格式)
mysqlimport -u root -p'pwd' --fields-enclosed-by='\"' --fields-terminated-by=',' db_name /tmp/table_name.txt
# LOAD DATA INFILE (效能最高,需 FILE 權限且檔案在 Server 端)
LOAD DATA INFILE '/tmp/table_name.txt' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '\"';
# mysqld_safe 守護進程
ps -ef | grep mysqld_safe | grep -v grep
# mysqld 主進程 (排除 safe)
ps -ef | grep mysqld | grep -v mysqld_safe | grep -v grep
| 指標 | 公式 | 健康基線 | 採集命令 |
|---|---|---|---|
| QPS (Queries Per Second) | Questions / Uptime | 視業務而定,突增需告警 | mysql -e "SHOW GLOBAL STATUS LIKE 'Questions'" 配合 Uptime 計算 |
| Key Buffer 讀命中率 | (1 - Key_reads / Key_read_requests) * 100% | > 99% | mysql -e "SHOW GLOBAL STATUS LIKE 'Key_read%'" |
| Key Buffer 寫命中率 | (1 - Key_writes / Key_write_requests) * 100% | > 99% | mysql -e "SHOW GLOBAL STATUS LIKE 'Key_write%'" |
| InnoDB Buffer Pool 讀命中率 | (1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100% | > 99.9% | mysql -e "SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%'" |
| Query Cache 命中率 | Qcache_hits / (Qcache_hits + Qcache_inserts) * 100% | > 80% (若啟用 QC) | mysql -e "SHOW GLOBAL STATUS LIKE 'Qcache%'" |
| Table Open Cache 狀態 | Open_tables / Opened_tables | Open_tables 接近 table_open_cache 設定值需擴容 | mysql -e "SHOW GLOBAL STATUS LIKE 'Open%'" |
| Thread Cache 命中率 | (1 - Threads_created / Connections) * 100% | > 90% | mysql -e "SHOW GLOBAL STATUS LIKE 'Thread%'" |
| 鎖狀態 | Table_locks_waited / Table_locks_immediate | 待鎖比例 < 1% | mysql -e "SHOW GLOBAL STATUS LIKE '%lock%'" |
| 複寫延遲 | Seconds_Behind_Master | = 0 (或 < 1s) | 在 Slave 執行:mysql -e "SHOW SLAVE STATUS\\G" |
| 臨時表磁盤化比例 | Created_tmp_disk_tables / Created_tmp_tables | < 10% | mysql -e "SHOW GLOBAL STATUS LIKE 'Created_tmp%'" |
| Binlog Cache 使用 | Binlog_cache_use / Binlog_cache_disk_use | 磁盤化比例低 | mysql -e "SHOW GLOBAL STATUS LIKE 'Binlog_cache%'" |
| InnoDB Log 等待 | Innodb_log_waits | = 0 | mysql -e "SHOW GLOBAL STATUS LIKE 'Innodb_log_waits'" |
# mysqlcheck 檢查/修復/分析/優化 所有資料庫所有表
mysqlcheck -u root -p'pwd' --all-databases --auto-repair --analyze --optimize
完整腳本集已開源:https://github.com/zhwj184/shell-work