zabbix 1.8.1 上で MySQL server has gone away エラー

http://www.zabbix.com/forum/showthread.php?p=59973
にも同様のエラーが報告されていますが、ここでも知っている方がいらっしゃいましたらお聞きしたいと思います。

環境:
zabbix 1.8.1(sourceforge版ソース)
Asianux3 SP2 32bit
apache 2.2.14
mysql 5.0.90(linuxバイナリ版)
php 5.3.1

現象としてはサーバは落ちておらず、値も取得できているのですが、zabbix_server.logに下記のようなエラーを延々と吐き続けるというものです。

-----------------------------------------------------------
9887:20100225:192436.649 [Z3005] Query failed: [2006] MySQL server has gone away [begin;]
9887:20100225:192436.649 [Z3005] Query failed: [2006] MySQL server has gone away [update hosts set available=1,errors_
from=0,disable_until=0,error='' where hostid=10050]
9886:20100225:195554.901 [Z3005] Query failed: [2006] MySQL server has gone away [select hostid,proxy_hostid,host,useip,ip,dns,port,status,useipmi,ipmi_ip,ipmi_port,ipmi_authtype,ipmi_privilege,ipmi_username,ipmi_password,maintenance_status,maintenance_type,maintenance_from,errors_from,available,disable_until,snmp_errors_from,snmp_available,snmp_disable_until,ipmi_errors_from,ipmi_available,ipmi_disable_until from hosts where status in (0) and hostid between 000000000000000 and 099999999999999 order by hostid]
9886:20100225:195554.901 Database is down. Retrying in 10 seconds
9894:20100225:195608.864 [Z3005] Query failed: [2006] MySQL server has gone away [select hostid from hosts where host='**********' and proxy_hostid=0 and hostid between 000000000000000 and 099999999999999]
9894:20100225:195608.864 Database is down. Retrying in 10 seconds
9904:20100225:195634.682 [Z3005] Query failed: [2006] MySQL server has gone away [select druleid,iprange,name,unique_dcheckid from drules where proxy_hostid=0 and status=0 and (nextcheck<=1267095394 or nextcheck>1267095394+delay) and mod(druleid,1)=0 and druleid between 000000000000000 and 099999999999999]
9904:20100225:195634.682 Database is down. Retrying in 10 seconds
-----------------------------------------------------------

最初は他にあった
「DBサーバの設定が失敗している」
「DBが壊れている」
を疑ったのですが、zabbix_server.confの設定は問題ないし、設定しているユーザでクエリを実行すると無事selectできたりします。
updateは流石に怖いのでやっていません。
CHECK TABLEも問題なしでした。

mysqlのバイナリ版を使用しているのがいけないかなと思い、ライブラリのパスを/etc/ld.so.confに組み込んでみたものの、それもだめでした。

個人的にはコンパイル時の設定かなと思い、configureを調べたのですが、
-----------------------------------------------------------
--with-mysql[=ARG] use MySQL client library [default=no], optionally
specify path to mysql_config
-----------------------------------------------------------
に何か設定してやれば良いのか解らず、苦慮しております。

もし、解決法やアドバイス等ありましたらよろしくお願いします。

コメント表示オプション

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

MySQLのログに何か出力されていませんか?

ユーザー kugu_kugu の写真

エラーログ(*.err)には何も出力されていませんね。
そもそもzabbixが問い合わせている、クエリ自体は間違ってないようなので。

その他のシステムログをあさってみましたが、
特に怪しいところはありませんでした。

ユーザー KAZ の写真

kugu_kuguさん

エラーログ(*.err)には何も出力されていませんね。
そもそもzabbixが問い合わせている、クエリ自体は間違ってないようなので。

「MySQL server has gone away」クローズしたDBセッションでクエリーを実行しようとしていると発生するエラーかと思います。

コネクションオープン漏れ、またはクローズしたコネクションを使用しているのが原因だと思います。

ログレベルを4にして「MySQL server has gone away」が出力された当たりのログを展開頂けると助かります。

ユーザー kugu_kugu の写真

KAZさんは書きました:
「MySQL server has gone away」クローズしたDBセッションでクエリーを実行しようとしていると発生するエラーかと思います。

コネクションオープン漏れ、またはクローズしたコネクションを使用しているのが原因だと思います。

ログレベルを4にして「MySQL server has gone away」が出力された当たりのログを展開頂けると助かります。

ログレベルを4にして、いろいろ調べてみたのですが、自己解決しました。
原因は「クローズしたコネクションを使用しているのが原因」でした。
mysql側で「wait_timeout = 60」としていた為、sleep状態のコネクションを強制切断した為でした、失礼しました。

ところでmysqlサーバ側で上記設定をしていて、変更が難しい場合は、zabbix_server.confの設定やインストール時の設定で回避することは不可能なのでしょうか。
具体的にはクエリを流した後はコネクションを切断し、また必要な時にコネクションを張りなおすような動作をさせることはできないのでしょうか。
DB側で最大接続数を多く設定できない場合は、クエリを流していない時は接続を解放してほしいので…

P.S. 1.8.1の計算アイテムがかなり使いやすいです。hobbitでとれる値をそのまま移行できそうな勢いです。重さはどうかはわかりませんが…

