作者简介

王军,Zabbix认证培训师
本文主要介绍了Zabbix监控关系型数据库的三种方式:ODBC、Agent 2和UserParameter,并深入实战演示如何在Zabbix中监控达梦、OpenGauss、OceanBase、巨杉等国产信创数据库。最后,总结了数据库监控过程中常见的错误及解决方案,助您构建稳定高效的数据库监控体系。
目录
一、Zabbix对数据库的监控方法
二、Zabbix信创数据库监控实战
三、Zabbix数据库监控典型问题
一、Zabbix对数据库的监控方法
Zabbix对数据库的监控方式:
Zabbix也提供了开箱即用的官方模板:

开箱即用的模板监控方式
1.使用Agent 2监控数据库

Agent 2支持的数据库监控插件

Agent 2开箱即用的模板
1.1 Agent 2 数据库插件工作流

Agent 2插件工作流
1.2 Agent 2 数据库模块使用

Agent 2监控数据库
1.3 Agent 2 自定义查询SQL
mssql.custom.query[URI,<user>,<password>,queryName,<args...>]:
mysql.custom.query[connString,<user>,<password>,queryName,<args...>]:
oracle.custom.query[connString,<user>,<password>, <service>,queryName,<args...>]:
pgsql.custom.query[URI,<username>,<password>,queryName,<args...>]:
返回自定义查询结果,JSON格式 参数:
1.4 Agent 2 支持本地和远程数据库监控
Zabbix agent 2 支持本地或远程数据库监控:

数据库连接信息

Agent 2连接数据库方式
2.使用ODBC协议监控数据库
通过ODBC方式监控数据库:

ODBC连接数据库
2.1 ODBC采集轮询器
Zabbix 可通过 ODBC 查询所有受支持的数据库:
ODBC 监控由专用轮询进程(ODBC poller)执行:
## Option: StartODBCPollers
# Number of pre-forked ODBC poller instances.
#
# Mandatory: no
# Range: 0-1000
StartODBCPollers=5
2.2 ODBC INI配置
ODBC 驱动及连接配置可通过两个 .ini 文件定义: odbcinst.ini:列出已安装的 ODBC 驱动并定义驱动名称 odbc.ini:基于驱动名称配置数据源 若已在监控项键值中指定连接参数,则可跳过 .ini 文件的配置

ODBC连接配置
2.3 ODBC 监控项
ODBC 监控通过数据库监控项(database monitor item)实现:

数据库监控项
数据库监控项有自己的超时(timeout)设置:

数据库监控超时设置
2.4 ODBC 监控项键值
当前可用的数据库监控项键值共有两种:
db.odbc.select [<unique short description>,<dsn>,<connection string>]
'Select' 返回单个值 – 返回查询结果的第一行第一列
用于返回单一结果的复杂SQL查询场景

db.odbc.get [<unique short description>,<dsn>,<connection string>]
'Get’ 以json数组格式返回查询结果
用于一次性采集多项指标数据,并作为主监控项使用

2.5 ODBC连接
可以选择配置数据源名称 (DSN) 或 连接串:
db.odbc.get[sales,SalesDB]

