ODBCを使ったMySQL接続ができない

MySQLサーバへODBCで接続を行い、レプリケーションの状態をチェックするアイテムを作成しようとしていますが、想定通りの動きを見せないのでご助力願います。

環境は下記のとおりです。

【Zabbix_server】
[OS]
CentOS6.6
[ODBC]
unixODBC-devel-2.2.14-14.el6.x86_64
mysql-connector-odbc-5.3.4-1.el6.x86_64
unixODBC-2.2.14-14.el6.x86_64
[IP]
192.168.56.11

【MySQL Server】
[OS]
CentOS6.6
[DB]
mysql5.6.26
[IP]
192.168.56.12

【Zabbixサーバ側の設定】

/etc/odbcinst.ini
--------------------------------------------------------
[MySQL]
Description = ODBC for MySQL
Driver64 = /usr/lib64/libmyodbc5w.so
Setup64 = /usr/lib64/libodbcmyS.so
FileUsage = 1

[MySQL ODBC 5.3 Unicode Driver]
Driver = /usr/lib64/libmyodbc5w.so
UsageCount = 1

[MySQL ODBC 5.3 ANSI Driver]
Driver = /usr/lib64/libmyodbc5a.so
UsageCount = 1
--------------------------------------------------------

odbc.ini
--------------------------------------------------------
[slave_check]
Description = MySQLDatabase
Driver = MySQL ODBC 5.3 Unicode Driver
Server = 192.168.56.12
Port = 3306
User = repl
Password = pass
--------------------------------------------------------

isql -v slave_checkの結果は下記の通りで正常に繋がります。
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>

また、このときSQLサーバのログには下記の通りアクセスが記録されます。

22 Connect repl@192.168.56.11 on
22 Query SET NAMES utf8
22 Query SET character_set_results = NULL
22 Query SET SQL_AUTO_IS_NULL = 0

Zabbixサーバでは下記起動ログよりODBCは有効になっている認識です。
****** Enabled features ******
SNMP monitoring: YES
IPMI monitoring: YES
WEB monitoring: YES
VMware monitoring: YES
Jabber notifications: YES
Ez Texting notifications: YES
ODBC: YES
SSH2 support: YES
IPv6 support: YES
******************************

Webインターフェースでのアイテムの設定内容
[名前]
odbc_test
[タイプ]
データベースモニタ
[キー]
db.odbc.select[testcheck,slave_check]
[ユーザ名]
空欄(odbc.iniに記載しているため)
[パスワード]
空欄(odbc.iniに記載しているため)
[SQLクエリ]
SHOW SLAVE STATUS
[データ型]
テキスト
残りの設定はデフォルト

上記で設定してます。

しかし、Zabbixでは上記設定をしてもいつまでたっても情報が取得できません。
SQLクエリがおかしいことを疑いましたが、そもそもMySQLサーバ側のアクセスログに
"Connect repl@192.168.56.11 on"というログが出てきません。
そのため、クエリ実行以前の問題と考えています。

アイテムのステータスは有効になっておりエラーとなっていません。
また、Zabbixサーバログにも何も情報が出てきません。
そのため、解決の糸口が見つけられずにいます。

上記解決への情報や解析方法など些細なことでもいいので情報をお持ちの方がいましたらご教示願います。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー tomopa2 の写真

zabbix serverのバージョンが分からないのですが、

https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtype...

15 ODBC監視 - 15.7 重要事項
・ SQLコマンドは、selectから始まる必要があります。

とありますので、showが受付けてもらえないのではないでしょうか。

わたしの環境のzabbix serverも起動時のODBCは YESになっていました。
とくにODBCを使ってはいないのですが・・・

ありがとうございます。
肝心のZabbixサーバのバージョン記載忘れました。Zabbix2.4.6です。

SQL文はテストで"select version()"に変更してZabbixサーバを再起動したところ、
接続先のMySQLサーバ側で下記ログが記録されました。

Connect repl@192.168.56.11 on
Query SET NAMES utf8
Query SET character_set_results = NULL
Query SET SQL_AUTO_IS_NULL = 0

