很多运维同行第一次给 MariaDB 上监控,习惯 systemctl status mariadb 看一眼 active 就完事。真正出问题时,这个 active 往往还在,但连接池满了、复制断了、Innodb 读磁盘暴涨,业务已经在报错。Zabbix 监控 MariaDB 服务的价值,不是把模板套上去看几个曲线,而是把数据库故障从“业务报错才发现”前移到“趋势不对就处理”。这篇内容围绕一套可复现的落地路径展开:Zabbix Agent2 官方 MySQL 插件做基础采集,自定义 UserParameter 脚本补齐 MariaDB 关键指标,Web 端配置触发器、图形和告警收敛。适合刚接手 Zabbix 的运维、需要给内部系统补数据库监控的 DBA、后端开发,以及正在从“看进程存活”转向“看数据库健康度”的同行。
前置条件很简单:Zabbix Server 已正常运行,MariaDB 可以本地登录,目标主机有 sudo 权限,Zabbix Agent2 与 Server 大版本尽量一致。下面不讨论复杂网络代理,只谈本地采集和常见生产环境里的坑。数据库监控最怕两件事:一是权限给太大,二是采集频率太猛。我会在每一步说明为什么这么选,以及踩过哪些坑。
1. 监控目标拆解与方案选型
1.1 先回答五个问题,而不是先找模板
给 MariaDB 做监控,很多人第一步是去搜“Zabbix MariaDB 模板”,导入后发现能用,但不知道哪些指标重要。我的习惯是先列问题,再找工具。第一个问题:服务活着吗?不是看 systemd active,而是看 TCP 3306 能不能建连接、能不能执行一条 SELECT 1。第二个问题:连接是否健康?包括当前连接数、运行线程数、历史最大连接数、失败连接数、连接使用率。第三个问题:吞吐和查询是否异常?包括 Questions、Com_select、Com_insert、Com_update、Com_delete、慢查询数量。第四个问题:复制是否正常?包括复制延迟、IO 线程、SQL 线程、复制通道数量。第五个问题:资源是否吃紧?包括 Innodb 缓冲池命中率、磁盘空间、临时表、锁等待。
这五个问题对应数据库的五个层面:存活、连接、吞吐、复制、资源。进程挂了是最容易发现的,但生产事故更多是“进程还在,性能已经不行”。比如连接数打满,业务连接超时;Innodb 命中率下降,查询变慢;复制延迟拉大,从库数据陈旧。Zabbix 监控 MariaDB 服务时,如果只监控 mysql.ping,就相当于给汽车装了一个“发动机是否点燃”的指示灯,油量、水温、胎压全都没看。
1.2 采集路径对比:Agent2 插件、自定义脚本、外部检查
落地时有三种常见路径。第一种是 Zabbix Agent2 自带的 MySQL 插件,MariaDB 与 MySQL 协议兼容,所以大部分指标可以直接用。优点是开箱即用、配置少、键名规范。缺点是官方模板覆盖的指标有限,MariaDB 的多源复制、Innodb 命中率、连接使用率等需要补充。第二种是 UserParameter 自定义脚本,通过 mysql 客户端执行 SQL,把结果输出成数字。优点是灵活,想要什么指标就取什么指标,能适配 MariaDB 的 SHOW ALL SLAVES STATUS。缺点是要自己维护脚本、处理空值和权限。第三种是外部检查或 ODBC 采集,Zabbix Server 直接连数据库。优点是 Agent 装得少,缺点是凭据要放在 Server 侧,网络和权限管理更复杂,常规单机监控不推荐。
| 采集方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Agent2 MySQL 插件 | 开箱即用,键名稳定,支持连接池 | 指标有限,复制项对 MariaDB 需验证 | 基础监控、快速接入 |
| UserParameter 自定义脚本 | 灵活,可补复制、命中率、连接率 | 需维护脚本和权限,空值要处理 | 生产环境关键指标补齐 |
| 外部检查/ODBC | 无需在数据库主机装 Agent | 凭据在 Server 侧,网络依赖大 | 特殊网络环境,不建议常规使用 |
我的选型结论是:Agent2 插件做基础采集,自定义脚本做关键补充。两者不冲突,官方模板先跑通,再用自定义项补缺口。这样既不用从零造轮子,也不会被模板限制住。
1.3 监控账号与最小权限:别用 root
监控账号必须独立,不能直接用 root,也不能给 ALL。推荐的 SQL 如下,用户名和密码换成自己的强密码:
CREATE USER 'zabbix_mon'@'localhost' IDENTIFIED BY '替换为强密码'; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'zabbix_mon'@'localhost'; FLUSH PRIVILEGES;为什么是这几个权限?PROCESS 用来查看全部线程和连接状态,SHOW PROCESSLIST 以及部分状态变量需要它。REPLICATION CLIENT 用来查看复制状态,SHOW SLAVE STATUS、SHOW ALL SLAVES STATUS 需要它。SELECT 用来做数据库大小发现、表空间查询等可选指标。如果只采集基础状态,USAGE 加上 REPLICATION CLIENT 也能跑,但生产环境通常还要看连接和库大小,所以给这三个比较合适。不要给 SUPER、不要给 FILE、不要给 GRANT OPTION。监控账号只读,密码文件权限必须收紧。
密码不要写在 UserParameter 命令行里,因为 ps 能看到。我的做法是写进 /etc/zabbix/.my.cnf,权限 600,属主 zabbix。Agent2 的插件配置也单独放,权限同样收紧。后面会详细写。
1.4 采集频率与性能开销的取舍
监控频率不是越高越好。基础指标 30 秒到 60 秒一次足够,复制延迟 30 秒一次,慢查询和 Innodb 命中率 60 秒一次。如果设成 1 秒,MariaDB 要频繁执行 SHOW GLOBAL STATUS,Zabbix 也要存储大量历史数据,最后数据库和监控系统都累。SHOW GLOBAL STATUS 本身很轻,但 SHOW FULL PROCESSLIST 在高连接数时开销明显,不要高频跑。我的经验是:连接数、运行线程、复制延迟用 30 秒;慢查询、Questions、Innodb 命中率用 60 秒;max_connections 这种变量用 1 小时。历史保留 7 天,趋势保留 365 天。这样既能看趋势,又不会把数据库压出问题。
注意:如果 MariaDB 实例很多,优先考虑 Zabbix Agent 主动式,减少 Server 轮询压力。单机或少量实例用被动式更直观。
2. Zabbix Agent2 侧安装与 MariaDB 连接配置
2.1 安装 Agent2 与 MySQL 插件包
Debian 系常见命令:
sudo apt update sudo apt install -y zabbix-agent2 zabbix-agent2-plugin-mysqlRHEL 系常见命令:
sudo dnf install -y zabbix-agent2 zabbix-agent2-plugin-mysql安装后先确认版本和状态:
zabbix_agent2 -V systemctl status zabbix-agent2版本尽量与 Zabbix Server 大版本一致,比如 Server 是 6.0,Agent2 也用 6.0。大版本跨太多,插件参数和模板可能不兼容。插件包装好后,MySQL 插件会被 Agent2 加载。如果发行版仓库没有单独的插件包,也可以只装 zabbix-agent2,然后确认编译时是否带 MySQL 插件。用 zabbix_agent2 -t mysql.ping 可以快速验证。
2.2 配置 MariaDB 连接参数
Agent2 的插件配置放在 /etc/zabbix/zabbix_agent2.d/plugins.d/ 目录下,新建 mysql.conf:
Plugins.MySQL.Default.Uri=tcp://127.0.0.1:3306 Plugins.MySQL.Default.User=zabbix_mon Plugins.MySQL.Default.Password=替换为强密码 Plugins.MySQL.Default.SessionName=zabbix_mon Plugins.MySQL.Timeout=5 Plugins.MySQL.Default.Timeout=5 Plugins.MySQL.KeepAlive=300逐项解释。Uri 用 tcp://127.0.0.1:3306,走本机回环,不走公网,避免暴露数据库端口。User 和 Password 用前面创建的监控账号。SessionName 是连接池里的会话名,方便识别。Timeout 是连接和查询超时,5 秒比较稳。KeepAlive 是保持连接的时间,300 秒可以减少反复建连。文件权限要收紧:
sudo chown zabbix:zabbix /etc/zabbix/zabbix_agent2.d/plugins.d/mysql.conf sudo chmod 600 /etc/zabbix/zabbix_agent2.d/plugins.d/mysql.conf如果 MariaDB 只监听 socket,不监听 TCP,可以把 Uri 改成 unix:///run/mysqld/mysqld.sock。但 socket 路径各发行版不同,先用 SHOW VARIABLES LIKE 'socket'; 查清楚。用 TCP 127.0.0.1 的好处是权限简单,zabbix 用户不需要加入 mysql 组,也不需要读 socket 目录。
2.3 重启与命令行验证
改完配置重启 Agent2:
sudo systemctl restart zabbix-agent2然后逐条测试插件键:
zabbix_agent2 -t mysql.ping zabbix_agent2 -t mysql.version zabbix_agent2 -t 'mysql.status[Uptime]' zabbix_agent2 -t 'mysql.status[Threads_connected]' zabbix_agent2 -t 'mysql.status[Slow_queries]'期望结果:mysql.ping 返回 1,mysql.version 返回类似 10.x 的版本,Uptime 返回秒数,Threads_connected 返回当前连接数。如果返回 ZBX_NOTSUPPORTED,先看配置路径是否被 Include,再看权限和密码。这里有个小坑:插件配置里的密码如果包含特殊字符,某些版本需要加引号或转义。最稳妥的做法是先用简单强密码验证通,再逐步换复杂密码。
2.4 导入官方 MySQL by Zabbix agent 2 模板
Agent2 侧通后,去 Zabbix Web 端导入官方模板。路径通常是“数据采集 -> 模板 -> 导入”,选择官方提供的 MySQL by Zabbix agent 2 模板文件。然后创建主机或编辑已有主机,在模板里链接这个模板。主机接口填 Agent 的 IP 和端口 10050,主机名要和 Agent 配置里的 Hostname 一致。
等几分钟看最新数据。如果基础项有数据,说明链路通。MariaDB 与 MySQL 兼容性很好,但复制相关项可能不适用。官方模板里如果有 Slave 相关键在 MariaDB 上取不到,不要急着删主机,先把不支持的项禁用,后面用自定义脚本替代。也可以克隆一份模板,改名为“MariaDB by Zabbix agent 2”,在克隆模板上改,避免升级时覆盖。
提示:导入模板后先看“最新数据”,不要直接开告警。确认每个键都有值,再配置触发器,否则容易告警风暴。
3. 自定义监控脚本:把 MariaDB 关键指标补齐
3.1 为什么官方模板还不够
官方模板覆盖了 Uptime、连接数、Questions、Innodb 部分状态,但生产环境还需要复制延迟、复制线程状态、多源复制通道数、Innodb 命中率、连接使用率、慢查询增长、临时表、Aborted_connects。MariaDB 的复制语法与 MySQL 8 有差异,MySQL 8 用 SHOW REPLICA STATUS,MariaDB 更常见的是 SHOW SLAVE STATUS 和 SHOW ALL SLAVES STATUS。官方模板如果只取单通道,多源复制就会漏。自定义脚本可以白名单参数,统一输出数字,触发器写起来简单,也方便后续加业务指标。
3.2 准备只读凭据文件
在数据库主机创建 /etc/zabbix/.my.cnf:
[client] user=zabbix_mon password=替换为强密码 host=127.0.0.1 port=3306 socket=/run/mysqld/mysqld.sock connect-timeout=3权限设置:
sudo chown zabbix:zabbix /etc/zabbix/.my.cnf sudo chmod 600 /etc/zabbix/.my.cnf测试 zabbix 用户能否读取:
sudo -u zabbix mysql --defaults-extra-file=/etc/zabbix/.my.cnf -e "SELECT 1;"socket 路径不确定时,先用有权限的账号执行 SHOW VARIABLES LIKE 'socket';。常见的还有 /var/lib/mysql/mysql.sock。如果 socket 不通,可以把 host 和 port 留下,去掉 socket,走 TCP。生产环境建议走本机回环 TCP,权限更清晰。
3.3 编写通用采集脚本
新建 /usr/local/bin/mariadb_zabbix.sh,内容如下:
#!/usr/bin/env bash set -u MYSQL_CNF="/etc/zabbix/.my.cnf" MYSQL_BIN="$(command -v mysql || command -v mariadb)" if [ -z "$MYSQL_BIN" ]; then echo "0" exit 0 fi q() { "$MYSQL_BIN" --defaults-extra-file="$MYSQL_CNF" --connect-timeout=3 -N -B -e "$1" 2>/dev/null | awk 'NR==1{print $2}' } status() { q "SHOW GLOBAL STATUS LIKE '$1';" } var() { q "SHOW GLOBAL VARIABLES LIKE '$1';" } case "${1:-}" in ping) if "$MYSQL_BIN" --defaults-extra-file="$MYSQL_CNF" --connect-timeout=3 -e "SELECT 1;" >/dev/null 2>&1; then echo 1 else echo 0 fi ;; uptime) status Uptime ;; threads_connected) status Threads_connected ;; threads_running) status Threads_running ;; max_connections) var max_connections ;; max_used_connections) status Max_used_connections ;; questions) status Questions ;; slow_queries) status Slow_queries ;; aborted_connects) status Aborted_connects ;; com_commit) status Com_commit ;; com_rollback) status Com_rollback ;; innodb_hit) reads="$(status Innodb_buffer_pool_reads)" reqs="$(status Innodb_buffer_pool_read_requests)" awk -v r="$reads" -v q="$reqs" 'BEGIN{ if(q+0==0) print 100; else printf "%.2f", (1-r/q)*100 }' ;; slave_delay) "$MYSQL_BIN" --defaults-extra-file="$MYSQL_CNF" --connect-timeout=3 -e "SHOW ALL SLAVES STATUS\G" 2>/dev/null \ | awk -F': ' '/Seconds_Behind_Master/{ if($2=="NULL") print -1; else print $2; exit }' ;; slave_io) "$MYSQL_BIN" --defaults-extra-file="$MYSQL_CNF" --connect-timeout=3 -e "SHOW ALL SLAVES STATUS\G" 2>/dev/null \ | awk -F': ' '/Slave_IO_Running/{ print ($2=="Yes")?1:0; exit }' ;; slave_sql) "$MYSQL_BIN" --defaults-extra-file="$MYSQL_CNF" --connect-timeout=3 -e "SHOW ALL SLAVES STATUS\G" 2>/dev/null \ | awk -F': ' '/Slave_SQL_Running/{ print ($2=="Yes")?1:0; exit }' ;; replication_count) "$MYSQL_BIN" --defaults-extra-file="$MYSQL_CNF" --connect-timeout=3 -e "SHOW ALL SLAVES STATUS\G" 2>/dev/null \ | grep -c "^Connection_name:" || true ;; *) echo "unknown" exit 1 ;; esac脚本里几个细节值得说。第一,用 --defaults-extra-file 读取账号密码,不用 -p 明文。第二,所有输出只取第一行,因为 Zabbix 用户参数只认单行结果。第三,innodb_hit 用 1 - reads/read_requests 计算,结果保留两位小数。第四,slave_delay 在 MariaDB 里可能返回 NULL,脚本输出 -1,表示延迟未知或复制未运行,触发器要配合 replication_count 判断。第五,多源复制时 SHOW ALL SLAVES STATUS 会有多个 Connection_name,这里只取第一个,够用但不完整,后续可以用 LLD 做多通道。
给脚本执行权限:
sudo chmod 755 /usr/local/bin/mariadb_zabbix.sh3.4 配置 UserParameter 并测试
新建 /etc/zabbix/zabbix_agent2.d/userparameter_mariadb.conf:
UserParameter=mariadb.metric[*],/usr/local/bin/mariadb_zabbix.sh "$1" UserParameter=mariadb.ping,/usr/local/bin/mariadb_zabbix.sh ping重启 Agent2:
sudo systemctl restart zabbix-agent2先用 zabbix 用户手动跑一遍:
sudo -u zabbix /usr/local/bin/mariadb_zabbix.sh threads_connected sudo -u zabbix /usr/local/bin/mariadb_zabbix.sh innodb_hit sudo -u zabbix /usr/local/bin/mariadb_zabbix.sh slave_delay再用 Agent2 测试键:
zabbix_agent2 -t 'mariadb.metric[threads_connected]' zabbix_agent2 -t 'mariadb.metric[innodb_hit]' zabbix_agent2 -t 'mariadb.metric[slave_delay]' zabbix_agent2 -t 'mariadb.ping'如果返回 ZBX_NOTSUPPORTED,优先查三件事:脚本是否有执行权限、zabbix 用户是否能读 .my.cnf、SELinux 或 AppArmor 是否拦截。用 sudo -u zabbix 跑通,基本就能排除大部分问题。
3.5 常见脚本坑与规避方法
第一个坑是空值。SHOW STATUS 查不到时会输出空,Zabbix 可能报不支持。脚本里对关键参数做默认返回,比如 no replication 时 replication_count 返回 0。第二个坑是权限。.my.cnf 属主不是 zabbix,或者权限 644,都会导致连接失败。第三个坑是 socket 路径。不同安装方式 socket 可能不同,用 TCP 127.0.0.1 更省事。第四个坑是脚本输出多行。比如 SHOW ALL SLAVES STATUS 输出很多行,必须用 awk 只取需要的字段并 exit。第五个坑是密码特殊字符。配置文件里的密码如果包含 #、$ 等,可能被解析异常,建议用引号或先测试。第六个坑是慢查询累加值。Slow_queries 是总数,不要直接告警,要用 Zabbix 预处理“变化量/秒”或“变化量”。
注意:不要用 root 跑监控脚本,不要在 UserParameter 里写密码,不要把脚本放在可写目录。监控账号只读,权限最小化。
4. Zabbix Web 端监控项、触发器与图形落地
4.1 新建模板与主机链接
在 Web 端“数据采集 -> 模板”新建模板,命名比如 Template DB MariaDB Custom。然后创建主机,主机名与 Agent 配置的 Hostname 保持一致,接口填 Agent IP 和端口 10050。先链接官方 MySQL by Zabbix agent 2 模板,再链接自定义模板。主动式和被动式怎么选?少量实例用被动式,配置直观;大量实例用主动式,减少 Server 连接压力。这里按被动式说明,主动式只是监控项类型多选一个选项。
4.2 关键监控项配置表
在自定义模板里添加监控项,类型选“Zabbix agent”,键名按下面填。更新间隔和单位根据实际调整。
| 监控项名称 | 键名 | 类型 | 间隔 | 单位 | 说明 |
|---|---|---|---|---|---|
| MariaDB ping | mariadb.ping | 数字无符号 | 30s | 1 正常,0 异常 | |
| 当前连接数 | mariadb.metric[threads_connected] | 数字无符号 | 30s | 个 | 当前连接 |
| 运行线程数 | mariadb.metric[threads_running] | 数字无符号 | 30s | 个 | 正在执行 |
| 最大连接数 | mariadb.metric[max_connections] | 数字无符号 | 1h | 个 | 配置上限 |
| 历史最大连接 | mariadb.metric[max_used_connections] | 数字无符号 | 60s | 个 | 峰值参考 |
| Questions 总数 | mariadb.metric[questions] | 数字无符号 | 60s | 个 | 做 QPS |
| 慢查询总数 | mariadb.metric[slow_queries] | 数字无符号 | 60s | 个 | 做增量 |
| Innodb 命中率 | mariadb.metric[innodb_hit] | 浮点数 | 60s | % | 低于 95 关注 |
| 复制延迟 | mariadb.metric[slave_delay] | 浮点数 | 30s | 秒 | -1 表示未知 |
| 复制 IO 线程 | mariadb.metric[slave_io] | 数字无符号 | 30s | 1 正常 | |
| 复制 SQL 线程 | mariadb.metric[slave_sql] | 数字无符号 | 30s | 1 正常 | |
| 复制通道数 | mariadb.metric[replication_count] | 数字无符号 | 5m | 个 | 判断是否从库 |
| 失败连接总数 | mariadb.metric[aborted_connects] | 数字无符号 | 60s | 个 | 做增量 |
历史保留建议:基础项 7 天,趋势 365 天。复制延迟、连接数这种关键项可以保留 30 天历史,方便回溯故障。QPS 不要直接存 Questions 总数,而是加一个计算项或预处理项。比如监控项 Questions 加预处理“变化量/秒”,命名 MariaDB QPS。TPS 可以用 Com_commit 和 Com_rollback 相加后做变化量/秒。
4.3 触发器与依赖设计
触发器不要只写一个“大于阈值”,要把恢复表达式和依赖一起考虑。参考配置如下:
| 触发器名称 | 表达式思路 | 严重性 | 说明 |
|---|---|---|---|
| MariaDB 服务不可用 | last(/主机/mariadb.ping)=0 | 灾难 | 连续 3 次失败更稳 |
| 连接使用率过高 | last(threads_connected)/last(max_connections)*100 > 80 | 严重 | 用宏调阈值 |
| 复制延迟过大 | last(slave_delay) > 300 and last(replication_count)>0 | 严重 | 恢复用 <120 |
| 复制 IO 线程异常 | last(replication_count)>0 and last(slave_io)=0 | 灾难 | 从库才判断 |
| 复制 SQL 线程异常 | last(replication_count)>0 and last(slave_sql)=0 | 灾难 | 从库才判断 |
| Innodb 命中率过低 | last(innodb_hit) < 95 | 警告 | 延迟 5 分钟 |
| 慢查询增长过快 | 慢查询增量/秒 > 阈值 | 警告 | 结合业务 |
| 失败连接增长 | 失败连接增量 > 10/5m | 警告 | 可能密码错或攻击 |
依赖关系很重要。数据库 ping 失败时,连接数、复制延迟、命中率都会异常,如果不加依赖,一次故障会发几十条告警。在触发器里配置依赖:连接类触发器依赖 MariaDB 服务不可用,复制类触发器依赖服务不可用。这样数据库挂了只发一条最关键的告警。
宏建议:{$MARIADB.CONN.USED.PCT}=80,{$MARIADB.SLAVE.DELAY.MAX}=300,{$MARIADB.INNODB.HIT.MIN}=95,{$MARIADB.SLOW.QUERY.RATE}=5。阈值不要写死在表达式里,后面调优方便。
4.4 图形与仪表盘
图形至少做四个。第一个连接趋势:当前连接、运行线程、最大连接、历史最大连接。第二个吞吐趋势:QPS、TPS、慢查询增量。第三个 Innodb:命中率、读请求、读磁盘。第四个复制:延迟、IO 线程、SQL 线程。仪表盘可以新建一个“MariaDB 概览”,放最新数据、问题列表、连接趋势、复制延迟。值班同事一眼能看到哪个实例异常。
QPS 的计算方式是:Questions 做“变化量/秒”。TPS 是 Com_commit 和 Com_rollback 相加后做“变化量/秒”。在 Zabbix 里可以建两个监控项,再用计算项相加。慢查询用 Slow_queries 的“变化量/秒”,不要用总数,总数只会一直涨,没有告警意义。
4.5 告警收敛与维护期
计划内的备份、主从切换、版本升级要提前建维护期,否则告警会淹没值班群。复制延迟这种指标容易抖动,恢复表达式要放宽,比如超过 300 秒告警,低于 120 秒恢复。连接数突发可以用 5 分钟平均值,避免瞬间尖峰误报。通知分级:服务不可用、复制线程异常走灾难;连接使用率、复制延迟走严重;Innodb 命中率、慢查询走警告。不要所有问题都发最高级,否则真正的高危告警会被忽略。
5. 常见问题与排查技巧实录
5.1 Agent2 连接 MariaDB 失败
最常见报错是 Access denied for user 'zabbix_mon'@'localhost'。原因通常是密码错误、用户 host 不匹配、.my.cnf 权限不对。检查命令用 sudo -u zabbix mysql --defaults-extra-file=/etc/zabbix/.my.cnf -e "SELECT 1;"。如果报 Can't connect to local MySQL server through socket,说明 socket 路径不对,用 SHOW VARIABLES LIKE 'socket'; 查。如果报 Connection refused,检查 MariaDB 是否监听 127.0.0.1:3306,bind-address 是否只监听 socket,skip-networking 是否开启,防火墙是否拦截。下面表格整理常见现象。
| 现象 | 可能原因 | 排查命令 | 解决 |
|---|---|---|---|
| Access denied | 密码错、host 不匹配、权限文件不可读 | sudo -u zabbix mysql --defaults-extra-file=... | 改密码、确认用户 host、chmod 600 |
| Socket 连接失败 | socket 路径不对 | SHOW VARIABLES LIKE 'socket'; | 改 .my.cnf 或走 TCP |
| Connection refused | 未监听 TCP | ss -lntp | grep 3306 |
| 认证插件不兼容 | 旧客户端不支持新插件 | mysql --version | 换客户端或改认证方式 |
| 超时 | 网络或 DNS 慢 | 手动 mysql 连接计时 | 用 127.0.0.1,加 connect-timeout |
5.2 自定义监控项不支持或返回空
先确认 UserParameter 文件放在 Include 目录,Agent2 配置里有 Include=/etc/zabbix/zabbix_agent2.d/*.conf。然后手动用 zabbix 用户执行脚本。如果手动能出值,Agent2 测试键不行,看权限和 SELinux。SELinux 开启时,可以查 /var/log/audit/audit.log,看有没有 denied。AppArmor 环境看 dmesg 或系统日志。脚本权限 755,所在目录 755,.my.cnf 600 且属主 zabbix。还有一个坑是脚本输出带空格或换行,Zabbix 只取第一行,最好在脚本里用 awk 处理干净。
5.3 MariaDB 复制指标取不到或误报
MariaDB 常用 SHOW ALL SLAVES STATUS,MySQL 8 用 SHOW REPLICA STATUS。如果脚本只写 SHOW SLAVE STATUS,多源复制可能只看到第一个通道。多源复制时会出现多个 Connection_name,建议用 LLD 发现复制通道,或者至少用 SHOW ALL SLAVES STATUS 取第一个并记录。Seconds_Behind_Master 为 NULL 时表示 IO 线程未运行或延迟未知,脚本返回 -1,触发器要结合 replication_count 判断。如果实例不是从库,replication_count 为 0,复制延迟和线程触发器不要启动,否则会误报。复制延迟瞬跳很常见,业务高峰写多,延迟短暂升高,恢复表达式设低一点,告警延迟几分钟。
5.4 监控项抖动与误报处理
连接数突然升高可能是业务发布、连接池重启、慢查询堆积。不要一看到超过 80% 就报灾难,可以先用 5 分钟平均。Innodb 命中率在实例刚启动时可能偏低,加一个启动延迟 10 分钟。慢查询要关注增长速率,而不是总数。Aborted_connects 增长可能是密码错误、连接超时、网络抖动,短时间增长不一定要告警,连续 5 分钟增长再报。复制延迟在备份时段可能拉高,维护期可以抑制。
5.5 性能与安全红线
监控账号不要给 root,不要给 ALL。密码不要写在 UserParameter 里,进程列表能看到。采集频率不要 1 秒,SHOW PROCESSLIST 不要高频。文件权限必须 600,属主 zabbix。密码轮换时先改数据库账号,再同时改 .my.cnf 和 Agent2 插件配置,最后重启 Agent2。定期看 Agent2 日志,确认没有反复重连和认证失败。不要为了省事把监控账号开放远程访问,只允许 localhost。
注意:生产环境里监控项不是越多越好。先保证 ping、连接、复制、慢查询、Innodb 命中率五个核心项稳定,再逐步加。加太多项,维护成本和误报概率都会上升。
6. 监控数据怎么用:从告警到容量判断
6.1 用基线判断扩容
Zabbix 监控 MariaDB 服务跑一段时间后,最有价值的不是单点告警,而是基线。比如 Max_used_connections 一周内是否持续接近 max_connections 的 70%。如果是,说明连接池配置或数据库上限需要调整。Innodb 命中率长期低于 97%,说明缓冲池可能偏小,或者有大查询在扫磁盘。Questions 曲线突然掉底,可能不是业务变少,而是数据库连接不上。复制延迟每天高峰升高,说明从库压力或网络需要优化。把这些趋势和业务发布、备份窗口对齐,才能判断是正常波动还是容量问题。
6.2 和慢查询日志、Explain 联动
Zabbix 告警慢查询增长后,下一步不是继续看 Zabbix,而是登录数据库看慢查询日志。先确认 long_query_time 和 slow_query_log 是否开启,再用 mysqldumpslow 或直接看日志文件,找到具体 SQL。然后对可疑 SQL 做