14 ODBC监控

概述

ODBC 监控对应于 Zabbix 前端中的 数据库监控器 监控项类型。

ODBC 是一种用于访问数据库管理系统(DBMS)的 C 编程语言中间件 API。 ODBC 概念由 Microsoft 提出,随后被移植到其他平台。

Zabbix 可以查询任何受 ODBC 支持的数据库。 为此,Zabbix 并不直接连接到数据库,而是使用在 ODBC 中设置的 ODBC 接口和驱动程序。 这使得能够更高效地出于多种目的监控不同的数据库(例如,检查特定的数据库队列、使用统计信息等)。

Zabbix 支持 unixODBC,它是最常用的开源 ODBC API 实现之一。

另请参见:ODBC 检查的已知问题

安装 unixODBC

推荐的 unixODBC 安装方式是使用 Linux 操作系统默认的软件包仓库。 在大多数常见的 Linux 发行版中,unixODBC 默认已包含在软件包仓库中。 如果没有可用的软件包,可以从 unixODBC 主页获取源文件:http://www.unixodbc.org/download.html

要安装 unixODBC,请使用所选系统的软件包管理器:

# 对于 Ubuntu/Debian 系统:
apt install unixodbc unixodbc-dev

# 对于基于 RedHat/Fedora 的系统:
dnf install unixODBC unixODBC-devel

# 对于基于 SUSE 的系统:
zypper in unixODBC-devel

unixodbc-devunixODBC-devel 软件包是将 Zabbix 编译为支持 unixODBC 所必需的。 要启用 ODBC 支持,应使用以下配置选项编译 Zabbix:

--with-unixodbc[=ARG] # Use ODBC driver against unixODBC package.

安装 unixODBC 驱动程序

unixODBC 数据库驱动程序应该为将要监控的数据库安装。 要查看支持的数据库和驱动程序列表,请访问 unixODBC 主页:: http://www.unixodbc.org/drivers.html.

在某些 Linux 发行版中,数据库驱动程序包含在软件包库中。

MySQL

要安装 MySQL 的 unixODBC 数据库驱动程序,请使用您所选择的系统的软件包管理工具:

# 对于 Ubuntu/Debian 系统:
apt install odbc-mariadb

# 对于 RedHat/Fedora-based 系统:
dnf install mariadb-connector-odbc

# 对于 SUSE-based 系统:
zypper install mariadb-connector-odbc

如果不使用包管理器安装数据库驱动程序,请参考mysql-connector-odbcMySQL 文档 , 或 mariadb-connector-odbcMariaDB 文档

PostgreSQL

要安装 PostgreSQL 的 unixODBC 数据库驱动程序,请使用您所选择的系统的软件包管理工具:

# 对于 Ubuntu/Debian 系统:
apt install odbc-postgresql

# 对于 RedHat/Fedora-based 系统:
dnf install postgresql-odbc

# 对于 SUSE-based 系统:
zypper install psqlODBC

如果不使用包管理器安装数据库驱动程序,请参考PostgreSQL 文档.

Oracle

要安装 unixODBC 数据库驱动程序,请参考 Oracle documentation.

MSSQL

要安装 MSSQL unixODBC 数据库驱动,请使用所选系统的软件包管理器:

# 对于 Ubuntu/Debian 系统:
apt install tdsodbc

# 对于基于 RedHat/Fedora 的系统(EPEL 软件包:https://docs.fedoraproject.org/en-US/epel/):
dnf install epel-release
dnf install freetds

# 对于基于 SUSE 的系统:
zypper install libtdsodbc0

如果不使用软件包管理器安装数据库驱动,请参阅 FreeTDS 用户指南

配置 unixODBC

要对 unixODBC 进行配置,需编辑 odbcinst.iniodbc.ini 文件。 可通过执行如下命令来确认这些文件的位置:

odbcinst -j

命令的输出应该包含类似于以下内容信息:

unixODBC 2.3.9
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
odbcinst.ini

odbcinst.ini 文件列出已安装的 ODBC 数据库驱动程序。 如果缺少 odbcinst.ini 文件,则需手动创建它。

