2009/10/17

OpenLDAP 2.4: 消せないエントリについて、まとめ

およそ12万件の郵便番号データを一斉に削除した時に、最後に残ったコンテナの"ou=address,dc=example,dc=org"エントリが削除できない問題を少し探っていました。

とりあえず状況からわかった事は"database hdb"にデータを格納した場合は、削除が問題なく完了するという事。Ubuntuで$ sudo apt-get install slapdした場合にはデフォルトが"hdb"になりますが、ソースから導入すると"bdb"がslapd.confに書かれています。

今回は自分でコンパイルしていたので気がついたというか、Ubuntu付属のslapdを使っていたら気がつかなかったかもしれないですね…。

場合分け

ldapdeleteコマンドの-fオプションを使うと複数のDNを記述したファイルを準備する事で、一気にエントリを削除する事ができます。

そこでスクリプトを準備して、122872件のエントリを削除してからou=addressエントリを削除してみます。

$ ./gen_delete_entries.rb > delete.ldif
$ ldapdelete -x -W -D cn=Manager,dc=example,dc=org -f delete.ldif

ここまではエラーも出ずに無事に完了します。ちなみに"gen_delete_entries.rb"スクリプトは次のようなものでした。

#!/usr/bin/ruby
for i in 0..122872
  printf "ou=%06d,ou=Address,dc=example,dc=org\n", i
end

エラーの内容

これから手動で"ou=address"エントリを削除しようとするとエラーがでます。

$ ldapdelete -x -W -D cn=Manager,dc=example,dc=org ou=Address,dc=example,dc=org
ldap_delete: Operation not allowed on non-leaf (66)
 additional info: subordinate objects must be deleted first

個別に削除せずに"ldapdelete"に"-r"オプションをつけて、いっきに12万件を削除した場合には、次のようなエラーになります。

$ ldapdelete -r -x -W -D cn=Manager,dc=example,dc=org ou=Address,dc=example,dc=org
ldap_delete: Other (e.g., implementation specific) error (80)
 additional info: DN index delete failed

"hdb"にすれば回避できるとはいっても、似たような現象はFAQの中でopenldap-dataディレクトリ以下のパーミッションの問題だ、とか今回の件には当てはまらないようなやりとりしか確認できていません。

ま、しばらくLPICの勉強から外れて原因を探ってみようと思います。

0 件のコメント: