8 データベースモニター

概要

ZabbixのWebインターフェースにある Database monitor アイテムタイプは、ODBC監視(ODBCチェック)に使用されます。

ODBCは、データベース管理システム(DBMS)にアクセスするためのCプログラミング言語向けミドルウェアAPIです。 ODBCの概念はMicrosoftによって開発され、その後ほかのプラットフォームにも移植されました。

Zabbixは、ODBCでサポートされている任意のデータベースを問い合わせることができます。 そのために、Zabbixはデータベースへ直接接続するのではなく、ODBCで設定されたODBCインターフェースとドライバーを使用します。 これにより、複数の目的(たとえば、特定のデータベースキューの確認、使用統計の取得など)に対して、さまざまなデータベースをより効率的に監視できます。

Zabbixは、最も広く使用されているオープンソースのODBC API実装の1つである unixODBC をサポートしています。

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-dev または unixODBC-devel パッケージは、unixODBCサポート付きでZabbixをコンパイルするために必要です。
ODBCサポートを有効にするには、Zabbixを次の設定オプション付きでコンパイルする必要があります:

--with-unixodbc[=ARG] # unixODBCパッケージに対してODBCドライバーを使用します。

unixODBCドライバーのインストール

監視対象のデータベースに対してunixODBCデータベースドライバーをインストールする必要があります。 サポートされているデータベースとドライバーの一覧については、unixODBCのホームページを参照してください: http://www.unixodbc.org/drivers.html。

一部のLinuxディストリビューションでは、データベースドライバーがパッケージリポジトリに含まれています。

MySQL

MySQL unixODBCデータベースドライバをインストールするには、お使いのシステムに応じたパッケージマネージャを使用してください:

# Ubuntu/Debian システムの場合:
apt install odbc-mariadb

# RedHat/Fedoraベースのシステムの場合:
dnf install mariadb-connector-odbc

# SUSEベースのシステムの場合:
zypper install mariadb-connector-odbc

パッケージマネージャを使用せずにデータベースドライバをインストールするには、mysql-connector-odbcについてはMySQLドキュメント、mariadb-connector-odbcについてはMariaDBドキュメントを参照してください。

PostgreSQL

PostgreSQL unixODBC データベースドライバーをインストールするには、お使いのシステムのパッケージマネージャーを使用します:

# Ubuntu/Debian システムの場合:
apt install odbc-postgresql

# RedHat/Fedora ベースのシステムの場合:
dnf install postgresql-odbc

# SUSE ベースのシステムの場合:
zypper install psqlODBC

パッケージマネージャーを使用せずにデータベースドライバーをインストールするには、PostgreSQL ドキュメントを参照してください。

Oracle

unixODBCデータベースドライバーのインストールについては、Oracleドキュメントを参照してください。

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.iniとodbc.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データベースではServerの代わりにServerNameを使用する場合があります)。

[TEST_MYSQL]
Description=MySQL Test Database
Driver=mysql
Server=127.0.0.1
User=root
Password=
Port=3306
Socket=
Database=zabbix
パラメータ 説明
TEST_MYSQL データソース名(DSN)。
Description データソースの説明。
Driver データベースドライバ名(odbcinst.iniで指定されたもの)。
Server データベースサーバのIP/DNS。
User 接続用のデータベースユーザー。
Password データベースユーザーのパスワード。
Port データベース接続ポート。
Socket データベース接続ソケット。
Database データベース名。

その他の設定パラメータのオプションについては、MySQLドキュメントを参照してください。

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=7.4+
ShowOidColumn=No
FakeOidIndex=No
RowVersioning=No
ShowSystemTables=No
Fetch=Yes
BoolsAsChar=Yes
SSLmode=Require
ConnSettings=
Parameter Description
ReadOnly データベース接続で読み取り操作(SELECT クエリ)のみを許可し、変更操作(INSERT、UPDATE、DELETE ステートメント)を制限するかどうかを指定します。データを変更したくない場合に便利です。
Protocol PostgreSQL バックエンドのプロトコルバージョンです(SSL 接続を使用する場合は無視されます)。
ShowOidColumn SQLColumns に Object ID (OID) を含めるかどうかを指定します。
FakeOidIndex OID に対して偽の一意インデックスを作成するかどうかを指定します。
RowVersioning 行を更新しようとしている間に、他のユーザーによってデータが変更されたかどうかをアプリケーションが検出できるようにするかどうかを指定します。このパラメータにより、行を更新する際に WHERE 句で各列をすべて指定する必要がなくなるため、更新処理を高速化できる場合があります。
ShowSystemTables データベースドライバが SQLTables でシステムテーブルを通常のテーブルとして扱うかどうかを指定します。アクセシビリティ向上のため、システムテーブルを表示できるようにする場合に便利です。
Fetch ドライバが SELECT ステートメントを処理するために declare cursor/fetch を自動的に使用し、100 行のキャッシュを維持するかどうかを指定します。
BoolsAsChar Boolean 型のマッピングを制御します。
「Yes」に設定すると、Bools は SQL_CHAR にマッピングされ、それ以外の場合は SQL_BIT にマッピングされます。
SSLmode 接続の SSL モードを指定します。
ConnSettings 接続時にバックエンドへ送信される追加設定です。
ODBC接続のテスト

ODBC接続が正常に動作しているかどうかをテストするには、isqlユーティリティ(unixODBCパッケージに含まれています)を使用できます。

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

Zabbix Webインターフェースでのアイテム設定

Database monitoring アイテムを設定します。

必須の入力フィールドには赤いアスタリスクが付いています。

データベース監視アイテムでは、次の項目を指定する必要があります。