[TEST_MYSQL]
Description=ODBC for MySQL
Driver=/usr/lib/libmyodbc5.so
FileUsage=1
参数 描述
TEST_MYSQL 数据库驱动名称.
Description 数据库驱动描述.
Driver 数据库驱动库位置.
FileUsage 确定数据库驱动是否支持在没有访问本地文件支持的情况下连接到数据库服务器(0);支持从文件读取数据(1);支持将数据写入文件(2)。
Threading 线程串行化级别。PostgreSQL 支持此功能。
自 1.6 版本起,如果驱动管理器构建时包含了线程支持,您可能可以添加另一个驱动程序条目。
odbc.ini

odbc.ini 文件用于配置数据源。 请注意,支持的参数列表取决于数据库驱动程序(例如,Oracle 数据库可能使用 ServerName 而不是 Server,等等)。

[TEST_MYSQL]
Description=MySQL Test Database
Driver=mysql
Server=127.0.0.1
User=root
Password=
Port=3306
Socket=
Database=zabbix
Parameter Description
TEST_MYSQL 数据源名称(DSN)。
Description 数据源描述。
Driver 数据库驱动程序名称(如 odbcinst.ini 中所指定)。
Server 数据库服务器 IP/DNS。
User 用于连接的数据库用户。
Password 数据库用户密码。
Port 数据库连接端口。
Socket 数据库连接套接字。
Database 数据库名称。

有关其他可能的配置参数选项,请参见 MySQL documentation

PostgreSQL 的 odbc.ini 文件可能包含其他参数:

[TEST_PSQL]
Description=PostgreSQL Test Database
Driver=postgresql
Username=zbx_test
Password=zabbix
Servername=127.0.0.1
Database=zabbix
Port=5432
ReadOnly=No
Protocol=8.0+
ShowOidColumn=No
FakeOidIndex=No
RowVersioning=No
ShowSystemTables=No
Fetch=Yes
BoolsAsChar=Yes
SSLmode=Require
ConnSettings=
参数 描述
ReadOnly 指定数据库连接是否仅允许读取操作(SELECT 查询)并限制修改操作(INSERTUPDATEDELETE 语句);适用于数据应保持不变的场景。
Protocol PostgreSQL 后端协议版本(使用 SSL 连接时将被忽略)。
ShowOidColumn 指定是否在 SQLColumns 中包含对象 ID(OID)。
FakeOidIndex 指定是否在 OID 上创建一个伪唯一索引。
RowVersioning 指定是否启用应用程序在尝试更新某一行时检测数据是否已被其他用户修改。请注意,此参数可以加快更新过程,因为更新一行时,不需要在 WHERE 子句中指定每一个列。
ShowSystemTables 指定数据库驱动程序是否应在 SQLTables 中将系统表视为常规表;这有助于提高可访问性,使系统表可见。
Fetch 指定驱动程序是否应自动使用 declare cursor/fetch 来处理 SELECT 语句并维护一个包含 100 行的缓存。
BoolsAsChar 控制布尔类型的映射。
如果设置为 “Yes”,布尔值将映射为 SQL_CHAR;否则将映射为 SQL_BIT
SSLmode 指定连接的 SSL 模式。
ConnSettings 连接时发送到后端的其他设置。

要检验 ODBC 连接是否成功建立,您可以使用 isql 工具(包含在 unixODBC 软件包内):

isql test
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

在 Zabbix 前端中配置监控项

配置一个 数据库监控 监控项

所有必填输入字段都以红色星号标记。

对于数据库监控监控项,您必须指定:

Type 在此选择“Database monitor”。
Key 输入以下受支持的监控项键之一:
db.odbc.select[] - 此监控项返回一个值(SQL 查询结果第一行第一列的值);
db.odbc.get[] - 此监控项以 JSON 格式返回多行/多列;
db.odbc.discovery[] - 此监控项返回低级别发现数据。
User name 输入数据库用户名(最多 255 个字符)。
如果数据库用户名已在 odbc.ini 文件中指定,则此参数为可选。
如果使用连接字符串,且 User name 字段不为空,则会将其作为 UID=<user> 追加到连接字符串中。
Password 输入数据库用户密码(最多 255 个字符)。
如果密码已在 odbc.ini 文件中指定,则此参数为可选。
如果使用连接字符串,且 Password 字段不为空,则会将其作为 PWD=<password> 追加到连接字符串中。
此字段支持特殊字符。
密码将追加在用户名之后,例如 UID=<username>;PWD=P?;)*word
要测试生成的字符串,您可以运行以下命令:
isql -v -k 'Driver=libmaodbc.so;Database=zabbix;UID=zabbix;PWD=P?;)*word'
SQL query 输入 SQL 查询。
请注意,对于 db.odbc.select[],查询必须只返回一个值。
Type of information 在此选择查询将返回的信息类型。
如果信息类型选择不正确,该监控项将变为不受支持。

