第 6 章 填充目录数据库

数据库包含 Red Hat Directory Server 管理的目录数据。

6.1. 导入数据

目录服务器可通过以下方法填充数据的数据库:
  • 导入数据
    重要
    要导入数据,您必须将您要导入的 LDIF 文件存储在 /var/lib/dirsrv/slapd-instance_name/ldif/ 目录中。目录服务器默认使用 PrivateTmp systemd 指令。因此,如果您将 LDIF 文件导出到 /tmp//var/tmp/ 系统目录中,Directory 服务器在导入过程中不会看到这些 LDIF 文件。有关 PrivateTmp 的更多信息,请参阅 systemd.exec (5) 手册页。
  • 为复制初始化数据库
下表描述了导入和初始化数据库之间的区别:

表 6.1. 导入方法

操作 Import 初始化数据库
覆盖数据库
LDAP 操作 添加、修改、删除 仅添加
性能 更多耗时 速度快
分区特殊 适用于所有分区 仅本地分区
对服务器故障的响应 最佳工作(所有对故障点所做的更改仍保留) Atomic (所有更改都将在失败后丢失)
LDIF 文件位置 Web 控制台本地 到 web 控制台或服务器本地
导入配置信息(cn=config)

6.1.1. 在导入过程中设置 EntryUSN Initial 值

当条目从一个服务器导出并导入到另一个服务器时,条目更新序列号(USN)不会被保留。作为 第 4.1 节 “通过更新序列号跟踪数据库修改” 解释了,为本地服务器上发生的操作分配条目 USN,因此将这些 USN 导入到另一台服务器并不有意义。
但是,在导入数据库或初始化数据库(例如,为复制初始化进行复制)时,可以为条目配置初始条目 USN 值。这可以通过设置 nsslapd-entryusn-import-initval 参数来实现,该参数为所有导入的条目设置开始 USN。
nsslapd-entryusn-import-initval 有两个可能的值:
  • 整数,这是用于每个导入条目的显式开始号。
  • 接下来,这意味着每个导入的条目都会在导入操作前在服务器上使用最高条目 USN 值的任何值,由一递增。
如果没有设置 nsslapd-entryusn-import-initval,则所有条目 USNs 从零开始。

例 6.1. nsslapd-entryusn-import-initval 参数的工作方式

例如,如果在导入或初始化操作前,服务器上的最高值为 1000,并且 nsslapd-entryusn-import-initval 值为 下一个,则每个导入的条目都会被分配一个 1001 的 USN :
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x "(cn=*)" entryusn

dn: dc=example,dc=com
entryusn: 1001
dn: ou=Accounting,dc=example,dc=com
entryusn: 1001
dn: ou=Product Development,dc=example,dc=com
entryusn: 1001
...
dn: uid=user_name,ou=people,dc=example,dc=com
entryusn: 1001
...
要为条目 USN 设置初始值,请将 nsslapd-entryusn-import-initval 参数添加到要导入数据的服务器或要执行初始化的供应商服务器中。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-entryusn-import-initval=next
注意
在 multi-supplier 复制中,nsslapd-entryusn-import-initval 参数 不会在 服务器之间复制。这意味着,该值必须专门设置用于初始化副本的供应商服务器。
例如,如果 Supplier1 主机将 nsslapd-entryusn-import-initval 设置为 next,并且用于初始化副本,则导入条目的 entry USNs 带有最高值加上一。如果 Supplier2 主机没有设置 nsslapd-entryusn-import-initval,并且用于初始化副本,则导入条目的所有条目都以零开始 - 即使 Supplier1Supplier2 在它们之间都有多层次复制协议。

6.1.2. 使用命令行导入

目录服务器支持在实例正在运行或实例离线时导入数据:
警告
当您启动导入操作时,目录服务器首先从数据库中删除所有现有的数据,然后从 LDIF 文件中导入数据。如果导入失败,例如,因为 LDIF 文件不存在,服务器已经从数据库中删除之前的数据。
请注意,用于导入操作的 LDIF 文件必须使用 UTF-8 字符集编码。导入操作不会将数据从本地字符集编码转换为 UTF-8。另外,所有导入的 LDIF 文件必须包含 root 后缀条目。
目录服务器以 dirsrv 用户身份运行导入操作。因此,LDIF 文件的权限必须允许此用户读取该文件。