Type ここで「Database monitor」を選択します。
Key サポートされているアイテムキーのいずれかを入力します:
db.odbc.select[] - このアイテムは1つの値を返します(SQLクエリ結果の最初の行の最初の列);
db.odbc.get[] - このアイテムはJSON形式で複数の行/列を返します;
db.odbc.discovery[] - このアイテムは low-level discovery データを返します。
User name データベースのユーザー名を入力します(最大255文字)。
このパラメータは、データベースのユーザー名が odbc.ini ファイルで指定されている場合は省略できます。
接続文字列を使用し、User name フィールドが空でない場合は、UID=<user> として接続文字列に追加されます。
Password データベースのユーザーパスワードを入力します(最大255文字)。
このパラメータは、パスワードが odbc.ini ファイルで指定されている場合は省略できます。
接続文字列を使用し、Password フィールドが空でない場合は、PWD=<password> として接続文字列に追加されます。
このフィールドでは特殊文字を使用できます。Oracle以外のすべてのデータベースでは、% を含むパスワードは波括弧 {} で囲む必要があります。
パスワードは、たとえば UID=<username>;PWD=P?;)*word のように、ユーザー名の後に接続文字列へ追加されます。
生成された文字列をテストするには、次のコマンドを実行できます:
isql -v -k 'Driver=libmaodbc.so;Database=zabbix;UID=zabbix;PWD=P?;)*word'
SQL query SQLクエリを入力します。
db.odbc.select[] では、クエリは1つの値のみを返す必要があることに注意してください。
Type of information ここで、クエリによって返される情報の種類を選択します。
情報の種類を誤って選択すると、アイテムはサポート対象外になります。

重要な注意事項

  • データベース監視アイテムは、サーバーまたはプロキシの設定で odbc poller プロセスが起動されていない場合、サポート対象外になります。 ODBC poller を有効にするには、Zabbix サーバー 設定ファイルで StartODBCPollers パラメータを設定するか、プロキシによるチェックの場合は Zabbix プロキシ 設定ファイルで設定します。
  • アイテム設定 フォームの Timeout パラメータ値は、ODBC のログインタイムアウトおよびクエリ実行タイムアウトとして使用されます。 インストールされている ODBC ドライバーがこれらをサポートしていない場合、これらのタイムアウト設定は無視されることがあります。
  • SQL コマンドは、select ステートメントを使用する任意のクエリと同様に、結果セットを返す必要があります。 クエリ構文は、それらを処理する RDBMS に依存します。 ストレージプロシージャへの要求の構文は、call キーワードで始める必要があります。

アイテムキーの詳細

山括弧のないパラメータは必須です。山括弧 < > で囲まれたパラメータはオプションです。

db.odbc.select[<unique short description>,<dsn>,<connection string>]


SQLクエリ結果の最初の行の最初の列、つまり1つの値を返します。
戻り値: SQLクエリに依存します。

パラメータ:

  • unique short description - アイテムを識別するための一意の短い説明 (トリガーなどで使用);
  • dsn - データソース名 (odbc.iniで指定されたもの);
  • connection string - 接続文字列 (ドライバー固有の引数を含めることができます)。

コメント:

  • dsnとconnection stringは省略可能なパラメータですが、少なくともどちらか一方は必須です。両方が定義されている場合は、dsnは無視されます。
  • クエリが複数の列を返す場合、最初の列のみが読み取られます。クエリが複数の行を返す場合、最初の行のみが読み取られます。
db.odbc.get[<unique short description>,<dsn>,<connection string>]


SQLクエリの結果をJSON配列に変換します。
戻り値: JSON object。

パラメータ:

  • unique short description - アイテムを識別するための一意の短い説明(トリガーなどで使用);
  • dsn - データソース名(odbc.ini で指定);
  • connection string - 接続文字列(ドライバー固有の引数を含めることができます)。

コメント:

  • dsn と connection string はどちらも省略可能なパラメータですが、少なくともどちらか一方は必須です。両方が定義されている場合、dsn は無視されます。
  • JSON形式で複数の行/列を返すことができます。 このアイテムは、1回のシステムコールですべてのデータを収集するマスターアイテムとして使用できます。また、依存アイテムではJSONPath前処理を使用して個々の値を抽出できます。 返される形式の詳細については、低レベルディスカバリで使用される例を参照してください。

例:

# MySQL ODBC driver 5 の接続:
db.odbc.get[MySQL example,,"Driver=/usr/local/lib/libmyodbc5a.so;Database=master;Server=127.0.0.1;Port=3306"]
db.odbc.discovery[<unique short description>,<dsn>,<connection string>]


SQLクエリの結果をJSON配列に変換し、ローレベルディスカバリで使用します。 クエリ結果のカラム名は、ディスカバリされたフィールド値とペアになったローレベルディスカバリマクロ名に変換されます。 これらのマクロは、アイテム、トリガーなどのプロトタイプ作成時に使用できます。
戻り値: JSONオブジェクト。

パラメータ:

  • unique short description - アイテムを識別するための一意の短い説明(トリガーなどで使用);
  • dsn - データソース名(odbc.iniで指定);
  • connection string - 接続文字列(ドライバ固有の引数を含めることができます)。

コメント:

  • dsnとconnection stringはどちらも省略可能なパラメータですが、少なくともどちらか一方は必須です。両方が定義されている場合は、dsnは無視されます。

エラーメッセージ

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]" - SQLState
  • "[7]" - ネイティブエラーコード
  • "[ERROR: syntax error at or near ";"; Error while executing the query]" - ネイティブエラーメッセージ

エラーメッセージの長さは2048バイトに制限されているため、メッセージが切り捨てられる場合があることに注意してください。 ODBC診断レコードが複数ある場合、Zabbixは長さ制限の範囲内でそれらを(|で区切って)連結しようとします。