ユーザー KAZ の写真

kugu_kuguさん

ところでmysqlサーバ側で上記設定をしていて、変更が難しい場合は、zabbix_server.confの設定やインストール時の設定で回避することは不可能なのでしょうか。

1.8系はまだ使いこんでないので不明なことが一杯あるのですが、MySQL的には無理かと…

具体的にはクエリを流した後はコネクションを切断し、また必要な時にコネクションを張りなおすような動作をさせることはできないのでしょうか。
DB側で最大接続数を多く設定できない場合は、クエリを流していない時は接続を解放してほしいので…

webフロントエンドでは1ページ単位にconnect/closeしてます。

サーバ部分では下記がコネクション貼りっぱなしとなります。
for分の頭でconnectしてfor分の終了前にcloseすれば「wait_timeout = 60」でもエラーにならない可能性がありますが、DBに負荷がかかりパフォーマンスが劣化する可能性があります。

<code>
zabbix_proxy\datasender\datasender.c(705): DBconnect(ZBX_DB_CONNECT_NORMAL);
zabbix_server\alerter\alerter.c(199): DBconnect(ZBX_DB_CONNECT_NORMAL);
zabbix_server\dbconfig\dbconfig.c(53): DBconnect(ZBX_DB_CONNECT_NORMAL);
zabbix_server\dbsyncer\dbsyncer.c(56): DBconnect(ZBX_DB_CONNECT_NORMAL);
zabbix_server\discoverer\discoverer.c(1293): DBconnect(ZBX_DB_CONNECT_NORMAL);
zabbix_server\escalator\escalator.c(983): DBconnect(ZBX_DB_CONNECT_NORMAL);
zabbix_server\httppoller\httppoller.c(109): DBconnect(ZBX_DB_CONNECT_NORMAL);
zabbix_server\pinger\pinger.c(494): DBconnect(ZBX_DB_CONNECT_NORMAL);
zabbix_server\poller\poller.c(716): DBconnect(ZBX_DB_CONNECT_NORMAL);
zabbix_server\timer\timer.c(587): DBconnect(ZBX_DB_CONNECT_NORMAL);
zabbix_server\trapper\trapper.c(686): DBconnect(ZBX_DB_CONNECT_NORMAL);
zabbix_server\utils\nodechange.c(355): DBconnect(ZBX_DB_CONNECT_EXIT);
</code>

と言うか、wait_timeoutに頼るのは方向性として宜しくないような…A(^^;
wait_timeoutはデフォルト(8時間)を推奨します。

下記を読んでみて下さい。
[url=http://d.hatena.ne.jp/uratch/20100225/1267085747]MySQLのwait_timeoutには気をつけろ - 新・浅く広くをモットーに - WEBプログラマ メモ[/url]

私的意見ですが、wait_timeoutを短くした方が再利用しやすいと言う話はconnectしたけどcloseしないプログラムが動いている環境に限定しての話かと。

ユーザー kugu_kugu の写真

サーバ側プログラムで必要なコネクションが貼りっぱなしになるという事ですね、了解です。
という事はwait_timeoutをデフォルトにしたら8時間毎に最初に出たエラーが出てくるという事になるのでしょうか?

と言うか、wait_timeoutに頼るのは方向性として宜しくないような…A(^^;
wait_timeoutはデフォルト(8時間)を推奨します。

下記を読んでみて下さい。
[url=http://d.hatena.ne.jp/uratch/20100225/1267085747]MySQLのwait_timeoutには気をつけろ - 新・浅く広くをモットーに - WEBプログラマ メモ[/url]

私的意見ですが、wait_timeoutを短くした方が再利用しやすいと言う話はconnectしたけどcloseしないプログラムが動いている環境に限定しての話かと。

これ以上はオフトピになるので詳しい言及は避けますが、システム管理者をしていて結構遭遇しますよ、
DBコネクションをconnectしたままでcloseしてくれないwebプログラム。
wait_timeoutに気をつけろじゃなくて、「使ったコネクションはいらないなら開放しろ」が本音だったり。
結局その予防策として、管理者側で設定しちゃうという流れになったりします。>wait_timeout

ユーザー KAZ の写真

kugu_kuguさん

サーバ側プログラムで必要なコネクションが貼りっぱなしになるという事ですね、了解です。
という事はwait_timeoutをデフォルトにしたら8時間毎に最初に出たエラーが出てくるという事になるのでしょうか?

置きません、少なくとも数分周期でSQLが動きますので、8時間の無通信は発生しません。

これ以上はオフトピになるので詳しい言及は避けますが、システム管理者をしていて結構遭遇しますよ、
DBコネクションをconnectしたままでcloseしてくれないwebプログラム。
wait_timeoutに気をつけろじゃなくて、「使ったコネクションはいらないなら開放しろ」が本音だったり。
結局その予防策として、管理者側で設定しちゃうという流れになったりします。>wait_timeout

私もphpでもjavaでもよく遭遇します。

私的意見ですが、ldapでもhttpでもDBでもconnectionしたらcloseするのが常識とは思います。
が、できてないプログラムがたくさんありますね。A(^^;

まぁ、「直せ」と言えれば一番いんですが…
※:レベル的に「バグ」なので…