我的一位同事意外删除了在 centos 上运行的 ldap 2.4 服务器上的 ldap 事务日志文件(来自 /var/lib/ldap)。现在,slapd 守护进程无法启动,当使用调试标志运行时,它显示的内容如下:
file id2entry.bdb has LSN 754/2932421, past end of log at 1/660
sept. 11 12:40:14 centos7.ent.univ slapd[4917]: bdb(dc=uit,dc=ac,dc=ma): BDB2507 Commonly caused by moving a database from one database environment
sept. 11 12:40:14 centos7.ent.univ slapd[4917]: bdb(dc=uit,dc=ac,dc=ma): BDB2508 to another without clearing the database LSNs, or by removing all of
sept. 11 12:40:14 centos7.ent.univ slapd[4917]: bdb(dc=uit,dc=ac,dc=ma): BDB2509 the log files from a database environment
我尝试运行 db_recover 实用程序,它说恢复成功,但 slapd 尚未启动,同样的错误。
确信删除日志文件是罪魁祸首,并且没有任何备份文件,有没有办法在没有日志文件的情况下恢复数据库?
答案1
经过几个小时的尝试失败后,结果如下:
- 备份 /var/lib/ldap 和 /etc/openldap
tar -czf ldap.bak.gzip /var/lib/ldap /etc/openldap
- 在 /var/lib/ldap 中创建 bdb 文件的转储
db_dump -f 文件.dump 文件.bdb
- 删除 bdb 文件,然后使用 db_load 重新构建它们(如果一次性删除所有文件,请记下所有文件,否则请逐个删除)
rm -f 文件.bdb
db_load -f 文件.转储文件.bdb
如果在运行 db_dump 时遇到错误,请运行:
db_recover -h /var/lib/ldap
从转储文件构建所有 bdb 文件后,请确保它们属于正确的用户:
chown ldap:ldap /var/lib/ldap/*
尝试启动 ldap 守护进程:
服务 slapd 启动
如果仍然无法启动,您可以尝试运行另一个 db_recover,但如果所有 bdb 文件都已成功重建并具有正确的权限,则守护进程应该可以启动。此时,将所有数据备份到 ldif 文件:
slapcat > ldap.bak.ldif
使用 LDAP 客户端,尝试操作数据(添加、编辑、删除操作),如果一切正常,那么对您来说就很好了,如果不行,请重新安装 LDAP 服务器并使用您制作的 ldif 备份恢复数据。
答案2
@Assil,谢谢你,我节省了很多时间
我的简单补充:
- 转储所有 bdb 文件
mkdir /tmp/slapd-dump
cd /var/lib/ldap
find -type f -name "*.bdb" -exec db_dump -f /tmp/slapd-dump/{} {} \
- 从转储恢复
cd /tmp/slapd-dump
find -type f -name "*.bdb" -exec db_load -f {} /var/lib/ldap/{} \;
cd /var/lib/ldap
- 刷新日志文件
rm -rf log.*
db_recover
- 手动启动 slapd
sudo -u ldap slapd
杀死 slapd
将 slapd 作为服务启动
对于正常清理的旧日志文件,请执行以下操作:
db_archive -d -h /var/lib/ldap/