仕事で管理しているサーバでOpenLDAPを利用しているものがあるのだが、サーバがフリーズしてしまい、PING応答はあるもののコンソールには接続できない状態。直接画面を見てもキーボード入力を受け付けなかったので、強制電源OFFで電源を切った。
そして再立ち上げしたのだが、起動後OpenLDAPが起動に失敗していた。
起動コマンドを実行すると、一見動いたように見えるが、ステータスを見ると動いていない。
# /etc/init.d/ldap start slapd の設定ファイルをチェック中: [ OK ] slapd を起動中: [ OK ] # /etc/init.d/ldap status slapd は停止しています
動作エラーの詳細を探るべく、デバックコマンドを実行。
# slapd -d 128
すると、Berkeley DBのデータベースがないといったエラーが表示された。
daemon: IPv6 socket() failed errno=97 (Address family not supported by protocol) bdb_initialize: Sleepycat Software: Berkeley DB 4.2.52: (December 3, 2003) bdb_initialize: Sleepycat Software: Berkeley DB 4.2.52: (December 3, 2003) bdb_db_init: Initializing BDB database => bdb_last_id: get failed: DB_PAGE_NOTFOUND: Requested page not found (-30988) bdb_db_open: last_id(/var/lib/ldap) failed: DB_PAGE_NOTFOUND: Requested page not found (-30988) backend_startup: bi_db_open(0) failed! (-30988) slapd stopped.
OpenLDAPのデータ管理には「Berkeley DB」が使われているらしい。今知った。
うーん、動作中のサーバを強制再起動させたのが、それが原因でデータベースが一部破損してしまったのか。
色々検索したら、Berkeley DBのデータベース修復コマンドが見つかったので、これを実行。
# slapd_db_recover
再度起動コマンドを実行。
すると、データベースの作業ファイルに不整合があるといった警告が表示された(警告のログは残していない)。「__db.00X」という複数のファイル名が表示された。
これも検索して調べた結果、これらをまとめて消せばよいとのこと。
# cd /var/lib/ldap/ # rm __db.00* -f
再度デバックしてみると、問題が解消。
# slapd -d 128 @(#) $OpenLDAP: slapd 2.2.13 (Jul 19 2007 07:35:05) $ brewbuilder@hs20-bc1-7.build.redhat.com:/builddir/build/BUILD/openldap-2.2.13/openldap-2.2.13/build-servers/servers/slapd bdb_initialize: Sleepycat Software: Berkeley DB 4.2.52: (December 3, 2003) bdb_initialize: Sleepycat Software: Berkeley DB 4.2.52: (December 3, 2003) Global ACL: access to * by self write(=wrscx) by users read(=rscx) by anonymous auth(=x) bdb_db_init: Initializing BDB database slapd starting
Ctrl+Cで中断させ、再度起動コマンドを実行。無事起動した。
LDAPに登録されたデータも消失していないことを確認。
つい最近もデータ破損に関するサーバトラブルがあったばかり。
「またか」と、復旧作業で今日は帰れないかなと思っていたが、情報を見つけるまでの約1時間で復旧できたので、何とか事なきを得た。