当前位置: 首页 > article >正文

使用 Zabbix 监控 MySQL 存储空间和性能指标的完整实践指南

目录

引言

一、最终目标支持功能

二、监控方案设计

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,按需添加)

  • 设定更新间隔如 1m5m

  • 设置合适的触发器阈值,例如:

    {host:mysql.qps.last()} > 1000
    {host:mysql.dbsize.last()} > 10240
    

四、总结

本文提供了一个简洁且实用的 Zabbix + MySQL 监控方案,重点解决 MySQL 存储空间及关键性能指标采集问题。通过集中管理的脚本和灵活的 Zabbix 配置,能够帮助运维快速构建稳定、全面的数据库监控体系,提升问题预警能力和故障响应速度。

欢迎关注与交流,如需脚本模板或更多指标监控实现,欢迎留言。 

    http://www.lryc.cn/news/2394293.html

    相关文章:

  1. 【技能拾遗】——家庭宽带单线复用布线与配置(移动2025版)
  2. 异步日志监控:FastAPI与MongoDB的高效整合之道
  3. 在 Android 上备份短信:保护您的对话
  4. 标题:2025海外短剧爆发年:APP+H5双端系统开发,解锁全球流量与变现新大陆
  5. 解决RAGFlow(v0.19.0)有部分PDF无法解析成功的问题。
  6. c#基础08(数组)
  7. 嵌入式学习--江协stm32day3
  8. docker-记录一次容器日志<container_id>-json.log超大问题的处理
  9. 4.8.1 利用Spark SQL实现词频统计
  10. 头歌java课程实验(Java面向对象 - 包装类)
  11. 经济法-7-上市公司首次发行、配股增发条件
  12. PyTorch中nn.Module详解
  13. Mac 每日磁盘写入量异常高
  14. 《深入解析Go语言结构:简洁高效的工程化设计》
  15. [蓝桥杯]机器人塔
  16. 如何将vue2使用npm run build打包好的文件上传到服务器
  17. Ubuntu 22.04 系统下 Docker 安装与配置全指南
  18. 动态表单开发避坑:改变input的值不会触发change事件即时修复策略-WdatePicker ——仙盟创梦IDE
  19. 10.安卓逆向2-frida hook技术-frida基本使用-frida指令(用于hook)
  20. 动态设置微信小程序页面标题(navigationBarTitleText属性)
  21. 前端流式接收数据讲解
  22. Flutter下的一点实践
  23. Python训练营打卡 Day41
  24. Eclipse集成lombok
  25. 什么是trace,分布式链路追踪(Distributed Tracing)
  26. VScode ios 模拟器安装cocoapods
  27. Redis最佳实践——安全与稳定性保障之数据持久化详解
  28. 互联网大厂Java求职面试实战:Spring Boot微服务架构及Kafka消息处理示例解析
  29. K 值选对,准确率翻倍:KNN 算法调参的黄金法则
  30. 技术栈ES的介绍和使用