2.2. 创建和维护数据库

创建后缀以整理目录数据后,创建数据库以包含该目录的数据。
注意
如果您使用 dsconf 实用程序或 Web 控制台创建后缀,目录服务器会自动创建数据库。

2.2.1. 创建数据库

目录树可以通过多个目录服务器数据库分发。在多个数据库间分发数据的方法有两种:
每个后缀有一个数据库。每个后缀的数据都包含在单独的数据库中。
添加三个数据库来存储独立后缀中包含的数据:
树单元的这个划分对应于三个数据库,例如:
在本例中,DB1 包含 ou=body 的数据以及 dc=example,dc=com 的数据,因此客户端可以根据 dc=example,dc=com 进行搜索。但是,DB2 仅包含 ou=groups 的数据,DB3 仅包含 ou=contractors 的数据:
一个后缀的多个数据库。
假设目录树的 ou=body 分支中的条目数量较大,因此需要两个数据库来存储它们。在这种情况下,ou=body 中包含的数据 可以在两个数据库中分发:
DB1 包含来自 A-K、DB2 的名称的人员,DB2 则包含来自 L-Z 的人。DB3 包含 ou=groups 数据,DB4 包含 ou=contractors 数据。
自定义插件可在多个数据库之间从单个后缀分发数据。请联络红帽咨询,了解如何为目录服务器创建分发逻辑。

2.2.1.1. 使用命令行为单后缀创建新数据库

使用 ldapmodify 命令行工具向目录配置文件添加新数据库。数据库配置信息存储在 cn=ldbm database,cn=plugins,cn=config 条目中。添加新数据库:
  1. 运行 ldapmodify,并为新数据库创建条目。
    # ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: cn=UserData,cn=ldbm database,cn=plugins,cn=config
    changetype: add
    objectclass: extensibleObject
    objectclass: nsBackendInstance
    nsslapd-suffix: ou=people,dc=example,dc=com
    添加的条目对应于名为 UserData 的数据库,其中包含 root 或 sub-suffix ou=body,dc=example,dc=com 的数据。
  2. 创建 root 或子修复,如 第 2.1.1.1.1 节 “使用命令行创建根后缀”第 2.1.1.2.1 节 “使用命令行创建子修复” 所述。DN 属性中给出的数据库名称必须与后缀条目的 nsslapd-backend 属性中的值对应。

2.2.1.2. 为单个后缀添加多个数据库

单个后缀可以在多个数据库之间分布。但是,若要分发后缀,必须创建自定义分发功能来扩展目录。有关创建自定义发布功能的更多信息,请联系红帽咨询。
注意
分发条目后,无法重新分发它们。适用以下限制:
  • 部署条目分发后无法更改分发功能。
  • 如果将 LDAP modrdn 操作分发到不同的数据库中,则无法使用 LDAP modrdn 操作来重命名条目。
  • 无法复制分布式本地数据库。
  • 如果将它们分发到不同的数据库中,则无法使用 ldapmodify 操作来更改条目。
违反这些限制可防止目录服务器正确查找和返回条目。
创建自定义分发逻辑插件后,将其添加到目录中。
分发逻辑是后缀中声明的功能。对于到达这个后缀的每个操作都会调用此功能,包括在后缀上面启动的子树搜索操作。可使用 Web 控制台和命令行界面将分发功能插入到后缀中。
在后缀中添加自定义发布功能:
  1. 运行 ldapmodify
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
  2. 在后缀条目本身中添加以下属性,提供有关自定义分发逻辑的信息:
    dn: suffix
    changetype: modify
    add: nsslapd-backend
    nsslapd-backend: Database1
    -
    add: nsslapd-backend
    nsslapd-backend: Database2
    -
    add: nsslapd-backend
    nsslapd-backend: Database3
    -
    add: nsslapd-distribution-plugin
    nsslapd-distribution-plugin: /full/name/of/a/shared/library
    -
    add: nsslapd-distribution-funct
    nsslapd-distribution-funct: distribution-function-name
    nsslapd-backend 属性指定与此后缀关联的所有数据库。nsslapd-distribution-plugin 属性指定插件使用的库名称。nsslapd-distribution-funct 属性提供分发功能本身的名称。

2.2.2. 维护目录数据库

2.2.2.1. 在只读模式下设置数据库