6.1.2.1. 导入服务器正在运行的数据

本节论述了如何在目录服务器运行时导入数据。
6.1.2.1.1. 使用 dsconf backend 导入命令导入
使用 dsconf backend import 命令自动创建从 LDIF 文件中导入数据的任务。例如,要将 /var/lib/dirsrv/slapd-instance_name/ldif/instance_name-database_name-time_stamp.ldif 文件导入到 userRoot 数据库中:
  1. 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”
  2. 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.3.3 节 “创建根条目” 所述。
  3. 导入 LDIF 文件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend import userRoot /var/lib/dirsrv/slapd-instance_name/ldif/instance_name-database_name-time_stamp.ldif
    The import task has finished successfully
    dsconf backend import 命令支持额外的选项,例如排除特定的后缀。要显示所有可用选项,请输入:
    # dsconf ldap://server.example.com backend import --help
6.1.2.1.2. 使用 cn=tasks 条目导入数据
Directory 服务器配置中的 cn=tasks,cn=config 条目是服务器用来管理任务的临时条目的容器条目。要启动导入操作,请在 cn=import,cn=tasks,cn=config 条目中创建任务。
导入任务条目需要以下属性:
  • cn :设置任务的唯一名称。
  • nsFilename :设置要导入的 LDIF 文件的名称。
  • nsInstance :设置应导入该文件的数据库的名称。
导入任务支持额外的参数,例如排除后缀。有关完整列表,请参阅 红帽目录服务器配置、命令和文件参考 中的 cn=import 部分
例如,要添加一个任务,将 /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif 文件的内容导入到 userRoot 数据库中:
  1. 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”
  2. 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.3.3 节 “创建根条目” 所述。
  3. 添加导入任务:
    # ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
    
    dn: cn=example_import,cn=import,cn=tasks,cn=config
    changetype: add
    objectclass: extensibleObject
    cn: example_import
    nsFilename: /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif
    nsInstance: userRoot
任务完成后,该条目将从目录配置中删除。

6.1.2.2. 导入服务器为 Offline 的数据

如果在导入数据时服务器离线,请使用 dsctl ldif2db 命令:
  1. 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”
  2. 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.3.3 节 “创建根条目” 所述。
  3. 停止实例:
    # dsctl instance_name stop
  4. 从 LDIF 文件中导入数据。例如,要将 /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif 文件导入到 userRoot 数据库中:
    # dsctl instance_name ldif2db userroot /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif 
    OK group dirsrv exists
    OK user dirsrv exists
    [17/Jul/2018:13:42:42.015554231 +0200] - INFO - ldbm_instance_config_cachememsize_set - force a minimal value 512000
    ...
    [17/Jul/2018:13:42:44.302630629 +0200] - INFO - import_main_offline - import userroot: Import complete.  Processed 160 entries in 2 seconds. (80.00 entries/sec)
    ldif2db successful
    警告
    如果命令中指定的数据库与 LDIF 文件中包含的后缀不对应,数据库中包含的所有数据都会被删除,导入会失败。
  5. 启动实例:
    # dsctl instance_name start

6.1.3. 使用 Web 控制台导入数据

使用 Web 控制台从 LDIF 文件中导入数据:
  1. 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”
  2. 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.3.3 节 “创建根条目” 所述。
  3. 将您要导入的 LDIF 文件存储在 /var/lib/dirsrv/slapd-instance_name/ldif/ 目录中。
  4. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  5. 选择实例。
  6. 打开 Database 菜单。
  7. 选择后缀条目。
  8. 单击 后缀任务,然后选择 Initialize Suffix
  9. 选择要导入的 LDIF 文件,或输入到该文件的完整路径。
  10. 选择 Yes, I am sure.,然后单击 Initialize Database 进行确认。