恢复没有日志文件的 ldap 数据库

恢复没有日志文件的 ldap 数据库

我的一位同事意外删除了在 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

经过几个小时的尝试失败后,结果如下:

  1. 备份 /var/lib/ldap 和 /etc/openldap

tar -czf ldap.bak.gzip /var/lib/ldap /etc/openldap

  1. 在 /var/lib/ldap 中创建 bdb 文件的转储

db_dump -f 文件.dump 文件.bdb

  1. 删除 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,谢谢你,我节省了很多时间

我的简单补充:

  1. 转储所有 bdb 文件
mkdir /tmp/slapd-dump
cd /var/lib/ldap
find -type f -name "*.bdb" -exec db_dump -f /tmp/slapd-dump/{} {} \
  1. 从转储恢复
cd /tmp/slapd-dump
find -type f -name "*.bdb" -exec db_load -f {} /var/lib/ldap/{} \;
cd /var/lib/ldap
  1. 刷新日志文件
rm -rf log.*
db_recover
  1. 手动启动 slapd
sudo -u ldap slapd
  1. 杀死 slapd

  2. 将 slapd 作为服务启动

对于正常清理的旧日志文件,请执行以下操作:

db_archive -d -h /var/lib/ldap/

相关内容