Serverが停止してしまうようになりました...

こんにちは。このところ順調だったzabbixですが、

急にserverが停止してしまうようになってしまいました...

以下のようなログを吐き出して死んでしまいます...

------------------
8563:20071217:095519 Query::select eventid,value,clock from events where source=0 and object=0 and objectid=12785 order by clock desc limit 2
8566:20071217:095519 Query failed: [commit;] Lost connection to MySQL server during query [2013]
8582:20071217:095519 Query failed: [delete from history where itemid=18440 and clock<1196308760] Lost connection to MySQL server during query [2013]
8564:20071217:095519 Query failed: [commit;] Lost connection to MySQL server during query [2013]
8567:20071217:095519 Query failed: [commit;] Lost connection to MySQL server during query [2013]
8565:20071217:095519 Query failed: [commit;] Lost connection to MySQL server during query [2013]
8563:20071217:095519 Query failed:Lost connection to MySQL server during query [2013]
8559:20071217:095519 One child process died. Exiting ...
8565:20071217:095519 Query failed: [begin;] MySQL server has gone away [2006]
8565:20071217:095519 Query failed: [insert into history_uint (clock,itemid,value) values
(1197852919,19502,0)] MySQL server has gone away [2006]
8559:20071217:095521 ZABBIX Server stopped

------------------

ちょっと前はserverが死んでも起動すれば動いてたのですが、今度はほとんど立ち上がらなくなってしまいました...

mysqldは動作しています.
zabbix serverは1.4.2, OSはFedora7です。

コメント表示オプション

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

MySQLへの接続ができていないようですね。

基本的なことですが、zabbix_server.confに設定しているMySQLのホスト名、接続方法(TCPかSocketか)、データベース名、接続ユーザ/パスワードは正しいものが設定されているでしょうか?

コマンドライン等から、ZABBIXサーバ用の設定と同条件で接続できるかどうかも試してみてください。

また、MySQLのログには何かエラーのようなものは出力されていないでしょうか。

ユーザー keeero の写真

いつもお世話になります...すみません。

kodaiさんは書きました:
MySQLへの接続ができていないようですね。

基本的なことですが、zabbix_server.confに設定しているMySQLのホスト名、接続方法(TCPかSocketか)、データベース名、接続ユーザ/パスワードは正しいものが設定されているでしょうか?

今まで動いていましたし、これは問題ないのではと思いますが、

コマンドライン等から、ZABBIXサーバ用の設定と同条件で接続できるかどうかも試してみてください。

やってみましたがOKです。

また、MySQLのログには何かエラーのようなものは出力されていないでしょうか。

mysqlのログはこんな感じです

-------
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page 49090.
InnoDB: You may have to recover from a backup.
071217 9:52:49 InnoDB: Page dump in ascii and hex (16384 bytes):........(ダンプ)
-------

壊れてしまったのでしょうか...

ユーザー kodai の写真

エラーメッセージからするとデータベースが壊れてしまっているようですね。もしくは、ディスク自体が壊れている可能性もあると思います。バックアップまたはバイナリログを取られていたのであればそこから復旧するのが早いと思います。

それが無理なようであれば、私はあまりMySQLには詳しくないので修復の可能性や方法などは調査しないと分かりませんが、一度MySQLを停止してMySQLのデータファイルをバックアップした上で、データベース全体のdumpが取れないか試してみるのはいかがでしょうか。

ユーザー keeero の写真

ご返答遅くなりました...

エラーメッセージからするとデータベースが壊れてしまっているようですね。もしくは、ディスク自体が壊れている可能性もあると思います。バックアップまたはバイナリログを取られていたのであればそこから復旧するのが早いと思います。

やっぱり壊れているようです。
現在がんばって復旧しようとしているのですが、どうやってもリストアが途中でエラーになってしまいます...

悲しいですが、もうちょっとやってもダメなら再インストールしかないかもしれません...

全体のバックアップもやってみたのですが :cry:

ユーザー usiusi360 の写真

同じようにMYSQLのテーブルが壊れたことが何回かありました。(主にhistory系のテーブル)

以下のフォーラムを見るにItem数が多すぎたのかなと思ってます。
私の場合はMYSQLのチューニングをして様子を見ている段階です。
http://www.zabbix.com/forum/showthread.php?t=4792
http://www.zabbix.com/forum/showthread.php?t=4435

■環境
 zabbix1.4 ホスト数:27 Item数:1108
 Pentium4 2.66GHz メモリー 1GB CentOS5

==自分の場合の復旧手順をメモしておきます==

zabbix_serverとapacheは止めておきます。
クラッシュ後は、MYSQLが起動出来なくなりました

===mysqlをリカバリーモードで起動します
/etc/my.cnfの[mysqld]に以下を記述
innodb_force_recovery = 4

++mysqlを起動
# /etc/init.d/mysqld start

===テーブルチェック
# mysqlcheck --all-databases
zabbix.history
error : Corrupt
※壊れているテーブルでerrorが出ます。