接続はできているようですが、SQL文は実行されていないようです。

ただ、初めのSQL文"show slave status"ですが、
この時もZabbixサーバを再起動すると"select version()"と同じでMySQLサーバ側に
Connect repl@192.168.56.11 on
Query SET NAMES utf8
Query SET character_set_results = NULL
Query SET SQL_AUTO_IS_NULL = 0
が記録されました。

当初接続自体ないと記載しましたが、Zabbixサーバを再起動すると初回のみ接続されるようです。
Zabbixのアイテム設定では更新間隔は30秒になっていますが、30秒たってもConnectは記録されません。
(Quitが記録されていないので接続状態のまま?そのため30秒たっても次のチェックが走らないのでしょうか)

ユーザー tomopa2 の写真

すごく単純ですが、SQL文の最後が「;」セミコロン抜けているとか
そんなことはないですかね?
わたしもよく忘れるので。

SQLはあまり詳しくはないのですが、ODBCで接続したときは「;」セミコロン不要の認識でした。
実際isqlで接続して"select version()"を実行した際は結果が返ってきます。
isqlで接続して"select version();"を実行した際と同じ結果でした。

念のため、Zabbixのアイテム欄のSQL文にセミコロンつけましたが、結果は変わらずでした。

なお、isqlで接続して"select version()"を実行してquitした際のMySQLのログは下記の通りです

Connect repl@192.168.56.11 on
Query SET NAMES utf8
Query SET character_set_results = NULL
Query SET SQL_AUTO_IS_NULL = 0
Query set @@sql_select_limit=DEFAULT
Query select version()
Quit

"Query SET SQL_AUTO_IS_NULL = 0"までは同じなのでZabbixがSQL文をなぜか投げてくれていないように見えます。

ユーザー TNK の写真

CentOS 6標準の構成で試してみましたが正常に値を取得できていま
す。

主なパッケージ
 unixODBC-2.2.14-14.el6
 mysql-connector-odbc-5.1.5r1144-7.el6
 Zabbix 2.4.6

アイテム
 タイプ : データベースモニタ
 キー  : db.odbc.select[aaodbc,mytest]
 ユーザ名: アクセス用アカウント
 パスワード: アクセス用パスワード
 SQLクエリ: select version()
 データ型: 文字列
 更新間隔: 30秒

Zabbixサーバのログに何か出力されていませんか?

ありがとうございます。
Zabbixのサーバログには特に何も出てきていないです。
なので困っています。

もしよかったらodbcinst.iniとodbc.iniを見せていただけないでしょうか?

ユーザー TNK の写真

以下の通りです。

odbcinst.iniの方は、デフォルトで設定されているもので、
PostgreSQLとMySQLの両方の設定がされていたのですが
MySQLの部分だけ抜粋しました。

odbcinst.ini
-----
# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc5.so
Setup = /usr/lib/libodbcmyS.so
Driver64 = /usr/lib64/libmyodbc5.so
Setup64 = /usr/lib64/libodbcmyS.so
FileUsage = 1
-----

odbc.ini
-----
[mytest]
Driver = MySQL
Server = localhost
Database = zabbix
Port = 3306
-----

ありがとうございます。

単純化のため、odbc.iniのserver = 127.0.0.1、ユーザをrootでローカルのMySQLに対して実行していましたが、結果は変わらずでした。
Connect root@localhost on
Query SET NAMES utf8
Query SET character_set_results = NULL
Query SET SQL_AUTO_IS_NULL = 0

なお、前から引っかかっていたのですが
使用しているドライバーが当方では
UNICODE版がlibmyodbc5w.so、
ANSI版がlibmyodbc5a.so
となっています。
(odbc.iniでUNICODE,ANSI両方とも試しましたが駄目でした)

マニュアルの記載やTNKさんが使われているドライバーは
Driver64 = /usr/lib64/libmyodbc5.so
と思うのですが、これが怪しいのではないかと考えています。
libmyodbc5.soはどのように入手すればいいのでしょうか。

yum -y install unixODBC unixODBC-devel
でODBCドライバーを入れたのですが、このコマンドで/usr/lib64/libmyodbc5.soがインストールされません。

