OpenLDAP断电导致故障修复一例
📜 历史文件已不具备现实意义
OpenLDAP 现已转为使用 lmdb。
今天帮陈总研究一个奇怪的问题的时候误操作导致机器停止ssh响应,遂请机房重启。由于机房做的是power cycle,导致部分数据丢失。先前在配置OpenLDAP时,忘记在其中配置checkpoint,另外也没有对这台机器的LDAP进行备份,因此只好尝试从现有的数据库中恢复。冗余不做,日子甭过;备份不做,十恶不赦!
记录一下修复过程。
第一件事是把出问题的数据库做一份备份:rsync -av /var/db/openldap-data/ /var/db/openldap-data.old/
接着尝试slapcat。出现下面的错误:
|
|
尝试使用BerkeleyDB的修复工具修复:
|
|
slapcat发现问题依旧。搜索Google发现答案基本上都是从备份中恢复,看了一下Oracle的网站,关于这类问题也没有很好的办法。尝试将bdb文件dump出来再load回去:
|
|
再次slapcat,发现对另一文件报错,用类似的方法修补之后,slapcat成功。
将slapcat的输出导出到一个文件中: slapcat > /tmp/my.ldif
然后,删除OpenLDAP数据目录:rm /var/db/openldap-data/_* /var/db/openldap-data/[a-z]*
最后,重新使用导出的ldif文件恢复:slapadd -l /tmp/my.ldif。
至此,恢复完成。
不过,在这个过程中,确实走了相当多的弯路。
第一个问题是,slapcat会初始化数据库环境,这样会导致BerkeleyDB创建一系列文件,并使后续使用db_dump访问.bdb文件出现困难。解决方法是db_recover。
第二个问题是,最开始使用的是db_recover的"灾难恢复模式"(-c)。这个模式会直接discard掉相当多的数据。
第三个问题是,尝试了删除__*和log*文件并灾难恢复,事实证明这样做的效果非常不理想。
第四个问题是,首次成功的恢复中,并未包括slapcat和slapadd的步骤。观察日志发现,有一个出问题的数据库文件仍然影响了OpenLDAP的运行。
第五个,也是最严重的问题是,这个恢复操作实际上无法恢复全部数据。不过,这是目前已知的、恢复最完整的数据了,检查先前备份的数据库文件,发现无法恢复的数据确实不存在。
教训
备份要做到定时,定期,异地(我自己的系统往往都有这类机制,但是这台机器上忘记做了)。
OpenLDAP一定要配置checkpoint。例如,checkpoint 128 15。