14 ODBC监控

概述

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

ODBC 是一种用于访问数据库管理系统(DBMS)的 C 语言中间件应用程序接口。 ODBC 的概念最初由微软公司开发,后来被移植到其他平台。

Zabbix may query any database, which is supported by ODBC. To do that, Zabbix does not directly connect to the databases, but uses the ODBC interface and drivers set up in ODBC. This allows for more efficient monitoring of different databases for multiple purposes (for example, checking specific database queues, usage statistics, etc.).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-based 系统:
       dnf install unixODBC unixODBC-devel
       
       # 对于 SUSE-based 系统:
       zypper in unixODBC-devel

The unixodbc-dev or unixODBC-devel package is necessary to compile Zabbix with unixODBC support. To enable ODBC support, Zabbix should be compiled with the following unixodbc-devunixODBC-devel 包是编译支持 unixODBC 的 Zabbix 所必需的。 要启用 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

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

# 对于 Ubuntu/Debian 系统:
       apt install tdsodbc
       
       # 对于 RedHat/Fedora-based 系统 (EPEL 包: https://docs.fedoraproject.org/en-US/epel/):
       dnf install epel-release
       dnf install freetds
       
       # 对 SUSE-based 系统:
       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 测试数据库
       Driver=mysql
       Server=127.0.0.1
       User=root
       Password=
       Port=3306
       Socket=
       Database=zabbix
Parameter 描述
TEST_MYSQL 数据源名称 (DSN)。
Description 数据源描述。
Driver 数据库驱动程序名称(如在 odbcinst.ini 中指定)。
Server 数据库服务器 IP/DNS。
User 用于连接的数据库用户。
Password 数据库用户密码。
Port 数据库连接端口。
Socket 数据库连接套接字。
Database 数据库名称。

对于其他可能的配置参数选项,请参阅 MySQL 文档

odbc.ini 文件在用于 PostgreSQL 时可能包含一些额外的参数:

[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=7.4+
       ShowOidColumn=No
       FakeOidIndex=No
       RowVersioning=No
       ShowSystemTables=No
       Fetch=Yes
       BoolsAsChar=Yes
       SSLmode=Require
       ConnSettings=
参数 描述
ReadOnly 指定数据库连接是否只允许进行读操作(SELECT 查询),并限制进行修改操作(INSERTUPDATEDELETE 语句);这在需要保持数据不变的情况下非常有用。
Protocol PostgreSQL 后端通信协议的版本号(当使用 SSL 连接时,此设置会被忽略)。
ShowOidColumn 指定是否在 SQLColumns 中包含对象标识符(OID)。
FakeOidIndex 指定是否在对象标识符(OID)上创建一个假的(模拟的)唯一索引。
RowVersioning 指定是否允许应用程序检测当您尝试更新一行数据时,该数据是否已被其他用户修改。请注意,这个参数可以加快更新过程,因为更新一行数据时,不需要在 WHERE 子句中指定每一个单独的列。
ShowSystemTables 指定数据库驱动程序是否应在 SQLTables 中将系统表视为普通表;这对于可访问性很有用,因为它允许查看系统表。
Fetch 指定驱动程序是否应该自动使用声明游标/获取的方式来处理 SELECT 语句,并维持一个包含 100 行的缓存。
BoolsAsChar 控制布尔类型如何被映射。
如果设置为“是”,则布尔值会被映射到 SQL_CHAR 类型;如果不是,则会被映射到 SQL_BIT 类型。
SSLmode 指定连接使用的 SSL 安全模式。
ConnSettings 在连接时发送给后端的附加设置。

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

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

在Zabbix前端配置监控项

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

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

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

类型 在此处选择“数据库监控”。
输入支持的监控项键之一:
db.odbc.select[] - 此监控项返回一个值(SQL查询结果的第一行的第一列);
db.odbc.get[] - 此监控项以JSON格式返回多行/列;
db.odbc.discovery[] - 此监控项返回低级别发现数据。
用户名 输入数据库用户名(最多255个字符)。
如果在odbc.ini文件中指定了数据库用户名,则此参数是可选的。
如果使用连接字符串,并且用户名字段不为空,则将其附加到连接字符串中作为UID=<user>
密码 输入数据库用户密码(最多255个字符)。
如果在odbc.ini文件中指定了密码,则此参数是可选的。
如果使用连接字符串,并且密码字段不为空,则将其附加到连接字符串中作为PWD=<password>
从Zabbix 7.0.3开始,此字段支持特殊字符。

在Zabbix 7.0.3之前,如果密码包含分号,应将其用大括号包裹,例如,{P?;)*word}。在7.0.3之后,即使在这种情况下仍然支持包裹密码,但不是必需的。密码将附加到连接字符串中用户名之后作为UID=<username>;PWD={P?;)*word}。要测试生成的字符串,可以运行以下命令:
isql -v -k 'Driver=libmaodbc.so;Database=zabbix;UID=zabbix;PWD={P?;)*word}'
SQL查询 输入SQL查询。
请注意,使用db.odbc.select[]时,查询必须仅返回一个值。
信息类型 在此处选择查询将返回的信息类型。
如果信息类型选择不正确,监控项将变为不受支持。

注意事项

  • 如果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: 语法错误在或接近 ";";执行查询时出错]
  • "无法执行 ODBC 查询" - Zabbix 消息
  • "[SQL_ERROR]" - ODBC 返回代码
  • "[42601]" - SQLState
  • "[7]" - 本地错误代码
  • "[ERROR: 语法错误在或接近 ";";执行查询时出错]" - 本地错误消息

请注意,错误消息长度限制为 2048 字节,因此消息可能会被截断。 如果有多个 ODBC 诊断记录,Zabbix 将尝试在长度限制允许的情况下将它们连接(使用 | 分隔)。