===zabbixデータベースのダンプを出力します
# mysqldump データベース名 -u root -p パスワード --opt > ダンプファイル名
例) # mysqldump zabbix -u root -p パスワード --opt > /var/tmp/zabbix.dump

===データベースを削除
++MYSQLへ接続
# mysql -u root -p
mysql> drop database zabbix;
※私の場合は、うまく削除出来なかったためMYSQL停止後に/var/lib/mysql/zabbix以下にあるデータファイルをフォルダごと手で消してしまいました。

===mysqlを通常モードで起動する
++mysqlを停止
# /etc/init.d/mysqld stop

++/etc/my.cnfの[mysqld]の以下記述を削除
innodb_force_recovery = 4

++mysqlを起動
# /etc/init.d/mysqld start

===データベースを作成
++MYSQLへ接続
# mysql -u root -p
mysql> create database zabbix;

===zabbixデータベースをダンプから復元
# mysql -u root -p パスワード データベース名 < ダンプファイル名
例) # mysql -u root -p パスワード zabbix < /var/tmp/zabbix.dump

以上の手順で私は復旧出来ました。
試す場合はくれぐれも自己責任でお願いします。

ユーザー keeero の写真

kiyuさん、情報ありがとうございます。

以下のフォーラムを見るにItem数が多すぎたのかなと思ってます。
私の場合はMYSQLのチューニングをして様子を見ている段階です。
http://www.zabbix.com/forum/showthread.php?t=4792
http://www.zabbix.com/forum/showthread.php?t=4435

■環境
 zabbix1.4 ホスト数:27 Item数:1108
 Pentium4 2.66GHz メモリー 1GB CentOS5

今の私の環境はDBが壊れてるのでちゃんとした値がありませんが、
Itemはやっぱ多いと思います。
マシンはCore2Duo6600(2.4GHz), メモリは2GBです。

===テーブルチェック
# mysqlcheck --all-databases
zabbix.history
error : Corrupt
※壊れているテーブルでerrorが出ます。

テーブルチェックで止まってしまいました...

===zabbixデータベースのダンプを出力します
# mysqldump データベース名 -u root -p パスワード --opt > ダンプファイル名
例) # mysqldump zabbix -u root -p パスワード --opt > /var/tmp/zabbix.dump

私の場合、dumpするとエラーになります。
復旧しようと試みているのですが...

もうちょっとやってみます。
今更別の(nagiosなどの)監視に移るのもしんどいので、なんとか今後もzabbixでやっていきたいのですが...

監視対象が多い場合に注意する点などありますでしょうか。
ご指摘いただいたForumを見ると、監視のサイクルを長くするとか、保存期間を短くするといった方法が書かれていましたが...

ユーザー usiusi360 の写真

>私の場合、dumpするとエラーになります。
>復旧しようと試みているのですが...

過去のデータに未練がないようでしたら、リカバリモードで起動した後、history系のテーブルを空(TRUNCATE TABLE)にしてからdumpしてみるとか。
mysql> show tables like 'hist%';
+--------------------------+
| Tables_in_zabbix (hist%) |
+--------------------------+
| history |
| history_log |
| history_str |
| history_str_sync |
| history_sync |
| history_text |
| history_uint |
| history_uint_sync |
+--------------------------+

ちなみにMYSQLのデフォルト設定ですとDBが肥大化してしまいます。
こちらの対策はされましたでしょうか?
http://tf0054.blogspot.com/2007/07/linux-zabbixdb.html

あとはMYSQLの設定を何も変更していないようでしたら、Forumにもありますが、チューニングしてみてはいかがでしょうか。
設定変更後、今のところ安定しています。

===以下、私の場合===
<my.cnf>
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
old_passwords=1
key_buffer=256M
table_cache=256
record_buffer=1M
innodb_file_per_table
innodb_buffer_pool_size=768M
innodb_log_file_size=128M
innodb_flush_log_at_trx_commit=2
innodb_thread_concurrency=2
thread_concurrency = 2
max_connections = 200

MYSQLのチューニングは色々ページがありますので、そちらも参考にされるとよいかと思います。

ユーザー keeero の写真

kiyuさん、ありがとうございます。

過去のデータに未練がないようでしたら、リカバリモードで起動した後、history系のテーブルを空(TRUNCATE TABLE)にしてからdumpしてみるとか。

今もうちょっと試しています。もしだめなら、ご指示のようにしてみます。

ちなみにMYSQLのデフォルト設定ですとDBが肥大化してしまいます。
こちらの対策はされましたでしょうか?
http://tf0054.blogspot.com/2007/07/linux-zabbixdb.html

知りませんでした...というか、こんなにすぐに肥大化すると思わなかったのであまりよく調べていませんでした。
(ダメですね)

===以下、私の場合===

ありがとうございます。リストアがうまくいったら、参考にさせていただきます。またご報告させてください。

