目錄
引言
一、最終目標支持功能
二、監控方案設計
2.1 技術選型
2.2 設計思路
三、實現步驟
3.1 準備工作
3.11 創建 MySQL 監控賬號
3.12?配置 .my.cnf 文件
?3.2 編寫統一腳本
?3.3 配置 Zabbix Agent UserParameter
?3.4 Zabbix 前端配置建議
四、總結
引言
MySQL 數據庫作為眾多業務系統的核心組件,其性能與存儲狀況直接影響系統的穩定性和響應速度。對于運維工程師而言,實時監控 MySQL 的性能指標和存儲空間使用情況尤為關鍵。本文將分享如何使用 Zabbix 結合自定義腳本,監控 MySQL 的關鍵性能指標(如 QPS、TPS)及存儲空間使用(包括數據庫空間大小、日志文件大小等),幫助你搭建精準且高效的數據庫監控體系。
一、最終目標支持功能
支持如下參數調用:
參數 | 含義 |
---|---|
QPS | 每秒查詢數 |
TPS | 每秒事務數 |
dbsize | 所有數據庫空間使用(MB) |
dbsize[<庫名>] | 某個數據庫空間使用(MB) |
二、監控方案設計
2.1 技術選型
-
Zabbix Agent:用于在數據庫服務器采集指標數據。
-
自定義 Shell 腳本:通過 MySQL 命令查詢系統狀態和文件大小,輸出給 Zabbix。
-
MySQL 只讀監控賬號:用于查詢性能指標和表空間信息。
2.2 設計思路
-
統一腳本根據參數動態返回不同指標值,避免分散管理。
-
采用
.my.cnf
文件存儲數據庫連接信息,保證安全。 -
Zabbix Agent 通過 UserParameter 調用腳本,實現靈活監控。
三、實現步驟
3.1 準備工作
3.11 創建 MySQL 監控賬號
-- 創建用戶(如已存在可跳過)
CREATE USER 'zbx_monitor'@'localhost' IDENTIFIED BY '你的安全密碼';-- 授權所需權限:
-- 1. SHOW DATABASES — 用于數據庫自動發現(LLD)
-- 2. PROCESS — 用于查詢當前線程等狀態
-- 3. REPLICATION CLIENT — 允許讀取主從狀態
-- 4. SELECT ON *.* — 允許查看庫大小、InnoDB 統計、慢查詢數等
GRANT SHOW DATABASES, PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'zbx_monitor'@'localhost';-- 強烈建議刷新權限以立即生效
FLUSH PRIVILEGES;
3.12?配置 .my.cnf
文件
在 /var/lib/zabbix/.my.cnf
文件中寫入:?
[client]
user=zbx_monitor
password=your_password
并設置權限:
chmod 600 /var/lib/zabbix/.my.cnf
?3.2 編寫統一腳本
# vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/scripts/mysql_monitor.sh
#!/bin/bashMETRIC="$1"
DB_NAME="$2"MY_CNF="/var/lib/zabbix/.my.cnf"
MYSQL_HOST="192.168.1.129"
MYSQL_PORT="3306"MYSQL_CMD="mysql --defaults-extra-file=$MY_CNF -h$MYSQL_HOST -P$MYSQL_PORT -Nse"
MYSQLADMIN_CMD="mysqladmin --defaults-extra-file=$MY_CNF -h$MYSQL_HOST"get_qps() {Uptime=$($MYSQLADMIN_CMD status | awk '{print $2}')Questions=$($MYSQLADMIN_CMD status | awk '{print $6}')[[ "$Uptime" -gt 0 ]] && awk "BEGIN {printf \"%.2f\", $Questions / $Uptime}" || echo 0
}get_tps() {Uptime=$($MYSQLADMIN_CMD status | awk '{print $2}')rollback=$($MYSQLADMIN_CMD extended-status | awk '/Com_rollback/{print $4}')commit=$($MYSQLADMIN_CMD extended-status | awk '/Com_commit/{print $4}')total=$((rollback + commit))[[ "$Uptime" -gt 0 ]] && awk "BEGIN {printf \"%.2f\", $total / $Uptime}" || echo 0
}get_db_size() {if [[ -z "$DB_NAME" ]]; thenRESULT=$($MYSQL_CMD "SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) FROM information_schema.tables;")elseRESULT=$($MYSQL_CMD "SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) FROM information_schema.tables WHERE table_schema='$DB_NAME';")fiecho "${RESULT:-0}"
}case "$METRIC" inqps) get_qps ;;tps) get_tps ;;dbsize) get_db_size ;;*) echo "Unsupported metric"; exit 1 ;;
esac
設置執行權限:
chmod +x /usr/local/zabbix/etc/zabbix_agentd.conf.d/scripts/mysql_monitor.sh
3.3 配置 Zabbix Agent UserParameter
編輯
# vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/userparameter_mysql.conf
UserParameter=mysql.qps,/usr/local/zabbix/etc/zabbix_agentd.conf.d/scripts/mysql_monitor.sh qps
UserParameter=mysql.tps,/usr/local/zabbix/etc/zabbix_agentd.conf.d/scripts/mysql_monitor.sh tps
UserParameter=mysql.dbsize,/usr/local/zabbix/etc/zabbix_agentd.conf.d/scripts/mysql_monitor.sh dbsize
UserParameter=mysql.dbsize[*],/usr/local/zabbix/etc/zabbix_agentd.conf.d/scripts/mysql_monitor.sh dbsize "$1"
重啟 Agent:
systemctl restart zabbix-agent
?3.4 Zabbix 前端配置建議
-
創建監控項:
-
mysql.qps
(單位:ops) -
mysql.tps
(單位:ops) -
mysql.dbsize
(單位:MB) -
mysql.dbsize[your_db]
(單位:MB,按需添加)
-
-
設定更新間隔如
1m
或5m
-
設置合適的觸發器閾值,例如:
{host:mysql.qps.last()} > 1000 {host:mysql.dbsize.last()} > 10240
四、總結
本文提供了一個簡潔且實用的 Zabbix + MySQL 監控方案,重點解決 MySQL 存儲空間及關鍵性能指標采集問題。通過集中管理的腳本和靈活的 Zabbix 配置,能夠幫助運維快速構建穩定、全面的數據庫監控體系,提升問題預警能力和故障響應速度。
歡迎關注與交流,如需腳本模板或更多指標監控實現,歡迎留言。?