注意事项

  • 如果server 或 proxy 配置中没有启动任何 ODBC 轮询进程,数据库监控项将变为不支持。 要启动 ODBC 轮询进程,需设置 StartODBCPollers 参数,请在 Zabbixserver 配置文件中或对于由proxy监控,在 Zabbix proxyproxy 配置文件中进行设置。
  • 超时参数值在 监控项配置 中被用作 ODBC 登录的超时时间以及查询执行的超时时间。 请注意,如果安装的 ODBC 驱动程序不支持这些超时设置,那么这些设置可能会被忽略。
  • SQL 命令必须返回一个结果集,就像使用 select 语句的任何查询一样。 查询的语法将取决于将处理它们的 RDBMS(关系数据库管理系统)。 向存储过程发出的请求的语法必须以 call 关键字开始。

监控项键值详细信息

不带尖角括号的参数必填项。用尖角括号 < > 标记的参数是可选的。

db.odbc.select[<唯一简短描述>,<配置dsn>,<连接字符串>]


返回一个值,即 SQL 查询结果中第一行的第一列。
返回值:根据 SQL 查询而定。

参数:

  • unique short description -一个唯一简短的描述来标识监控项(用于触发器等);
  • dsn - 数据源名称(如在 odbc.ini 中指定的);
  • connection string - 连接字符串(可能包含特定于驱动程序的参数)。

注释:

  • dsn will be ignored.尽管 dsnconnection string是可选参数,但至少需要其中一个;如果两个都被定义了,dsn 将被忽略。
  • 如果查询返回多个列,只有第一列会被读取。如果查询返回多行,只有第一行会被读取。
db.odbc.get[<唯一简短描述>,<配置dsn>,<连接字符串>]


将 SQL 查询结果转换成 JSON 格式的数组。
返回值:JSON object

参数:

  • unique short description - 一个唯一简短的描述来标识监控项(用于触发器等)
  • dsn -数据源名称(如在 odbc.ini 文件中指定的)。
  • connection string - 连接字符串(可能包含特定于驱动程序的参数)。

注释:

  • 尽管 dsnconnection string 是可选参数,但至少需要其中一个;如果两个都被定义了,dsn 将被忽略。
  • 可以返回多行/列的 JSON 格式数据。 此监控项可以用作主监控项,在一次系统调用中收集所有数据,同时可以在依赖监控项中使用 JSONPath 预处理来提取单个值。 关于更多信息,参见 示例 用于低级发现的返回格式。

示例:

# MySQL ODBC 驱动程序 5 的连接配置:
db.odbc.get[MySQL example,,"Driver=/usr/local/lib/libmyodbc5a.so;Database=master;Server=127.0.0.1;Port=3306"]
db.odbc.discovery[<唯一简短描述>,<配置dsn>,<连接字符串>]


将 SQL 查询结果转换为 JSON 数组,用于 低级别自动发现. 查询结果中的列名被转换为与发现字段值配对的低级发现宏名称。 这些宏可以在创建监控项、触发器等原型时使用。
返回值:JSON object

参数:

  • unique short description - 一个唯一简短的描述来标识监控项(用于触发器等)。
  • dsn - 数据源名称(如在 odbc.ini 文件中指定的)。
  • connection string - 连接字符串(可能包含特定于驱动程序的参数)。

注释:

  • 尽管 dsnconnection string 是可选参数,但至少需要其中一个;如果两个都被定义了,dsn 将被忽略。

错误消息

ODBC 错误消息按字段组织,以提供详细信息。 例如,一条错误消息可能如下所示:

无法执行 ODBC 查询:[SQL_ERROR]:[42601][7][ERROR: syntax error error at or near ";"; Error while executing the query]
  • "无法执行 ODBC 查询" - Zabbix 消息
  • "[SQL_ERROR]" - ODBC 返回代码
  • "[42601]" - SQLState
  • "[7]" - 本地错误代码
  • "[ERROR: syntax error at or near ";"; Error while executing the query]" - 本地错误消息

请注意,错误消息长度限制为 2048 字节,因此消息可能会被截断。 如果存在多条 ODBC 诊断记录,Zabbix 会尝试将它们连接起来(使用 | 分隔),直到达到长度限制为止。