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,请使用所选择的系统的软件包管理工具:

  1. # 对于 Ubuntu/Debian 系统:
  2. apt install unixodbc unixodbc-dev
  3. # 对于 RedHat/Fedora-based 系统:
  4. dnf install unixODBC unixODBC-devel
  5. # 对于 SUSE-based 系统:
  6. 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 应用如下配置选项进行编译:

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

安装 unixODBC 驱动程序

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

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

MySQL

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

  1. # 对于 Ubuntu/Debian 系统:
  2. apt install odbc-mariadb
  3. # 对于 RedHat/Fedora-based 系统:
  4. dnf install mariadb-connector-odbc
  5. # 对于 SUSE-based 系统:
  6. zypper install mariadb-connector-odbc

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

PostgreSQL

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

  1. # 对于 Ubuntu/Debian 系统:
  2. apt install odbc-postgresql
  3. # 对于 RedHat/Fedora-based 系统:
  4. dnf install postgresql-odbc
  5. # 对于 SUSE-based 系统:
  6. zypper install psqlODBC

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

Oracle

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

MSSQL

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

  1. # 对于 Ubuntu/Debian 系统:
  2. apt install tdsodbc
  3. # 对于 RedHat/Fedora-based 系统 (EPEL 包: https://docs.fedoraproject.org/en-US/epel/):
  4. dnf install epel-release
  5. dnf install freetds
  6. # 对 SUSE-based 系统:
  7. zypper install libtdsodbc0

如果不使用包管理器安装数据库驱动程序,请参考 FreeTDS 用户指南.

配置 unixODBC

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

  1. odbcinst -j

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

  1. unixODBC 2.3.9
  2. DRIVERS............: /etc/odbcinst.ini
  3. SYSTEM DATA SOURCES: /etc/odbc.ini
  4. FILE DATA SOURCES..: /etc/ODBCDataSources
odbcinst.ini

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

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

odbc.ini 文件用于配置数据源。

  1. [TEST_MYSQL]
  2. Description=MySQL Test Database
  3. Driver=mysql
  4. Server=127.0.0.1
  5. User=root
  6. Password=
  7. Port=3306
  8. Socket=
  9. Database=zabbix
参数描述
TEST_MYSQL数据源名称(DSN)。
Description数据源描述。
Driver数据库驱动程序名称(如在 odbcinst.ini 文件中所指定)。
Server数据库服务器 IP/DNS。
User用于连接数据库的用户。
Password用于连接数据库的密码。
Port用于连接数据库的端口。
Socket用于连接数据库的socket。
Database数据库名称。

对于其他可能的配置参数选项,请参考 MySQL documentation.

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

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

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

  1. isql test
  2. +---------------------------------------+
  3. | Connected! |
  4. | |
  5. | sql-statement |
  6. | help [tablename] |
  7. | quit |
  8. | |
  9. +---------------------------------------+

Zabbix 前端的监控项配置

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

14 ODBC监控 - 图1

标红色星号字段为必填项。

对于数据库监控项,需指定如下:

类型在这里选择 “数据库监控”。
键值输入一个受支持的监控项key:
db.odbc.select[] - 这个监控项返回一个值(SQL 查询结果中的第一行第一列的数据);
db.odbc.get[] - 这个监控项以 JSON 格式返回多个行或多个列的数据;
db.odbc.discovery[] - 此监控项返回低级发现数据。
User name输入数据库用户名(最多255个字符)。
如果在 odbc.ini 文件中已指定数据库用户名,则此参数是可选的。
如果使用了连接字符串,并且“用户名”字段不为空,则它将作为 UID=<user> 添加到连接字符串中。
Password输入数据库用户的密码(最多255个字符)。
如果在 odbc.ini 文件中已指定密码,则此参数是可选的。
如果使用了连接字符串,并且“密码”字段非空,那么它会被附加到连接字符串中,格式为 PWD=<密码>
如果密码中包含分号,应该使用大括号将其括起来,例如:{P?;)word}
密码将在用户名之后追加到连接字符串中,格式为 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在这里选择查询将返回的信息类型。
如果选择的信息类型不正确,该监控项将显示不支持。

监控项键值详细信息

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

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 预处理来提取单个值。 关于更多信息,参见 示例 用于低级发现的返回格式。

示例:

  1. # MySQL ODBC 驱动程序 5 的连接配置:
  2. 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 将被忽略。

注意事项

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

错误信息

ODBC 错误信息被划分为不同的字段,以便提供详尽的信息。例如:

  1. Cannot execute ODBC query: [SQL_ERROR]:[42601][7][ERROR: syntax error at or near ";"; Error while executing the query]
  2. └───────────┬───────────┘ └────┬────┘ └──┬──┘└┬┘└─────────────────────────────┬─────────────────────────────────────┘
  3. └─ Native error code └─ Native error message
  4. └─ SQLState
  5. └─ Zabbix message └─ ODBC return code

请注意,错误信息的长度被限制在 2048 字节以内,所以信息可能会被截断。 如果存在多条 ODBC 诊断记录,Zabbix 会尽量在长度限制范围内将它们拼接起来(各记录之间用 | 符号分隔)。