masahirorの気まま記録簿

個人的な出来事や意見、生活などの記録を思うままにブログに記録

OpenLDAPが起動しない

仕事で管理しているサーバで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時間で復旧できたので、何とか事なきを得た。