目录
3.3 配置 Zabbix Agent UserParameter
引言
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/bash
METRIC="$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" ]]; then
RESULT=$($MYSQL_CMD "SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) FROM information_schema.tables;")
else
RESULT=$($MYSQL_CMD "SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) FROM information_schema.tables WHERE table_schema='$DB_NAME';")
fi
echo "${RESULT:-0}"
}
case "$METRIC" in
qps) 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 配置,能够帮助运维快速构建稳定、全面的数据库监控体系,提升问题预警能力和故障响应速度。
欢迎关注与交流,如需脚本模板或更多指标监控实现,欢迎留言。