slapcat resulted in the entry listed with objectClass glue and all of it's attributes gone. However, this was the same at all of our servers.The first thing that came to mind to fix this issue was doing an
ldapmodify on the entry, however ldapmodify would return ldap_modify: No such object (32). The logical next step would then be to add the object, since ldapmodify complains it's not there... However, that would result in ldap_add: Already exists (68)! Amazing, one program telling me the object can't be modified because it's not there, the other telling me I can't add it because it exists.I did some searching, but couldn't find a proper solution or anyone with a similar issue. I could of course start from scratch, but that would destroy the sync status, modified timestamp, modifier's name, create timestamp and creators name and perhaps even more, so that wouldn't really be an option in my humble opinion.
During my (re)search I did come across slapadd. slapadd can be used to do offline database edits (at least additions to the database). So I stopped slapd, and fired up slapadd and entered my LDIF... Same issue! The entry exists, so it can't be added. slapadd doesn't seem to support modify either (I'm not complaining, just stating the facts), so I had to figure out something else...
Suddenly I had it all figured out. slapadd and slapcat are similar tools in that they operate directly on the database instead of talking to slapd. Thus if you slapcat your database you can give the output back to slapadd!
# slapcat -n 1 > entries.ldif
# slapadd -n 1 -l entries.ldif
Of course this very simple code example will result in similar errors, because all your entries are already there. Besides, it would also be nice to edit the broken entry while we're at it, which will result in the following list of commands to complete it all (code assumes broken tree is database number 1, replace with your database index if it's not the first database):
# cp -ar /var/lib/ldap{,.bak}# slapcat -n 1 > entries.ldif# rm -r /var/lib/ldap# mkdir -p /var/lib/ldap/bdb
This line assumes a BDB database, you can probably replace bdb with hdb if you're using HDB- Now edit entries.ldif so your entry makes sense again. Just fix the objectClass (be sure to create a correct objectClass chain, i.e. top, dcObject, organization), structuralObjectClass and attributes required by the newly set objectClasses (i.e. dc, o).
# slapadd -n 1 -l entries.ldif
Now your entry should be back again, with a proper objectClass and related attributes. If you get errors along the way, make sure there aren't more entries with attributes that aren't available in the schema files. Just remove the incorrect attributes (and probably incorrect objectClasses accompanying the attributes) from the LDIF and repeat the database delete and add steps (or remove everything earlier in the LDIF and just add the new entries using slapadd, of course!)
The last step would be to index the database. I don't know if it's required (slapd will run fine without), but before starting slapd run the following:
# slapindex -n 1
Now your LDAP tree should be back to a proper state again!
There's just one issue left... If you didn't change contextCSN attributes, slapd won't sync the entry to other servers because they will all think the entry never changed (and thus the other servers will keep the broken entry). There's an easy solution: just use ldapmodify to change an attribute and the contextCSN will update and the change will propagate to the other servers. The real fix would be to change the contextCSN for the rid of the server you're editing to the current time, however this is more prone to mistakes and the result should be the same (unless using delta syncrepl, where it is possible that only the change will get propagated.)
This was my not-so-short introduction to LDAP disaster recovery without losing contextual information. I'm hoping you enjoyed reading this post and that it helped you to recover from long-standing errors.
2 reacties:
Hello Webmaster,
I am a webmaster of Shopping and sports websites; I've found your website ( http://blog.mycroes.nl/ ) suitable to that of our visitors. Please give us a quote for a site-wide link on your esteemed website for a period of 6months/1 year. We’ll make the payment via PayPal to the PayPal id provided by you.
Regards,
Nagendra singh
Email:-nagendra.singh275@gmail.com
Skype :nagendra.link
There is an easier way, at least on OpenLDAP 2.4.24 (which is the only one I've tested. Create the LDIF to change the entries back to what they should be by replacing each attribute. Then use ldapmodify with the -M option, which turns on the manageDSAit control. This causes the entries to be treated as normal, not as referrals, and the entries then replicated normally across my environment.
Post a Comment