2009/04/15(水)OpenLDAP の Berkeley DB が壊れた……

長年運用してきた某所にある OpenLDAP の Berkeley DB が(リセットなどのトラブルで)ファイル破損しました。

# slapd.sh start

して一応数秒返ってくるんですが、OpenLDAPシステムが起動したまま接続を受付ない。どうも起動プロセスの途中で止まってしまう模様で、ログにもスタートしました以外、何も残ってない。

# slapd.sh stop

してもプロセスがみつからないと言われるし、実際にプロセスはあるんだけど kill -KILL しないと落ちてくれない。「telnet 127.0.0.1 387」しても何も応答がない。

結果的には、OpenLDAPのデータ管理している Berkeley DB の故障で、故障すると BDB 関係の関数がハングアップする模様。さてこれは困った。

復旧コマンドがあったらしい

BDBを開こうとするだけで停止するので、ダンプも何もできない。さて困った……と思ったら、db_recover という復旧コマンドがあるらしい。OpenLDAP 2.2.30 on FreeBSD だったので、DBDはVer4.2。ということで、

/var/db# db_recover-4.2 -c -v -h openldap-data
db_recover: Finding last valid log LSN: file: 1 offset 10445896
db_recover: Recovery starting from [1][28]
db_recover: Recovery complete at Wed Apr 15 00:11:18 2009
db_recover: Maximum transaction ID 800019e7 Recovery checkpoint [1][10445896]

とやって無事復旧しました。Berkeley DBは壊れたとき、必ずしも「エラー」になってくれないので原因究明が厄介ですね。

svnとかもそうだけど、Berkeley DBは時々壊れてくれるので、バックアップ取っておかないと痛い目みる。

参考