当数据库处于只读模式时,您无法创建、修改或删除任何条目。当只读模式很有用时,其中一个情况是手动初始化消费者或从目录服务器备份或导出数据。只读模式可确保给定时间使用这些数据库状态的传真镜像。
命令行工具和 Web 控制台不会在导出或备份操作前自动将目录置于只读模式,因为这会使您的目录无法进行更新。但是,对于多层次复制,这可能不是问题。
2.2.2.1.1. 使用命令行在只读模式下设置数据库
要在只读模式下设置数据库,请使用 dsconf backend suffix set 命令。例如,要在只读模式下设置 o=test 后缀的数据库:
  1. 显示后缀及其对应的后端:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)
    o=test (test_database)
    这个命令显示每个后缀旁的后端数据库名称。下一步需要后缀的数据库名称。
  2. 以只读模式设置数据库:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix set --enable-readonly "test_database"
2.2.2.1.2. 使用 Web 控制台在只读模式下设置数据库
以只读模式设置数据库:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. 选择后缀条目。
  5. 选择 Database Read-Only Mode
  6. 单击 Save Configuration

2.2.2.2. 将 Entire 目录服务器置于只读模式

如果目录服务器维护多个数据库,且所有数据库都需要放在只读模式下,则可以在单个操作中完成此操作。
警告
此操作还使目录服务器配置为只读;因此,您无法更新服务器配置、启用或禁用插件,甚至重启目录服务器,即使它处于只读模式。启用只读模式后,除非您手动修改配置文件,否则 无法撤消
注意
如果目录服务器包含副本,请不要使用 只读模式,因为它将禁用复制。
2.2.2.2.1. 使用命令行将 Entire Directory Server 置于只读模式
为目录服务器启用只读模式:
  1. nsslapd-readonly 参数设置为 on
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-readonly=on
  2. 重启实例:
    # dsctl instance_name restart
2.2.2.2.2. 使用 Web 控制台将 Entire Directory Server 置于只读模式
为目录服务器启用只读模式:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Server Settings 条目。
  4. Advanced Settings 选项卡中,选择 Server Read-Only
  5. 点击 Save

2.2.2.3. 删除数据库

如果不再需要后缀,您可以删除存储后缀的数据库。
2.2.2.3.1. 使用命令行删除数据库
要删除数据库,可使用 dsconf backend delete 命令。例如,要删除 o=test 后缀的数据库:
  1. 显示后缀及其对应的后端:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)
    o=test (test_database)
    在下一步中,您需要后端数据库的名称(在后缀旁边显示)。
  2. 删除数据库:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend delete "test_database"
2.2.2.3.2. 使用 Web 控制台删除数据库
使用 Web 控制台删除数据库:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. 选择要删除的后缀,单击 后缀任务,然后选择 Delete Suffix
  5. 单击 Yes 以确认。

2.2.2.4. 更改交易日志目录

事务日志可让 Directory 服务器在实例意外关闭后恢复数据库。在某些情况下,管理员想要更改事务日志的路径。例如,要将它们存储在与目录服务器数据库不同的物理磁盘中。
注意
要实现更高的性能,请将一个更快的磁盘挂载到包含事务日志的目录,而不是更改位置。详情请查看 红帽目录服务器性能调优指南 中的相应部分。
更改事务日志目录的位置:
  1. 停止目录服务器实例:
    # dsctl instance_name stop
  2. 为事务日志创建新位置。例如:
    # mkdir -p /srv/dirsrv/instance_name/db/
  3. 设置权限,使其只启用 Directory 服务器访问该目录:
    # chown dirsrv:dirsrv /srv/dirsrv/instance_name/db/
    # chmod 770 /srv/dirsrv/instance_name/db/
  4. 从以前的事务日志目录中删除所有 __db the 文件。例如:
    # rm /var/lib/dirsrv/slapd-instance_name/db/__db.*
  5. 所有日志站 文件从之前移到新的事务日志目录中。例如:
    # mv /var/lib/dirsrv/slapd-instance_name/db/log.* \
         /srv/dirsrv/instance_name/db/
  6. 如果 SELinux 在 enforcing 模式下运行,请在目录中设置 dirsrv_var_lib_t 上下文:
    # semanage fcontext -a -t dirsrv_var_lib_t /srv/dirsrv/instance_name/db/
    # restorecon -Rv /srv/dirsrv/instance_name/db/
  7. 编辑 /etc/dirsrv/slapd-instance_name/dse.ldif 文件,并更新 cn=config,cn=ldbm database,cn=plugins,cn=config 条目下的 nsslapd-db-logdirectory 参数。例如:
    dn: cn=config,cn=ldbm database,cn=plugins,cn=config
    ...
    nsslapd-db-logdirectory: /srv/dirsrv/instance_name/db/
  8. 启动实例:
    # dsctl instance_name start