[Solved] Zimbra LDAP corrupted DB

IDC ไฟดับ ทำให้ไฟล์ db ของ LDAP พังมั้ง

อาการคือ

  • [zimbra@mail ~] zmcontrol start  แล้วทุกอย่างก็รันขึ้นมาปกติ
  • แต่ถ้ามีการล็อคอิน ก็จะล็อคอินไม่ได้ แล้ว service LDAP ก็จะ stop ไปด้วย

เนื่องจากเสียเวลาโคตรนานในการนั่งหาวิธีแก้ เพราะว่าปกติไม่ได้ใช้งาน zimbra ด้วย เลยจะจดบันทึกไว้หน่อย เผื่อผู้อื่นที่จะมีโอกาสร่วมชะตากรรมนี้

Version ที่ใช้ คือ Zimbra 8.6

[zimbra@mail ldap]$ zmcontrol -v<br>Release 8.6.0_GA_1153.RHEL6_64_20141215151155 RHEL6_64 FOSS edition.

ตอนแรกพยายามหาสิ่งผิดปกติจาก /var/log/zimbra.log แล้วเจอที่เกี่ยวกับ LDAP ก็คืออันนี้

May 18 21:28:50 cat16784 zmconfigd[15887]: Executed: /opt/zimbra/bin/ldap status norewrite returned 1 (14 - 63) (0.01 sec)

แต่จากเงื่อนงำนั้น มาหาข้อมูลอย่างอื่นเพิ่มเติมไม่ได้เลย  เลยต้องพยายามหาวิธีที่จะให้ LDAP มันพ่น log ออกมามากกว่านี้ สุดท้ายงมๆ ไป จนไปเจอพาท /opt/zimbra/data/ldap/state/run/ (เจอได้ไงจำไม่ได้) มันจะมีไฟล์ /opt/zimbra/data/ldap/state/run/slapd.args อยู่

[zimbra@mail ldap]$ cat /opt/zimbra/data/ldap/state/run/slapd.args<br>/opt/zimbra/openldap/sbin/slapd -l LOCAL0 -u zimbra -h ldap://mail.example.com:389 ldapi:/// -F /opt/zimbra/data/ldap/config

ก็เลยลองเอาคำสั่งมันมารันดูเลย  อยากรู้เวลาจังหวะ error มันจะพ่นไรมามั้ง. ตอนแรกที่รันคำสั่งตามนั้นเลย มันจะรันไม่ได้ มันจะ error เกี่ยวกับว่าเราส่ง arguments เข้าไปผิดรูปแบบ ก็เลยลองดูจาก usage ของมัน

[zimbra@mail ldap]$ /opt/zimbra/openldap/sbin/slapd --help<br>/opt/zimbra/openldap/sbin/slapd: invalid option -- '-'<br>usage: /opt/zimbra/openldap/sbin/slapd options<br> -4 IPv4 only<br> -6 IPv6 only<br> -T {acl|add|auth|cat|dn|index|passwd|test}<br> Run in Tool mode<br> -c cookie Sync cookie of consumer<br> -d level Debug level<br> -f filename Configuration file<br> -F dir Configuration directory<br> -g group Group (id or name) to run as<br> -h URLs List of URLs to serve<br> -l facility Syslog facility (default: LOCAL4)<br> -n serverName Service name<br> -o <opt>[=val] generic means to specify options; supported options:<br> slp[={on|off|(attrs)}] enable/disable SLP using (attrs)<br> -r directory Sandbox directory to chroot to<br> -s level Syslog level<br> -u user User (id or name) to run as<br> -V print version info (-VV exit afterwards, -VVV print<br> info about static overlays and backends)

โอเค ลองตัด ldapi:/// ออกดู แล้วก็เติม -d 1 เข้าไปด้วยเลย สุดท้ายเลยรันที่คำสั่งนี้

[root@cat16784 /]# /opt/zimbra/openldap/sbin/slapd -l LOCAL0 -u zimbra -h ldap://mail.example.com:389 ldapi:/// -F /opt/zimbra/data/ldap/config -d 1

ตอนแรกรันด้วย zimbra มันรันไม่ได้ ก็เลยรันด้วย root แทนซะ. daemon มันทำงานไปได้สักพัก ก็ตู้ม ตามคาด (คงมีคนล็อคอินเข้ามาตอนนั้นพอดี) โอเค ได้ error มาจนได้

