14 ODBC 监控
概述
ODBC监控对应Zabbix前端中的数据库监控 监控项类型。
ODBC是一种用于访问数据库管理系统(DBMS)的C编程语言中间件 API。ODBC概念由微软开发,后来移植到其他平台。
Zabbix可以 query 通过ODBC支持的任何数据库。为此,Zabbix不直接连接数据库,而是使用ODBC接口和在ODBC中设置的驱动程序。此功能允许更高效地监控不同数据库以实现多种目的 - 例如检查特定数据库队列、使用统计信息等。Zabbix支持unixODBC,这是最常用的开源ODBC API实现之一。
另请参阅ODBC检查的 odbc检查。
安装 unixODBC
建议的unixODBC安装方式是使用Linux操作系统默认的软件包仓库。在大多数主流Linux发行版中,unixODBC默认已包含在软件仓库中。若不可用,可从unixODBC官网获取: http://www.unixodbc.org/download.html.
在Ubuntu/Debian系统上使用apt包管理器安装unixODBC:
apt install unixodbc unixodbc-dev
在基于RedHat/Fedora的系统上使用dnf包管理器安装unixODBC:
dnf install unixODBC unixODBC-devel
在基于SUSE的系统上使用zypper包管理器安装unixODBC:
zypper in unixODBC-devel
编译支持unixODBC的Zabbix时需要unixodbc-dev或unixODBC-devel软件包。
安装 unixODBC 驱动
对于需要监控的数据库,应安装相应的unixODBC数据库驱动。unixODBC官网提供了支持的数据库及驱动列表:http://www.unixodbc.org/drivers.html。部分Linux发行版的软件仓库中已包含数据库驱动包。
在Ubuntu/Debian系统上使用apt包管理器安装MySQL数据库驱动:
apt install odbc-mariadb
在基于RedHat/Fedora的系统上使用dnf包管理器安装MySQL数据库驱动:
dnf install mariadb-connector-odbc
在基于SUSE的系统上使用zypper包管理器安装MySQL数据库驱动:
zypper in mariadb-connector-odbc
配置 unixODBC
ODBC配置通过编辑odbcinst.ini和 odbc.ini 文件。要验证配置file位置,请输入:
odbcinst -j
odbcinst.ini 用于列出已安装的ODBC数据库驱动程序:
[mysql]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc5.so
参数详情:
| 属性 | 描述 |
|---|---|
| mysql | 数据库驱动名称. |
| 描述 | 数据库驱动描述. |
| Driver | 数据库驱动库路径。 |
odbc.ini 用于定义数据源:
[test]
Description = MySQL test database
Driver = mysql
Server = 127.0.0.1
User = root
Password =
Port = 3306
Database = zabbix
参数详情:
| 属性 | 描述 |
|---|---|
| test | 数据源名称(DSN). |
| 描述 | 数据源描述. |
| Driver | 数据库驱动名称 - 如odbcinst.ini中所指定 |
| Server | 数据库服务器IP/DNS. |
| User | 用于连接的数据库用户。 |
| Password | 数据库用户密码. |
| Port | 数据库连接端口. |
| Database | 数据库名称. |
要验证ODBC连接是否成功工作,需建立到 数据库应进行测试。这可以通过isql实用工具完成 (包含在unixODBC包中):
isql test
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
编译支持 ODBC 的 Zabbix
要启用ODBC支持,Zabbix需要使用以下flag进行编译:
--with-unixodbc[=ARG] # Use ODBC driver against unixODBC package.
有关从3-从源代码安装安装Zabbix的更多信息。
Zabbix前端中的监控项配置
配置数据库监控 概述.

所有必填字段均以红色星号标记。
针对数据库监控监控项,您必须输入:
| 类型 | 在此处选择 数据库监控 |
| 键值 | 输入以下任一支持的监控项键值: db.odbc.select[<唯一简短描述>,<dsn>,<连接string>] - 该监控项设计用于返回单个值,即SQLquery结果中第一行的第一列。若query返回多列,仅读取第一列;若query返回多行,仅读取第一行。 db.odbc.get[<唯一简短描述>,<dsn>,<连接string>] - 该监控项能以JSON格式返回多行/多列数据,因此可作为主监控项在一次系统调用中收集所有数据,而依赖项监控项可通过JSONPath预处理提取独立值。详见低阶发现中的示例返回格式。此监控项自Zabbix 4.4起支持。 唯一描述将用于在触发器等场景中标识监控项。 虽然 dsn和connection string是可选参数,但至少需指定其一。若同时定义数据源名称(DSN)和连接string,DSN将被忽略。数据源名称(如使用)必须按odbc.ini中的规范设置。 连接string可包含驱动程序特定参数。 db.odbc.discovery[<唯一简短描述>,<dsn>,<连接string>] - 该监控项返回low-level discovery数据。 示例(MySQL ODBC驱动5连接): => db.odbc.get[MySQL示例,,"Driver=/usr/local/lib/libmyodbc5a.so;Database=master;Server=127.0.0.1;Port=3306"] |
| 用户名 | 输入数据库用户名 如果在odbc.ini中指定了用户,则该参数可选。 若使用连接string且用户名字段非空时,会以 UID=<user>格式附加到连接string中 |
| Password | 输入数据库用户密码 如果在odbc.ini中指定了密码,则该参数可选。 如果使用连接string且Password字段非空,该密码会以 PWD=<password>格式附加到连接string中。从Zabbix 6.0.34开始,此字段支持特殊字符。 在Zabbix 6.0.34之前,若密码包含分号需用花括号包裹,例如 {P?;)*word}。6.0.34版本后仍支持此包裹方式但不再强制要求。密码会以UID=<username>;PWD={P?;)*word}格式附加在用户名后构成连接string。要测试生成的string,可run以下命令:isql -v -k 'Driver=libmaodbc.so;Database=zabbix;UID=zabbix;PWD={P?;)*word}' |
| SQL query | 输入SQL query. 注意使用 db.odbc.select[] 监控项时,query必须仅返回一个值. |
| 信息类型 | 了解query将返回何种信息类型至关重要,以便在此处正确选择。若信息类型设置错误,监控项将变为不受支持状态。 |
重要说明
- 如果server 或 proxy配置中未启动任何odbc轮询器进程,数据库监控监控项将变为不受支持状态。要激活ODBC轮询器,请在Zabbix server配置file中设置StartODBCPollers参数,或对于由proxy执行的检查,在Zabbix proxy配置file中设置。
- Zabbix不限制query的执行时间。用户需自行选择能在合理时间内执行的queries。
- 来自Zabbix server的Timeout参数值被用作ODBC login超时(注意:根据ODBC驱动程序的不同,login超时设置可能会被忽略)。
- SQL命令必须像任何带有
select ...的query一样返回结果集。query的语法将取决于处理它们的RDBMS。对存储过程的请求语法必须以call关键字开头。
错误消息
ODBC错误消息被结构化为多个字段以提供详细信息。 例如,错误消息可能如下所示:
Cannot execute ODBC query: [SQL_ERROR]:[42601][7][ERROR: syntax error at or near ";"; Error while executing the query]
- "
Cannot execute ODBC query" - Zabbix消息 - "
[SQL_ERROR]" - ODBC返回码 - "
[42601]" - SQL状态 - "
[7]" - 原生错误码 - "
[ERROR: syntax error at or near ";"; Error while executing the query]" - 原生错误消息
请注意错误消息长度限制为2048字节,因此
消息可能会被截断。如果存在多个ODBC诊断记录,
Zabbix会尝试在长度限制允许范围内将它们连接起来(用|分隔)。