Для создания резервной копии базы в LDIF
-файл имеются два основных инструмента – slapcat/slapadd
, работающий напрямую с базой данных, и – ldapsearch/ldapadd
, работающие через LDAP
-сессии (см. RFC 4511).
По сути, и slapcat
и slapadd
являются просто симлинками на сам slapd
:
# which slapcat /usr/sbin/slapcat
# file /usr/sbin/slapcat /usr/sbin/slapcat: symbolic link to `slapd'
# which slapadd /usr/sbin/slapadd
# file /usr/sbin/slapadd /usr/sbin/slapadd: symbolic link to `slapd'
Тогда как ldapsearch/ldapadd
– внешние утилиты, при этом ldapadd
– ссылка на утилиту ldapmodify
, котоаря азпускается с ключём -a
(Add new entries):
# which ldapsearch /usr/bin/ldapsearch
# file /usr/bin/ldapsearch /usr/bin/ldapsearch: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
# which ldapadd /usr/bin/ldapadd
# file /usr/bin/ldapadd /usr/bin/ldapadd: symbolic link to `ldapmodify'
slapcat/ldapsearch
утилиты имеют некоторые различия, хотя оба предоставляют информацию в формате LDIF
(LDAP Data Interchange Format – см. RFC 2849)
Содержание slapcat/slapadd |
ldapsearch/ldapadd |
---|---|
предоставляет все атрибуты (пользовательские и операционные); | по умолчанию предоставляет только пользовательские атрибуты; |
сортирует данные в файле вывода в порядке выборки из БД; | сортирует данные соответственно структуре каталога; |
требует остановки работы сервера (кроме случаев использования баз BDB/HDB, slapdd – требуется остановки в любом случае ); |
не требует остановки сервера; |
для восстановления из файла ldif требует утилиту slapadd ; |
для восстановления из файла ldif требует утилиту ldapadd ; |
не требует указания данных доступа к LDAP-серверу; | требует указания данных доступа к LDAP-серверу (если другое не указано в конфигурации сервера); |
т.к. slapcat работает напрямую с базой – на него не распространяются ограничения sizeLimit и т.п.; |
т.к. ldapsearch работает через LDAP-сессии, а именно – LDAP-операцию search , на его запросы накладываются ограничения (limits ), такие как sizeLimit . |
Это – основные различия в этих инструментах.
Перейдём к примерам выполнения бекапа / восстановления базы.
Найдём имеющиеся DIT (Directory Information Tree, так же – namingContexts
):
$ ldapsearch -x -b '' -s base '(&)' namingContexts -LLL dn: namingContexts: dc=db_1 namingContexts: dc=db_2
Создание резервной копии базы LDAP с использованием утилиты slapcat
:
$ slapcat -f /etc/openldap/slapd.conf -b "dc=db_1" -l db_1.ldif
Используемые ключи:
-f
– необязательный параметр, указание файла конфигурации (ключ -F
в случае использования cn=condig
);
-b
– namingContext
, или DIT, для которого необходимо выполнить операцию;
-l
– файл, в который будет выполнено копирование данных.
Другие ключи:
-nN
– указание порядкового номера DIT, для которого необходимо выполнить операцию, при этом база cn=config
всегда имеет -n 0
, остальные – в порядке перечисления их в конфигурации;
-a filter
– выполнение операции только для записей, попадающих под заданный фильтр;
-c
– игнорировать сообщения об ошибках копирования;
-d - debug-level
(см. loglevel или русский перевод тут>>>);
-v - verbose
, включить подробный режим выполнения.
Содержимое полученного файла будет выглядеть примерно так:
$ cat db_1_backup.ldif dn: dc=db_1 objectClass: dcObject objectClass: organization objectClass: top dc: db_1 o: db_modified structuralObjectClass: organization entryUUID: fff0638c-2f3f-1033-9e36-f1c476873c78 creatorsName: cn=root,dc=db_1 createTimestamp: 20140221123241Z entryCSN: 20140221123241.063251Z#000000#000#000000 modifiersName: cn=root,dc=db_1 modifyTimestamp: 20140221123241Z
Перед использованием slapadd
– останавливаем сервер:
# service slapd stop Stopping slapd: [ OK ]
Теперь – удалим имеющиеся файлы базы db_1
, кроме файла DB_CONFIG
:
# cd /var/lib/ldap/db_1/ # ls -1 | grep -v "^DB_CONFIG" | xargs rm -r
Выполняем slapadd
, с помощью ключа -l
указываем файл, из которого необходимо восстановить данные:
$ slapadd -l db_1_backup.ldif bdb_monitor_db_open: monitoring disabled; configure monitor database to enable _#################### 100.00% eta none elapsed none fast! Closing DB...
Запускаем сервер:
# service slapd start Starting slapd: [ OK ]
С помощью ldapsearch
проверяем нашу базу:
$ ldapsearch -D "cn=root,dc=db_1" -wMyS -b "dc=db_1" "dc=db_1" -LL version: 1 dn: dc=db_1 objectClass: dcObject objectClass: organization objectClass: top dc: db_1 o: db_modified
База восстановлена до первоначального состояния.
Теперь – выполним резервное копирование с помощью утилиты ldapsearch
и перенаправим стандартный поток вывода утилите tee
, которая запишет его в файл db_1_backup2.ldif
:
$ ldapsearch -D "cn=root,dc=db_1" -wMyS -b "dc=db_1" -LLL > db_1_backup2.ldif dn: dc=db_1 objectClass: dcObject objectClass: organization objectClass: top dc: db_1 o: db_modified
Тут ключи:
-D
– пользователь, от имени которого выполняется запрос;
-w
– пароль (используйте -W
, что бы не указывать его явно в строке запроса, будет выдано приглашение на ввод пароля);
-b
– DIT, в котором выполнять поиск;
-L (-LL, -LLL)
– формат выводимой информации (-L - LDIFv1
, -LL
– отключить вывод комментариев, -LLL
– отключение отображения версии LDIF
).
Удаляем информацию из DIT:
$ ldapdelete -v -D "cn=root,dc=db_1" -W -r "dc=db_1" ldap_initialize( <DEFAULT> ) Enter LDAP Password: deleting entry "dc=db_1"
Тут ключ -r
для рекурсивного удаления всех записей.
Выполняем ldapadd
из созданного файла:
$ ldapadd -x -D "cn=root,dc=db_1" -W -f db_1_backup2.ldif -v ldap_initialize( <DEFAULT> ) Enter LDAP Password: add objectClass: dcObject organization top add dc: db_1 add o: db_modified adding new entry "dc=db_1" modify complete
Проверяем:
$ ldapsearch -D "cn=root,dc=db_1" -wMyS -b "dc=db_1" "dc=db_1" -LL version: 1 dn: dc=db_1 objectClass: dcObject objectClass: organization objectClass: top dc: db_1 o: db_modified
Данные в базе восстановлены.
Ссылки по теме:
http://pro-ldap.ru
http://www.openldap.org
https://access.redhat.com
http://karellen.blogspot.com
http://supportex.net