使用DSN连接
db.odbc.get[sales,,"Driver=/usr/lib/libmyodbc5.so;Server=salesdb.example.com;Database=sales"]
使用连接串连接
3.自定义监控项
在Zabbix中可以用”UserParameter” 执行自定义检查:
以Agent运行用户来执行所有定义的命令:
Zabbix Agent 超时(timeout)设置也会影响“UserParameter”:
3.1 USER PARAMETERS配置
UserParameter 定义的是Item Key, 后面是要执行的命令或脚本
UserParameter=key,command
### Option: UserParameter
# User-defined parameter to monitor. There can be several user-defined parameters.
#
UserParameter=mykey,echo 1
需要在每个Zabbix Agent上定义需要使用的”UserParameter” :
### Option: Include
# You may include individual files or# all files in a directory
Include=/etc/zabbix/zabbix_agentd.d/*.conf
### Option: Include
# You may include individual files or# all files in a directory
Include=/etc/zabbix/zabbix_agent2.d/*.conf
定义或修改配置文件后,通常需要重新加载配置文件,例如:
#重启Agent重新加载配置
systemctl restart zabbix-agent
#执行热加载
zabbix_agentd -R userparameter_reload
3.2 定义不同的USER PARAMETERS
"UserParameter" 支持"简单"和"灵活" 模式:
UserParameter=mysql.qps,mysqladmin status | cut -f9 -d":"
引用简单自定义监控项
UserParameter=mysql.status[*],mysqladmin status --user=$1 --password=$2
引用动态传参自定义监控项
二、Zabbix信创数据库监控实战
信创数据库监控实战

信创数据库类型
1.1 OpenGauss ODBC监控实战
组件
版本
操作系统
Kylin Linux Advanced Server V10
UnixODBC
2.3.7
数据库版本
Vastbase G100 V2.2 (Build 10) Release) compiled at 2023-10-20 10:12:18 commit 15020 last mr on aarch64-unknown-linux-gnu
ODBC 驱动包
#X86和ARM通用 GaussDB-Kernel-V500R002C10-EULER-64bit-Odbc.tar.gz
1.1.1 安装ODBC驱动
1. 自定义openGauss驱动目录
# mkdir /usr/local/lib/openGauss
2. 解压openGauss ODBC Drivers
#解压后有两个目录odbc/lib,lib,将这两个目录中的文件拷贝到驱动目录
# tar -zxf GaussDB-Kernel-V500R002C10-EULER-64bit-Odbc.tar.gz
# cp odbc/lib/* /usr/local/lib/openGauss
# cp lib/* /usr/local/lib/openGauss
3. 创建动态链接库
# cat /etc/ld.so.conf.d/openGauss.conf
/usr/local/lib/openGauss
# ldconfig
1.1.2 配置驱动信息
#cat /etc/odbcinst.ini
[openGauss]
Description=openGauss ODBC driver
Driver64=/usr/local/lib/openGauss/psqlodbcw.so
Setup=/usr/local/lib/openGauss/psqlodbcw.so
1.1.3 创建DSN连接实例
在proxy或server中,通过DSN方式创建数据库连接
# cat /etc/odbc.ini
[NGOM_manage_dev_10.5.97.187]
Description=ODBC for vastbast
Driver=openGauss
Servername=10.5.97.187
Database=<DBNAME>
Username=<DBUSER>
Password=<DBPASSWORD>
Port=5432
1.1.4 测试DSN连接

测试OpenGauss实例连接
1.1.5 创建数据库监控项

数据库监控项
1.1.6 测试数据库监控项

返回SQL执行结果
1.2 OceanBase ODBC监控实战
组件
版本
操作系统
Kylin Linux Advanced Server V10
UnixODBC
2.3.7
数据库版本
OceanBase 3.2.3.3 (r110040022023110614-0509e7fc6b99553ce919e57b0f4752178b5783b8) (Built Nov 6 2023 14:57:39)
ODBC 驱动包(X86)
libobclient-2.1.2-20211201104607.el7.alios7.x86_64.rpm, ob-connector-odbc-2.0.3-20220315112052.el7.alios7.x86_64.rpm,ob-connector-odbc-2.0.4-20220427191618.el7.alios7.x86_64.rpm,ob-unixodbc-2.0.3-20220315113219.el7.alios7.x86_64.rpm
ODBC 驱动包(ARM)
ob-connector-odbc-2.0.9-32024041714.el7.aarch64.rpm,libobclient-2.2.6-12024040914.el7.aarch64.rpm
1.2.1 安装ODBC驱动
# rpm -ivh libobclient-2.2.6-12024040914.el7.aarch64.rpm
# rpm -ivh ob-connector-odbc-2.0.9-32024041714.el7.aarch64.rpm
# rpm -ivh ob-unixodbc-2.0.8.3-20231114143843.el7.alios7.aarch64.rpm
1.2.2 配置环境变量
# vi /etc/profile
# 再文件末尾追加 #add oceabasedb odbc
export ODBCSYSINI=/etc
export ODBCINI=/etc/odbc.ini
export LD_LIBRARY_PATH=/u01/unix-odbc/lib:/u01/obclient/lib:/u01/ob-connector-odbc/lib64/mariadb:$LD_LIBRARY_PATH
# source /etc/profile
1.2.3 创建DSN连接实例
在proxy或server中,通过DSN方式创建数据库连接
# cat /etc/odbc.ini
#在文件中追加
[CAPM_ZABBIX_MONITOR_10.5.97.86]
Driver=Oceanbase
Description=OracleODBC 5 Driver DSN
SERVER=10.5.97.86
PORT=2883
USER=<DBUSER>
Password=<DBPASSWORD>
Database=<DBNAME>
charset=UTF8
1.2.4 测试DSN连接

测试OceanBase实例连接
1.2.5 创建数据库监控

数据库监控项
1.2.6 测试数据库监控项

返回SQL执行结果
1.3 DM8 ODBC监控实战
组件
版本
操作系统
Kylin Linux Advanced Server V10
UnixODBC
2.3.7
数据库版本
DM Database Server 64 V8 DB Version: 0x7000c
ODBC 驱动文件
/usr/local/lib/dm8/libdodbc.so
1.3.1 创建动态链接库
# cat /etc/ld.so.conf.d/dm8.conf
/usr/local/lib/dm8
# ldconfig
1.3.2 配置驱动信息
#cat /etc/odbcinst.ini
# 在文件末尾追加
[DM8]
Description=ODBC driver for DM8
Driver=/usr/local/lib/dm8/libdodbc.so
1.3.3 创建DSN连接实例
# cat /etc/odbc.ini
#在文件中追加
[NGOM_dm8_10.5.98.43]
Description=DM ODBC DSND
Driver=DM8
SERVER=10.5.98.43
UID=<DBUSER>
PWD=<DBPASSWORD>
TCP_PORT=5236
1.3.4 测试DSN连接
# isql NGOM_dm8_10.5.98.43
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select * from v$version;
+---------------------------------------------------------------------------------+
| BANNER |
+---------------------------------------------------------------------------------+
| DM Database Server 64 V8
|
| DB Version: 0x7000c |
+---------------------------------------------------------------------------------+
SQLRowCount returns 2
2 rows fetched
SQL>
1.3.5 创建数据库监控项

数据库监控项
1.3.6 测试数据库监控项

返回SQL执行结果
1.4 巨杉数据库监控实战
组件
版本
操作系统
UnionTech OS Server 20
数据库版本
SequoiaDB shell version:3.4.11
1.4.1 创建自定义脚本
# cat health.js
var db = new (hostname,port,username,password);
db.exec(“select NodeName,IsPrimary,ServiceStatus,Status,DataStatus,ErrNum,FTStatus,DiffLSNWithPrimary,SyncControl FROM $SNAPSHOT_HEALTH”)
# cat sequioadbexec.sh
……
connstring=“hostname=$hostname;port=$port;username=$username;password=$password”
result=$(/opt/sequoiadb/bin/sdb -e $connstring -f health.js)
……
1.4.2 创建自定义监控项
# cat /etc/zabbix/zabbix_agentd.d/sequoiadb.conf
UserParameter=sequoiadb.getraw[*],sh /etc/zabbix/scripts/sequioadbexec.sh $1 $2 $3 $4 $5
1.4.3 创建数据库监控项

1.4.4 监控效果

Zabbix数据库监控典型问题
Q 1
ODBC驱动版本兼容性问题
A
UnixODBC 2.3.9与Oracle 11g驱动器版本不兼容,升级Oracle驱动器版本到Oracle Database Client 18c Oracle Database Client 18c supports "Oracle Database Server is version 11.2.0.4 or later.".

UnixODBC 2.3.1与Oracle 12C驱动器版本不兼容,导致中文乱码。

ODBC Driver兼容性

中文乱码
Q 2
ODBC驱动库文件权限问题
A
驱动库文件安装在非默认或标准的系统路径中,Zabbix Proxy服务运行用户,对数据库驱动文件没有读权限。 可以通过sudo命令切换用户执行isql命令检查是否正常连接。
# sudo -H -u monitor bash -c 'isql -vvvv DNS USER PASS
> select version(); 
Zabbix前端连接异常

命令连接异常
Q 3
Zabbix查询结果中文字符乱码
A
isql命令行执行结果正常,Zabbix数据库采集中文乱码,需要设置环境
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8"
#如果是通过systemd启动zabbix server/proxy,还需要将以上环境变量加入
# cat /usr/lib/systemd/system/zabbix_proxy.service
[Unit]
Description=Zabbix proxy service
……
EnvironmentFile=-/etc/sysconfig/zabbix-proxy
# cat /etc/sysconfig/zabbix-proxy
# 在文件末尾追加
NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8"
命令行执行正常

前端查询结果中文乱码
Q 4
UserParameter传参存在特殊字符
A
默认UserParameter参数中不允许使用特殊字符,例如:密码中存在特殊符号:
### Option: UnsafeUserParameters
# Allow all characters to be passed in arguments to user-defined parameters.
# The following characters and newline characters are not allowed:
# \ ' " ` * ? [ ] { } ~ $ ! & ; ( ) < > | # @
# Range: 0-1
UnsafeUserParameters=0
# 0 表示 Deny; 1 表示 Allow

参数存在特殊符号

监控项采集异常
以上,更多技术干货内容分享,欢迎参加2026 Zabbix开源社区线下技术交流活动(Zabbix Meetup/Zabbix Conference)!