# 15 ODBC监控

#### 概述

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

ODBC是C语言编写的中间件API，用于访问数据库管理系统(DBMS)。ODBC是由Microsoft开发的，后来被移植到了其它平台。

Zabbix可以查询任何支持ODBC的数据库。为此，Zabbix不直接连接数据库，而是使用ODBC接口和在ODBC中设置的驱动程序。该功能允许出于多种目的，更加有效地监视不同的数据库。例如，检测特定的数据库队列、使用统计信息等。Zabbix支持unixODBC，是最常用的开源ODBC
API实现之一。

#### 安装unixODBC

安装unixODBC建议的方式是使用Linux操作系统默认的软件包仓库。在最流行的Linux发行版中，unixODBC默认是包含在软件包仓库中的。如果没有，可以在unixODBC主页获取：<http://www.unixodbc.org/download.html>

使用 *yum* 软件包管理器在基于RedHat/Fedora的系统上安装unixODBC：

    shell> yum -y install unixODBC unixODBC-devel

使用 *zypper* 软件包管理器，在基于SUSE的系统上安装unixODBC：

    # zypper in unixODBC-devel

::: noteclassic
编译Zabbix以支持unixODBC功能时，需要使用到unixODBC-devel这个包。
:::

#### 安装unixODBC驱动

应该为将要被监控的数据库安装unixODBC数据库驱动。unixODBC有一个支持的数据库和驱动程序列表:[http://www.unixodbc.org/drivers.html。在一些Linux发行版中，数据库驱动程序已经包含在了软件包仓库中了。使用](http://www.unixodbc.org/drivers.html。在一些Linux发行版中，数据库驱动程序已经包含在了软件包仓库中了。使用)
*yum* 软件包管理器，在基于RedHat/Fedora的系统上安装MySQL数据库驱动：

    shell> yum install mysql-connector-odbc

使用zypper软件包管理器在基于SUSE的系统上安装MySQL数据库驱动程序：

    zypper in MyODBC-unixODBC

#### 配置unixODBC

通过编辑 **odbcinst.ini** 和 **odbc.ini**
文件来完成ODBC配置。要确认配置文件位置，请键入：

    shell> odbcinst -j

**odbcinst.ini** 用于列出已安装的ODBC数据库驱动程序：

    [mysql]
    Description = ODBC for MySQL
    Driver      = /usr/lib/libmyodbc5.so

参数详细信息：

|属性            描|<|
|---------------------|-|
|*mysql*|数据库驱动名称|
|*Description*|数据库驱动描述|
|*Driver*|数据库驱动程序库位置|

**odbc.ini** 用来定义数据源

    [test]
    Description = MySQL test database
    Driver      = mysql
    Server      = 127.0.0.1
    User        = root
    Password    =
    Port        = 3306
    Database    = zabbix

参数详细信息：

|属性            描|<|
|---------------------|-|
|*test*|数据源名称(DSN)|
|*Description*|数据源描述.|
|*Driver*|数据库驱动名称 - 在odbcinst.ini文件中指定|
|*Server*|数据库服务器的IP/DNS|
|*User*|用于数据库连接的用户名|
|*Password*|数据库用户的密码|
|*Port*|数据库连接端口|
|*Database*|数据库名称|

要验证ODBC连接是否正常运行，应测试到数据库的连接。可以使用 **isql**
程序（包含在unixODBC软件包中）：

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

#### 编译支持ODBC的Zabbix

要启用ODBC支持，Zabbix应该使用以下标志进行编译：

      --with-unixodbc[=ARG]   use odbc driver against unixODBC package

::: noteclassic
更多关于Zabbix安装信息请参考
[源代码](/manual/installation/install#from_the_sources)。
:::

#### 在Zabbix前端配置监控项

配置数据的 [监控项](/manual/config/items/item#overview)

![](../../../../../assets/en/manual/config/items/itemtypes/odbc.png)

所有标有红色星号的为必填字段。

对数据库监控，必须输入的监控项：

|   |   |
|---|---|
|*Type*|这里选择 *数据库监控器*|
|*Key*|输入 **db.odbc.select**\[unique\_description,data\_source\_name\]<br>这里唯一的描述将用于识别触发器中的监控项等<br>数据源名称 (DSN)必须按照odbc.ini中指定的方式设置。|
|*User name*|输入数据库用户名 (如果用户在odbc.ini中已指定，此项可选填)|
|*Password*|输入数据用户密码 (如果用户在odbc.ini中已指定，此项可选填)|
|*SQL query*|输入SQL查询|
|*Type of information*|了解查询返回的信息类型很重要, 以便在此处选择正确的类型。若使用不正确的 *信息类型* 监控项将不受支持。|

#### 注意事项

-   Zabbix不限制查询执行时间。 用户可以选择在合理时间内执行的查询。
-   Zabbix server的 [Timeout](/manual/appendix/config/zabbix_server)
    参数值也用作于ODBC登陆超时时间
    (请注意，根据ODBC驱动，登录超时设置可能会被忽略)。
-   查询只能返回一个值。
-   如果查询返回多个列，则只读取第一列。
-   如果查询返回多行，则只读取第一行。
-   SQL命令必须以`select`开头。
-   SQL命令不能包含任何换行符。
-   另请参阅ODBC检查的
    [已知问题](/manual/installation/known_issues#odbc_checks)

#### Error messages

#### 错误信息

ODBC错误消息被构造成字段，以提供详细信息。例如：

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

请注意，错误消息长度限制为2048字节，因此信息可以被截断。如果有多个ODBC诊断记录，只要长度限制允许，Zabbix将尝试把它们连接起来（用“|”分隔）。
