<?xml version="1.0" encoding="UTF-8"?>
<!--
! CCPL HEADER START
!
! This work is licensed under the Creative Commons
! Attribution-NonCommercial-NoDerivs 3.0 Unported License.
! To view a copy of this license, visit
! http://creativecommons.org/licenses/by-nc-nd/3.0/
! or send a letter to Creative Commons, 444 Castro Street,
! Suite 900, Mountain View, California, 94041, USA.
!
! You can also obtain a copy of the license at
! trunk/opendj3/legal-notices/CC-BY-NC-ND.txt.
! See the License for the specific language governing permissions
! and limitations under the License.
!
! If applicable, add the following below this CCPL HEADER, with the fields
! enclosed by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CCPL HEADER END
!
! Copyright 2011-2015 ForgeRock AS.
!
-->
<refentry xml:id='dbtest-1'
xmlns='http://docbook.org/ns/docbook'
version='5.0' xml:lang='en'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation='http://docbook.org/ns/docbook
http://docbook.org/xml/5.0/xsd/docbook.xsd'>
<info><copyright><year>2011-2015</year><holder>ForgeRock AS.</holder></copyright></info>
<refmeta>
<refentrytitle>dbtest</refentrytitle><manvolnum>1</manvolnum>
<refmiscinfo class="software">OpenDJ</refmiscinfo>
<refmiscinfo class="version"><?eval ${docTargetVersion}?></refmiscinfo>
</refmeta>
<refnamediv>
<refname>dbtest</refname>
<refpurpose>gather OpenDJ JE database debugging information</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>dbtest <replaceable>subcommand</replaceable></command> <arg>options</arg>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para>This utility can be used to debug the JE database.</para>
</refsect1>
<refsect1>
<title>Subcommands</title>
<para>The following subcommands are supported.</para>
<variablelist>
<varlistentry>
<term><command>dbtest dump-database-container</command></term>
<listitem>
<para>Dump records from a database container</para>
<para>
Depending on database size, this subcommand can generate lots of output.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><command>dbtest list-database-containers</command></term>
<listitem>
<para>List the database containers for an entry container</para>
</listitem>
</varlistentry>
<varlistentry>
<term><command>dbtest list-entry-containers</command></term>
<listitem>
<para>List the entry containers for a root container</para>
</listitem>
</varlistentry>
<varlistentry>
<term><command>dbtest list-index-status</command></term>
<listitem>
<para>List the status of indexes in an entry container</para>
<para>
This command can take a long time to complete,
as it reads all indexes for all backends.
</para>
<para>
When you list index status, the result is a table,
followed by a "Total", which is the total number of indexes,
followed by a list of indexes with "Undefined keys" to show
the values for which the number of entries exceeded the index entry limit.
The table has the following columns.
</para>
<variablelist>
<varlistentry>
<term>Index Name</term>
<listitem>
<para>
Name of the index,
which takes the form <replaceable>attr.type</replaceable>
for attribute indexes,
and vlv.<replaceable>name</replaceable> for VLV indexes.
Some indexes are for OpenDJ directory server's internal use.
</para>
<para>
Example: <literal>givenName.substring</literal>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Index Type</term>
<listitem>
<para>
Type of the index,
which is <literal>Index</literal> for attribute indexes,
and <literal>VLVIndex</literal> for VLV indexes.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>JE Database Name</term>
<listitem>
<para>
Name of the Berkeley Java Edition database,
which reflects how OpenDJ directory server
organizes the data in the database.
</para>
<para>
Example: <literal>dc_example_dc_com_givenName.substring</literal>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Index Valid</term>
<listitem>
<para>
This is <literal>true</literal> for valid indexes.
If this is <literal>false</literal>,
the index might be degraded.
Verify the index, and rebuild the index if necessary.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Record Count</term>
<listitem>
<para>
Number of indexed keys.
Use the <command>dbtest dump-database-container</command> command
to see how many entry IDs correspond to each key.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Undefined</term>
<listitem>
<para>
Number of keys for which there are too many values
to maintain an index, based on the index entry limit.
This is recorded as <literal>-</literal> for VLV indexes.
</para>
<para>
In other words, with the default index entry limit of 4000,
if every user in your large directory has a mail address
ending in <literal>@example.com</literal>,
and a substring index is maintained for <literal>mail</literal>,
then OpenDJ directory server does not maintain indexes for
keys corresponding to substrings in <literal>@example.com</literal>.
</para>
<para>
As a result, an LDAP search with the filter
<literal>"(mail=*@example.com)"</literal> becomes an unindexed search
even though a substring index exists for the mail attribute.
By default OpenDJ directory server does not allow unindexed searches
except by privileged users.
This is usually exactly the behavior you want
in order to prevent client applications for example
from sending searches that return every user in the directory.
Clients should refine their search filters instead.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>95%, 90%, 85%</term>
<listitem>
<para>
Number of keys for which the number of values is approaching
the index entry limit, having reached the specified percentage.
This is a measure of how full the entry ID lists are.
</para>
</listitem>
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
<varlistentry>
<term><command>dbtest list-root-containers</command></term>
<listitem>
<para>List the root containers used by all JE backends</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>
<title>Options</title>
<para>The following global options are supported.</para>
<para>For other options, see <command>dbtest
<replaceable>subcommand</replaceable> --help</command>.</para>
<variablelist>
<varlistentry>
<term><option>--version</option></term>
<listitem>
<para>Display version information</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-?, -H, --help</option></term>
<listitem>
<para>Display usage information</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>
<title>Exit Codes</title>
<variablelist>
<varlistentry>
<term>0</term>
<listitem>
<para>The command completed successfully.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>&gt; 0</term>
<listitem>
<para>An error occurred.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>
<title>Examples</title>
<para>The following example displays debugging information about the
equality index for <literal>sudoUser</literal>.</para>
<screen>
$ <userinput>dbtest dump-database-container -n userRoot -b dc=example,dc=com \
-d sudoUser.equality</userinput>
<computeroutput>Indexed Value (6 bytes): %admin
Entry ID List (8 bytes): 165
Indexed Value (5 bytes): %sudo
Entry ID List (8 bytes): 164
Indexed Value (4 bytes): root
Entry ID List (8 bytes): 163
Total Records: 3
Total / Average Key Size: 13 bytes / 4 bytes
Total / Average Data Size: 24 bytes / 8 bytes</computeroutput>
</screen>
</refsect1>
</refentry>