14 ODBC 監視

概要

ODBC監視は、ZabbixフロントエンドのDatabase monitorアイテムタイプに対応しています。

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.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データベースでは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=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にObject ID(OID)を含めるかどうかを指定します。
FakeOidIndex OIDに偽の一意インデックスを作成するかどうかを指定します。
RowVersioning 他のユーザーによってデータが変更された場合に、行を更新しようとしたときにアプリケーションがそれを検出できるようにするかどうかを指定します。このパラメータを有効にすると、WHERE句で全てのカラムを指定する必要がなくなるため、更新処理が高速化される場合があります。
ShowSystemTables データベースドライバがシステムテーブルをSQLTablesで通常のテーブルとして扱うかどうかを指定します。システムテーブルへのアクセス性を高めるために有用です。
Fetch ドライバがSELECTステートメントを自動的にdeclare cursor/fetchで処理し、100行のキャッシュを維持するかどうかを指定します。
BoolsAsChar Boolean型のマッピングを制御します。
「Yes」に設定すると、BoolはSQL_CHARにマッピングされ、それ以外の場合はSQL_BITにマッピングされます。
SSLmode 接続のSSLモードを指定します。
ConnSettings 接続時にバックエンドに送信される追加設定。
ODBC接続のテスト

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>として接続文字列に追加されます。
このフィールドでは特殊文字もサポートされています。
パスワードは、たとえばUID=<username>;PWD=P?;)*wordのように、ユーザー名の後に接続文字列へ追加されます。
結果の文字列をテストするには、次のコマンドを実行できます:
isql -v -k 'Driver=libmaodbc.so;Database=zabbix;UID=zabbix;PWD=P?;)*word'
SQLクエリ SQLクエリを入力します。
db.odbc.select[]の場合、クエリは1つの値のみを返す必要があることに注意してください。
情報の型 ここでクエリによって返される情報の型を選択します。
情報の型が正しく選択されていない場合、アイテムはサポート対象外になります。

重要な注意事項

  • サーバーまたはプロキシの設定で odbc poller プロセスが開始されていない場合、データベース監視アイテムはサポートされなくなります。 ODBCポーラーを有効にするには、Zabbix サーバーの設定ファイル、またはプロキシによって実行されるチェックの場合はZabbix プロキシの設定ファイルで StartODBCPollers パラメータを設定します。
  • アイテム設定フォームの 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 - 接続文字列 (ドライバー固有の引数を含めることができます)。

コメント:

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


SQLクエリの結果をJSON配列に変換します。
戻り値:JSONオブジェクト

パラメータ:

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

コメント:

  • dsnconnection stringはどちらも省略可能なパラメータですが、少なくともどちらか一方が必要です。両方が定義されている場合は、dsnは無視されます。
  • JSON形式で複数の行/列が返される場合があります。 このアイテムは、1回のシステムコールですべてのデータを収集するマスターアイテムとして使用でき、依存アイテムでは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[<unique short description>,<dsn>,<connection string>]


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

パラメータ:

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

コメント:

  • dsnconnection 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は長さ制限の範囲内でそれらを(|で区切って)連結しようとします。