./../../../libraries/liblmdb/mdb.c:2730: Assertion 'len >= 0 && id <= env->me_pglast' failed in mdb_freelist_save()

keyword ต่างๆ ใน error ไป google ดู  สิ้นหวัง ไม่สามารถหาข้อมูลอะไรที่เป็นเพราะโยชน์ได้เลย. โอเคแต่จาก error message ก็ทำให้เรารู้ว่าไฟล์ DB ของ LDAP มันต้องพัง (corrupted) แน่ๆ ละ เลยพยายาม google เกี่ยวกับการ recovery db แทน ก็ค่อยๆ งมไป

แล้วก็ได้มาพบกับเว็บนี้ https://blog.sajjan.com.np/2016/03/06/zimbra-recovery/ เค้าสิ้นหวังกับการซ่อม LDAP DB เค้าเลยใช้วิธี

  1. setup zimbra server ใหม่
  2. สร้าง Email account ขึ้นมาให้ครบ
  3. ย้ายอีเมล โดยใช้วิธี rsync ทีละบัญชี
  4. รันคำสั่ง zmmailbox -z -m “${user_id[1]}” addMessage /Old-Mails ไรประมาณนี้เพื่อให้ zimbra มันอัพเดท inbox ของ email นั้นมั้ง

โฮกกกก ถ้าใช้วิธีนี้เราตายแน่  แต่ก็อุ่นใจขึ้นนิดนึงว่า ถ้าที่สุดแล้วไม่สามารถแก้ปัญหาได้ ยังจะสามารถดึงข้อมูลอีเมลกลับมาได้.

พยายามงม หาทางแก้ต่อไป สุดท้ายมาเจอกับบทความนี้ https://www.tcg.com/blog/emergency-recovery-of-zimbras-openldap/ สวรรค์โปรด แนวคิดมันคือ

  1. export DB
  2. stop all services
  3. import DB
  4. start all services

ว้าว สุดยอด โคตรเรียบง่าย แต่ปัญหา คือในบทความมันเป็น HBD แต่ Zimbra ที่เราต้องแก้ปัญหา มันเป็น MDB อะ เฮือกกกกกกก โครงสร้างของไฟล์เราจะหน้าตาแบบนี้

[zimbra@mail ldap]$ find /opt/zimbra/data/ldap/mdb/<br>/opt/zimbra/data/ldap/mdb/<br>/opt/zimbra/data/ldap/mdb/db<br>/opt/zimbra/data/ldap/mdb/db/lock.mdb<br>/opt/zimbra/data/ldap/mdb/db/data.mdb<br>/opt/zimbra/data/ldap/mdb/logs

ในบล็อคมันมีให้ทำไรกับ id2entry.bdb ด้วย แต่เราไม่มีก็เลยไม่ได้ทำอะไร แล้วข้ามไปขั้นตอน zmslapcat เลย

ที่เค้าบอกในนั้น เค้าบอกว่าให้สั่ง backup ตอน while it’s running ด้วยนะ แต่ว่าของเรามันจะ stop เองนี่หว่า   ผมเลยใช้วิธีว่า พอ LDAP มัน stop เองไปแล้ว  ผมก็ไปแก้ iptables ให้บล็อค port ให้เรียบเลย จะไม่ให้มี clients ใดๆ เข้ามาล็อคอิน ให้ LDAP มันหยุดทำงานไปอีก  แล้วผมก็รัน daemon LDAP ด้วยคำสั่ง ที่ใช้ debug ว่ามันพังตรงไหนในตอนแรกนั้นแล  เสร็จแล้วก็ตามขั้นตอนนี้เลย

  1. ls /opt/zimbra/backup/
  2. สร้าง backup ไว้ใน /opt/zimbra/backup/
    /opt/zimbra/libexec/zmslapcat /opt/zimbra/backup
  3. จัดแจง rename
    cd /opt/zimbra/data/ldap/
    mv mdb mdb.old
    find mdb.old/ -type d
    mkdir -p mdb/db mdb/logs
  4. สั่ง restore โลด
    /opt/zimbra/openldap/sbin/slapadd -q -b “” -F /opt/zimbra/data/ldap/config -cv -l /opt/zimbra/backup/ldap.bak.20180518213300
  5. สั่ง start
    zmcontrol start

ในที่สุดทุกอย่างก็กลับมาเป็นปกติ สาธุ

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.