LDAPサーバのバックエンドにBerkeleyDBを使っていましたが、DBが壊れるタイミングが分かりました。
複数プロセスからDBにアクセスがあり、うち1プロセスで更新が発生した時にほぼ必ずDBが壊れました。
1プロセス内でのトランザクションはサポートしているようです。
LDAPサーバのバックエンドにBerkeleyDBを使う場合、
「更新される可能性のあるエントリが存在するLDAPサーバを稼働中にはslapcatコマンドを使ってはいけない」ということです。
slapcatのmanにも「一般に、データベースの一貫性を保証したいのであれば slapcat を実行している間は slapd(8) の実行を中断してください(少なくとも更新できないようにしてください)。 」とあります。
LDAPのバックエンドとしてBerkeleyDBを使う時にDBを壊さないためのTipsはまだあるので、次のブログエントリで書きます。