Switching from TDB storage to LMDB storage

As of Samba 4.9 the domain controller can be configured to store its data in LMDB format instead of TDB format. The TDB format is a 32bit key / value library implementation. This limits the size of the database to 4GB. To get around this limitation, the Samba project has developed a new storage backend based on the LMDB library which is 32bit and 64bit compatible, which allows to push this limit. The LMDB library was developed within the OpenLDAP project.

If it is planned to store large objects (photo, etc.) or if the Active Directory will contain many users (100k and more), it is preferable to change the storage mode to LMDB.

There is currently no way to directly convert a TDB base to LMDB. To convert a domain controller to LMDB, it is necessary to demote it and join it back to the domain.

Switching a domain controller to LMDB mode

Note

In the documentation below we assume that the different machines have been installed following the different recommendations given in this documentation, notably those on the configuration DNS for RedHat8 and derived distributions, or DNS for Debian, and krb5.conf for RedHat8 and derived distributions or krb5.conf for Debian.

Note

Check beforehand that the domain controller does not hold any FSMO roles, otherwise move the FSMO roles to another domain controller before updating to LMDB.

In the documentation below, we call srvads-lmdb the AD server to switch to LMDB.

  • On the TDB domain controller to be switched to LMDB, save the database and turn off Samba:

    yum install lmdb
    samba-tool fsmo show
    systemctl stop samba
    rsync -aPAX /var/lib/samba /root/samba_backup_20191107/
    rm -Rf /var/lib/samba/*
    mkdir /var/lib/samba/private
    
  • On the FSMO PDC domain controller, start the demoting of the domain controller to be switched:

    samba-tool domaine demote --remove-other-dead-server=srvads-lmdb
    
  • Ensure that the command:demote has been propagated to all other domain controllers. To do this, you can run the command on all the controllers with your favorite automation tool:

    ldbsearch -H /var/lib/samba/private/sam.ldb 'cn=srvads-lmdb'
    
  • Once the deletion has been propagated to all domain controllers, the domain controller can be re-joined in LMDB mode. When joining, the size of the LMDB database can be changed with the parameter --backend-store-size, here set to 16GB (the default value is 8GB):

    samba-tool domain join mydomain.lan DC -U administrator --realm=MYDOMAIN.LAN -W MYDOMAIN --backend-store=mdb --backend-store-size=16Gb
    systemctl restart samba
    samba_dnsupdate --verbose
    systemctl samba_kcc