念のため、
yum -y reinstall unixODBC unixODBC-devel
を実行しましたが、/usr/lib64/libmyodbc5.soが入りませんでした。

ユーザー TNK の写真

yum -y install unixODBC unixODBC-devel

ではインストールされません。
先ほども主要なパッケージとして書かせて頂いた、

 mysql-connector-odbc

 # yum install mysql-connector-odbc

とインストールすることで、x86_64環境であれば、

 /usr/lib64/libmyodbc5-5.1.5.so
 /usr/lib64/libmyodbc5.so

などがインストールされます。

しかし、onigirimogumoguさんの環境では、

 mysql-connector-odbc-5.3.4-1.el6.x86_64

をインストールされているようですので、このパッケージと競合し
てインストールできないと思います。
恐らく、MySQL自体もOS標準ではなくより新しいバージョンを利用
されているのであれば、それらとの組み合わせもあるので、強制的
にOS標準のものをインストールすることはお勧めできません。

あと、アクセスするアカウントとパスワードは、アイテムの方に設
定するように変えてみてはいかがでしょうか?
isqlコマンドで確認される際、rootユーザで実行していたりすると
一般ユーザでアクセスする場合とは動きが違うようです。

----- 追記 -----
最後のアカウントの件は関係ないかもしれません。
odbc.iniに書く場合とアイテムにアカウント情報に書く場合とをやって
みましたが、私の環境ではどちらでも正常に値を取得できています。

ありがとうございます。

yum install mysql-connector-odbc
の実行の結果、mysql-connector-odbc.x86_64 0:5.3.4-1.el6
がインストールされていました。

アクセスID/PWはodbc.iniではなくアイテムに記載して実行しましたが、状況は変わらずです。
Zabbixサーバのログには何も出ていないので今のところ打つ手なしです。
Zabbixのサーバログをデバッグモードにすることはできないでしょうか?

ユーザー TNK の写真

yum install mysql-connector-odbc の実行でそのバージョンがイ
ンストールされてしまうのであれば、OSの標準以外のyumリポジト
リを登録されているからでしょう。

Zabbixのサーバログをデバッグモードにすることはできないでしょうか?

一番簡単なのは、zabbix_server.conf内のDebugLevelを4にして
zabbix_serverプロセスを再起動です。

また、2.4系であれば、実行中にログのレベルを変更できるので、
それを利用しても良いかもしれません。
特に今回の場合に限って言えば、pollerプロセスに限定してログの
レベルを上げると良いかもしれません。

実行例:
 # zabbix_server -R log_level_increase="poller"
 # zabbix_server -R log_level_decrease="poller"

pollerだけでも大量のログが出力されますのでご注意ください。

ありがとうございます。
デバッグモードをレベル4にしたところ、ODBC接続箇所と思われるログが下記の通り出力しました。

6004:20150916:163653.698 In substitute_key_macros() data:'db.odbc.select[testcheck,slave_check]'
6004:20150916:163653.698 End of substitute_key_macros():SUCCEED data:'db.odbc.select[testcheck,slave_check]'
6004:20150916:163653.698 In substitute_simple_macros() data:'select version()'
6004:20150916:163653.698 In substitute_simple_macros() data:'repl'
6004:20150916:163653.698 In substitute_simple_macros() data:'xxx'
6004:20150916:163653.698 In get_value() key:'db.odbc.select[testcheck,slave_check]'
6004:20150916:163653.698 In get_value_db() key_orig:'db.odbc.select[testcheck,slave_check]'
6004:20150916:163653.698 In odbc_DBconnect() db_dsn:'slave_check' user:'repl'
6004:20150916:163653.704 End of odbc_DBconnect():SUCCEED
6004:20150916:163653.704 In odbc_DBselect() query:'select version()'

これ以降はODBCのログは出力されません。
Zabbix Webインタフェースの[管理][キュー]を見ると該当のデータベースモニタはキュー待ちしているのが確認できます。

