目录
引言
一、最终目标支持功能
二、监控方案设计
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 配置,能够帮助运维快速构建稳定、全面的数据库监控体系,提升问题预警能力和故障响应速度。
欢迎关注与交流,如需脚本模板或更多指标监控实现,欢迎留言。