ユーザー keeero の写真

何度も復旧しようとしているのですが、
リストアしてwebからzabbixへアクセスすると、下記のエラーが出てしまいます。

nodeが無いと言われてるので、完全に壊れてしまったんでしょうか...トホホです。

--------------
Error in query [select * from nodes where nodetype=1 order by nodeid] [Table 'zabbix.nodes' doesn't exist]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
Error in query [select u.* from users u where u.alias='guest' and (u.userid div 100000000000000) in (0) ] [Table 'zabbix.users' doesn't exist]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
Error in query [select * from nodes where nodeid=0] [Table 'zabbix.nodes' doesn't exist]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
Error in query [select n.nodeid,min(r.permission) as permission, g.userid from nodes n left join rights r on r.id=n.nodeid and r.type=0 left join users_groups g on r.groupid=g.usrgrpid and g.userid=0 where n.nodeid in (0) group by n.nodeid, g.userid order by nodeid desc, userid desc, permission desc] [Table 'zabbix.nodes' doesn't exist]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
Error in query [select n.nodeid,min(r.permission) as permission, g.userid from nodes n left join rights r on r.id=n.nodeid and r.type=0 left join users_groups g on r.groupid=g.usrgrpid and g.userid=0 where n.nodeid in (0) group by n.nodeid, g.userid order by nodeid desc, userid desc, permission desc] [Table 'zabbix.nodes' doesn't exist]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
Error in query [select n.nodeid,min(r.permission) as permission, g.userid from nodes n left join rights r on r.id=n.nodeid and r.type=0 left join users_groups g on r.groupid=g.usrgrpid and g.userid=0 where n.nodeid in (0) group by n.nodeid, g.userid order by nodeid desc, userid desc, permission desc] [Table 'zabbix.nodes' doesn't exist]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
Error in query [select n.nodeid,min(r.permission) as permission, g.userid from nodes n left join rights r on r.id=n.nodeid and r.type=0 left join users_groups g on r.groupid=g.usrgrpid and g.userid=0 where n.nodeid in (0) group by n.nodeid, g.userid order by nodeid desc, userid desc, permission desc] [Table 'zabbix.nodes' doesn't exist]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
Error in query [select n.nodeid,min(r.permission) as permission, g.userid from nodes n left join rights r on r.id=n.nodeid and r.type=0 left join users_groups g on r.groupid=g.usrgrpid and g.userid=0 where n.nodeid in (0) group by n.nodeid, g.userid order by nodeid desc, userid desc, permission desc] [Table 'zabbix.nodes' doesn't exist]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
mysql_fetch_array(): supplied argument is not a valid MySQL result resource[/etc/zabbix/db.inc.php:411]
[ERROR: Database corrupted, missed default user 'guest']

ユーザー keeero の写真

やはりリストアがうまくいきません :cry:

過去のデータに未練がないようでしたら、リカバリモードで起動した後、history系のテーブルを空(TRUNCATE TABLE)にしてからdumpしてみるとか。

truncate tableでhistory系を指定すると、「そんなテーブルはないよ」って怒られてしまいます。

やっぱり壊れてしまったのでしょうか...
過去のダンプをリストアしても、同じ症状になってしまいます。

# あれだけ設定した内容を再度手入力するのかと思うと、気が萎えて仕方ありません...

ユーザー keeero の写真

何度もすみません...

過去のデータは諦めるにしろ、設定だけでも生かせないかと思うのですが、どのテーブルを残したらよいでしょうか。

kiyuさんのおっしゃられたhistory系のみを空にするしか方法がなければ諦めますが...(すでにこれは失敗してしまいますので)

ユーザー usiusi360 の写真

ちなみにテーブルの一覧を表示したり、テーブル内のデータを参照したりといったことは出来ていますでしょうか?
mysqlcheck --all-databasesで止まってしまうとなると一部のテーブルのみの問題では無いのかも知れません。
私の時は、 history、history_str、history_uintが壊れてデータが見えなくなりましたが、それ以外は正常に参照できていました。

正直、MYSQLやZABBIXのデータ構造に詳しいわけでは無いので、これ以上助言を差し上げることは難しいかもしれません。
データベースのバックアップ・リカバリに関しては、MYSQLの技術系サイト等でもお聞きになってみてはいかがでしょうか。

ユーザー keeero の写真

kiyuさんは書きました:
ちなみにテーブルの一覧を表示したり、テーブル内のデータを参照したりといったことは出来ていますでしょうか?

参照できないテーブルが色々あるようで、もうこれは難しそうです。:cry:

正直、MYSQLやZABBIXのデータ構造に詳しいわけでは無いので、これ以上助言を差し上げることは難しいかもしれません。
データベースのバックアップ・リカバリに関しては、MYSQLの技術系サイト等でもお聞きになってみてはいかがでしょうか。

色々とありがとうございます。
そうですね...そうしてみます。お忙しいところアドバイスありがとうございました。