ログよりDB接続成功と、select version()を投げているが、MySQLサーバ側より応答がない(応答を待っている)状態に見えます。
MySQLサーバ側を少し疑ってみます。

なお、zabbixフォーラムでは同様の報告が上がっているようですが解決策は見つかっていないようです。
https://www.zabbix.com/forum/showthread.php?t=42572

ユーザー TNK の写真

私の方ではOracleのページから、

 mysql-connector-odbc-5.3.4-1.el6.x86_64.rpm

を取得して、ODBCのドライバとして、

 /usr/lib64/libmyodbc5w.so

を利用する設定を行ってみましたが、値取得処理の途中でハングア
ップしてしまうようです。

具体的には、Zabbixではodbc_DBconnect()という関数を利用して、
ODBC経由でのDBへの接続は成功していて、その次のodbc_DBselect()
という関数で具体的にSQLをデータベース側に渡しているのですが、
MySQLのODBCドライバからの応答が無いため、応答待ちになってし
まっているようです。

エラーが発生してくれれば、アイテムの値の取得不可となるのです
が、明確なエラーが発生しないため、アイテム自体も取得不可の状
態にならず、エラーログも出力されてないようです。

調べてみるとバグ報告があがっていました。

 ZBX-7665
  Zabbix 2.2.1 ODBC monitor crash - in "poller".
    https://support.zabbix.com/browse/ZBX-7665

この障害の根本的な原因は、MySQLのODBCドライバの問題のようで
すので、Zabbix側では修正できないということで、Won't Fixとい
うステータスでクローズしてしまっているようです。

ということで、CentOS 6を利用されているのであれば、CentOS 6標
準のリポジトリを利用して、

 mysql-connector-odbc-5.1.5r1144-7.el6.x86_64

を利用するようにしてみてください。

検証までしていただき、ありがとうございます。
mysql-connector-odbcのバグでしたか。。

mysql-connector-odbc-5.3.4-1.el6.x86_64.rpmを削除して
mysql-connector-odbc-5.1.5r1144-7.el6.x86_64をインストールしてみました。

その結果、、Zabbixのクラッシュおよびisqlが動かなくなりました。
isqlの実行結果は下記のとおりです。
isql: relocation error: /usr/lib64/libmyodbc5.so: symbol strmov, version libmysqlclient_16 not defined in file libmysqlclient_r.so.16 with link time reference

mysql-strmov.patch (revision 3)
ってのを当てれば直るのかな。

ユーザー TNK の写真

やはりだめでしたか。

CentOS 6標準以外のMySQLを利用されている環境のようですから、
その環境では、CentOS 6標準のMySQL用ODBCドライバは利用できな
いようですね。

そうすると対策は2つになると思います。

1つは、その環境では、ODBCでの監視をあきらめ、UserParameter
などを活用して監視する方法です。
もう1つの方法は、zabbix_serverを起動するサーバとMySQLサーバ
を起動するサーバを分け、zabbix_serverプロセスを起動するサー
バ上はCentOS 6標準のMySQLのクライアントライブラリやODBCドラ
イバを利用する方法です。

ありがとうございます。
CentOS6標準のMySQLを使用しているのでバージョンダウンしたODBCドライバは使用できないという認識であっているでしょうか?

ODBC監視は諦めてSSHエージェントを使用する方向です。
(該当サーバにログインしてSQL実行して値を取得)
この方法だと欲しかった情報がZabbixで取得できましたので、これでいこうと思います。

ユーザー TNK の写真

CentOS 6標準のMySQLサーバやクライアントライブラリを利用
していれば、先のODBCドライバが使えるはずです。
利用されているMySQLのバージョンが、MySQL 5.3.xであるな
らば、CentOS 6の標準のMySQLのパッケージではありません。

私が指定したバージョンのODBCドライバでライブラリの依存関係
が解決できなかったのであれば、標準以外のMySQLをインストー
ルされているはずです。

そのような標準外の環境では使用できないということです。

ありがとうございます。
使用したMySQLは別途MySQLサイトよりダウンロードしインストールしたものです。

一応ODBC以外の方法でやりたいことは実現できたのでこれでクローズします。
ありがとうございました。