我的openldap-2.4.21服务器死了我所以检查系统日志消息,发现日志报告损坏的数据库,我试图通过发出修复:
$ /usr/bin/db4.8_recover -v -h /var/lib/ldap/ Finding last valid log LSN: file: 69 offset 120 Recovery starting from [68][84] Recovery complete at Mon Nov 7 10:32:54 2011 Maximum transaction ID 80015fb4 Recovery checkpoint [70][28]
之后,我试图启动slapd ,因为一个Unacceptable log file失败。 这个问题以前从未发生过, db4.*_recover可以随时解决问题。 我所知道的是,最近ldap utils从db4.7升级到了db4.8 。
$ /etc/init.d/slapd start $ tail -f /var/log/syslog Nov 7 10:33:08 server slapd[4083]: @(#) $OpenLDAP: slapd 2.4.21 (Jun 2 2011 19:36:19) $#012#011buildd@allspice:/build/buildd/openldap-2.4.21/debian/build/servers/slapd Nov 7 10:33:08 server slapd[4084]: hdb_db_open: database "dc=example,dc=org": unclean shutdown detected; attempting recovery. Nov 7 10:33:08 server slapd[4084]: bdb(dc=example,dc=org): Unacceptable log file /var/lib/ldap/log.0000000067: unsupported log version 15 Nov 7 10:33:08 server slapd[4084]: bdb(dc=example,dc=org): Invalid log file: log.0000000067: Invalid argument Nov 7 10:33:08 server slapd[4084]: bdb(dc=example,dc=org): PANIC: Invalid argument Nov 7 10:33:08 server slapd[4084]: bdb(dc=example,dc=org): unable to join the environment Nov 7 10:33:08 server slapd[4084]: hdb_db_open: database "dc=example,dc=org" cannot be recovered, err -30974. Restore from backup! Nov 7 10:33:08 server slapd[4084]: bdb(dc=example,dc=org): txn_checkpoint interface requires an environment configured for the transaction subsystem Nov 7 10:33:08 server slapd[4084]: bdb_db_close: database "dc=example,dc=org": txn_checkpoint failed: Invalid argument (22). Nov 7 10:33:08 server slapd[4084]: backend_startup_one (type=hdb, suffix="dc=example,dc=org"): bi_db_open failed! (-30974) Nov 7 10:33:08 server slapd[4084]: bdb_db_close: database "dc=example,dc=org": alock_close failed Nov 7 10:33:08 server slapd[4084]: slapd stopped.
如果我看看有问题的日志文件,它似乎正确创build(相同的大小和正确的权限)
$ ls -lh /var/lib/ldap -rw-r----- 1 openldap openldap 10M 2011-11-07 08:50 log.0000000065 -rw-r----- 1 openldap openldap 10M 2011-11-07 10:12 log.0000000066 -rw-r----- 1 openldap openldap 10M 2011-11-07 10:17 log.0000000067 -rw-r----- 1 openldap openldap 10M 2011-11-07 10:27 log.0000000068 -rw-r----- 1 openldap openldap 10M 2011-11-07 10:27 log.0000000069 -rw------- 1 openldap openldap 30M 2011-10-28 10:30 mail.bdb -rw------- 1 openldap openldap 2.5M 2011-10-28 10:30 objectClass.bdb -rw------- 1 openldap openldap 18M 2011-10-28 10:30 sn.bdb -rw------- 1 openldap openldap 2.2M 2011-10-28 10:30 uid.bdb
问题1:如何解决不可接受的日志文件问题?
我试着用db4.8_printlog -h /var/lib/ldap读取日志文件,到目前为止它已经运行了1个小时,显示所有logging的事务。 我会更新这个问题,如果它抛出一个错误。
另外,当我连续运行db_recovery实用程序几次,而没有重新启动slapd在此期间,我看到最后一个有效的日志文件,每次我都不期待
$ /usr/bin/db*.*_recover -v -h /var/lib/ldap/ Finding last valid log LSN: file: 71 offset 120 Recovery starting from [70][84] Recovery complete at Mon Nov 7 10:41:15 2011 Maximum transaction ID 80015fb4 Recovery checkpoint [72][28] $ /usr/bin/db*.*_recover -v -h /var/lib/ldap/ Finding last valid log LSN: file: 72 offset 120 Recovery starting from [71][84] Recovery complete at Mon Nov 7 10:43:31 2011 Maximum transaction ID 80015fb4 Recovery checkpoint [73][28]
问题2:这是正常的看到最后一个有效的日志文件更改为每个数据库恢复(没有slapd被所有使用)?
您最好使用OpenLDAP软件包中提供的实用程序:
$ rpm -ql openldap-servers | grep db_ /usr/sbin/slapd_db_archive /usr/sbin/slapd_db_checkpoint /usr/sbin/slapd_db_deadlock /usr/sbin/slapd_db_dump /usr/sbin/slapd_db_hotbackup /usr/sbin/slapd_db_load /usr/sbin/slapd_db_printlog /usr/sbin/slapd_db_recover /usr/sbin/slapd_db_stat /usr/sbin/slapd_db_upgrade /usr/sbin/slapd_db_verify
而不是从db4-utils包中获取:
/usr/bin/db_archive /usr/bin/db_checkpoint /usr/bin/db_deadlock /usr/bin/db_dump /usr/bin/db_dump185 /usr/bin/db_load /usr/bin/db_printlog /usr/bin/db_recover /usr/bin/db_stat /usr/bin/db_upgrade /usr/bin/db_verify
如果您有足够的时间进行一些基础设施的改造,我会诚恳地推荐以下内容:
(在2.4.21和2.4.39之间有丰富的新function和bug修复,但稳定的MDB支持是新版本最重要的function之一)