This is an automated email from the ASF dual-hosted git repository.
sarvekshayr pushed a commit to branch HDDS-9225-website-v2
in repository https://gitbox.apache.org/repos/asf/ozone-site.git
The following commit(s) were added to refs/heads/HDDS-9225-website-v2 by this
push:
new 2d25e6882 HDDS-14405. [Website v2] [Docs] [Administrator Guide] Tools:
LDB Tool (#236)
2d25e6882 is described below
commit 2d25e68825b1cc9375c3325dd3e456cc8a3332d3
Author: Eric C. Ho <[email protected]>
AuthorDate: Mon Jan 12 12:59:39 2026 +0800
HDDS-14405. [Website v2] [Docs] [Administrator Guide] Tools: LDB Tool (#236)
---
cspell.yaml | 1 +
.../05-administrator-guide/03-operations/13-ldb.md | 454 +++++++++++++++++++++
2 files changed, 455 insertions(+)
diff --git a/cspell.yaml b/cspell.yaml
index cfd9dae2f..14c2407be 100644
--- a/cspell.yaml
+++ b/cspell.yaml
@@ -120,6 +120,7 @@ words:
- keytab
- Keytab
- RocksDB
+- LDB
- hsync
- SASL
- jira
diff --git a/docs/05-administrator-guide/03-operations/13-ldb.md
b/docs/05-administrator-guide/03-operations/13-ldb.md
new file mode 100644
index 000000000..86b98ab9b
--- /dev/null
+++ b/docs/05-administrator-guide/03-operations/13-ldb.md
@@ -0,0 +1,454 @@
+---
+sidebar_label: LDB Tool
+---
+
+# LDB Tool
+
+Ozone heavily uses RocksDB for storing metadata.
+This tool helps parse the contents of RocksDB belonging to Ozone Roles.
+Supported DB's : Ozone Manager (`om.db`) , StorageContainerManager (`scm.db`),
Datanode/Container (`container.db`)
+Below is the usage:
+
+```bash
+Usage: ozone debug ldb --db=<dbPath> [COMMAND]
+Parse rocksdb file content
+ --db=<dbPath> Database File Path
+Commands:
+ scan Parse specified metadataTable
+ list_column_families, ls list all column families in db.
+ value-schema Schema of value in metadataTable
+ checkpoint Create checkpoint for specified db
+```
+
+## list_column_families command
+
+`list_column_families` command lists all the column families in the db
provided.
+
+```bash
+$ ozone debug ldb --db=/path/to/scm.db ls
+default
+sequenceId
+revokedCertsV2
+pipelines
+crls
+crlSequenceId
+meta
+containers
+validCerts
+validSCMCerts
+scmTransactionInfos
+deletedBlocks
+statefulServiceConfig
+revokedCerts
+move
+```
+
+## scan command
+
+`scan` command parses a particular column family of a RocksDB provided and
prints the records.
+
+```bash
+Usage: ozone debug ldb scan [--compact] [--count] [--with-keys]
+ [--batch-size=<batchSize>] --cf=<tableName>
+ [--cid=<containerId>] [-d=<dnDBSchemaVersion>]
+ [-e=<endKey>] [--fields=<fieldsFilter>]
+ [--filter=<filter>] [-l=<limit>] [-o=<fileName>]
+ [-s=<startKey>] [--thread-count=<threadCount>]
+Parse specified metadataTable
+ --batch-size=<batchSize>
+ Batch size for processing DB data.
+ --cf, --column_family, --column-family=<tableName>
+ Table name
+ --cid, --container-id=<containerId>
+ Container ID. Applicable if datanode DB Schema is V3
+ --compact disable the pretty print the output
+ --count, --show-count
+ Get estimated key count for the given DB column
family
+ Default: false
+ -d, --dnSchema, --dn-schema=<dnDBSchemaVersion>
+ Datanode DB Schema Version: V1/V2/V3
+ -e, --ek, --endkey=<endKey>
+ Key at which iteration of the DB ends
+ --fields=<fieldsFilter>
+ Comma-separated list of fields needed for each value.
+ eg.) "name,acls.type" for showing name and type
+ under acls.
+ --filter=<filter> Comma-separated list of "<field>:<operator>:<value>"
+ where <field> is any valid field of the record,
+ <operator> is [EQUALS,LESSER, GREATER or REGEX].
+ (EQUALS compares the exact string, REGEX compares
+ with a valid regular expression passed, and
+ LESSER/GREATER works with numeric values), <value>
+ is the value of the field.
+ eg.) "dataSize:equals:1000" for showing records
+ having the value 1000 for dataSize,
+ "keyName:regex:^key.*$" for showing records
+ having keyName that matches the given regex.
+ -l, --limit, --length=<limit>
+ Maximum number of items to list.
+ -o, --out=<fileName> File to dump table scan data
+ -s, --sk, --startkey=<startKey>
+ Key from which to iterate the DB
+ --thread-count=<threadCount>
+ Thread count for concurrent processing.
+ --with-keys Print a JSON object of key->value pairs (default)
+ instead of a JSON array of only values.
+```
+
+By default, the contents are printed on the console, but it can be redirected
to a file using the `--out` option.
+
+- `--length` can be used to limit the number of records being printed.
+- `--count` doesn't print the records, it shows the approximate number of
records. This is not accurate.
+- `ozone debug ldb scan` command provides many filtering options to make
debugging easier, elaborated below:
+
+:::tip
+Multiple filtering options can be used together in a single command.
+:::
+
+### `--startkey` and `--endkey`
+
+As the names suggest, these options specify the keys from/until which the
iteration needs to happen.
+
+- `--startkey` specifies which key to start iterating from, it is inclusive.
+- `--endkey` specifies which key to stop iterating at, it is exclusive.
+
+```bash
+ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable --startkey=vol3
--endkey=vol5
+```
+
+```json
+{ "/vol3": {
+ "metadata" : { },
+ "objectID" : -9999,
+ "updateID" : 4000,
+ "adminName" : "om",
+ "ownerName" : "om",
+ "volume" : "vol3",
+ "creationTime" : 1707192335309,
+ "modificationTime" : 1714057412205,
+ "quotaInBytes" : 22854448694951936,
+ "quotaInNamespace" : 100000000,
+ "usedNamespace" : 1,
+ "acls" : [ {
+ "type" : "USER",
+ "name" : "om",
+ "aclScope" : "ACCESS"
+ } ],
+ "refCount" : 0
+}
+, "/vol4": {
+ "metadata" : { },
+ "objectID" : -888,
+ "updateID" : 5000,
+ "adminName" : "om",
+ "ownerName" : "om",
+ "volume" : "vol4",
+ "creationTime" : 1696280979907,
+ "modificationTime" : 1696280979907,
+ "quotaInBytes" : 2251799813685250,
+ "quotaInNamespace" : 100000000,
+ "usedNamespace" : 2,
+ "acls" : [ {
+ "type" : "USER",
+ "name" : "om",
+ "aclScope" : "ACCESS"
+ } ],
+ "refCount" : 0
+}
+ }
+```
+
+### `--fields`
+
+There are multiple fields in each record. `--fields` option allows us to
choose the specific fields to display.
+
+```bash
+ozone debug ldb --db=/path/to/om.db scan --cf=keyTable -l=1
--fields="volumeName,bucketName,keyName,keyLocationVersions.version,acls.name"
+```
+
+```json
+{ "/vol1/ozone-legacy-bucket/10T-1-terasort-input/": {
+ "keyLocationVersions" : [ {
+ "version" : 0
+ } ],
+ "keyName" : "10T-1-terasort-input/",
+ "bucketName" : "ozone-legacy-bucket",
+ "acls" : [ {
+ "name" : "om"
+ }, {
+ "name" : "scm"
+ }, {
+ "name" : "testuser"
+ } ],
+ "volumeName" : "vol1"
+}
+}
+```
+
+### `--filter`
+
+`--filter` can be used to select records whose value matches a given
condition. The filter is given in this format: `<field>:<operator>:<value>`,
+where `<field>` is any valid field from the value of the record, `<operator>`
is one of the 4 supported operations `[equals, regex, lesser, greater]`,
`<value>` is the value used for the comparison.
+
+- 'Equals' and 'regex' work with string, bool and numerical fields, 'lesser'
and 'greater' work only with numerical values.
+- Multiple filters can also be given in one command, they need to be separated
by commas.
+
+Using `equals` operator:
+
+```bash
+ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable
--filter="usedNamespace:equals:2"
+```
+
+```json
+{
+ "/vol4": {
+ "metadata": {},
+ "objectID": -888,
+ "updateID": 5000,
+ "adminName": "om",
+ "ownerName": "om",
+ "volume": "vol4",
+ "creationTime": 1696280979907,
+ "modificationTime": 1696280979907,
+ "quotaInBytes": 2251799813685250,
+ "quotaInNamespace": 100000000,
+ "usedNamespace": 2,
+ "acls": [
+ {
+ "type": "USER",
+ "name": "om",
+ "aclScope": "ACCESS"
+ }
+ ],
+ "refCount": 0
+ }
+, "/vol5": {
+ "metadata" : { },
+ "objectID" : -956599,
+ "updateID" : 45600,
+ "adminName" : "om",
+ "ownerName" : "om",
+ "volume" : "vol5",
+ "creationTime" : 1807192332309,
+ "modificationTime" : 1914057410005,
+ "quotaInBytes" : 7785494951936,
+ "quotaInNamespace" : 100000000,
+ "usedNamespace" : 2,
+ "acls" : [ {
+ "type" : "USER",
+ "name" : "om",
+ "aclScope" : "ACCESS"
+ } ],
+ "refCount" : 0
+}
+ }
+```
+
+Using `lesser` operator (`greater` operator can also be used in the same way):
+
+```bash
+ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable
--filter="usedNamespace:lesser:2"
+```
+
+```json
+{
+ "/vol2": {
+ "metadata": {},
+ "objectID": -73548,
+ "updateID": 2384,
+ "adminName": "om",
+ "ownerName": "om",
+ "volume": "vol2",
+ "creationTime": 11980979907,
+ "modificationTime": 1296280979900,
+ "quotaInBytes": 417913685250,
+ "quotaInNamespace": 100000000,
+ "usedNamespace": 1,
+ "acls": [
+ {
+ "type": "USER",
+ "name": "om",
+ "aclScope": "ACCESS"
+ }
+ ],
+ "refCount": 0
+ }
+ }
+```
+
+Using `regex` operator:
+
+```bash
+ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable
--filter="volume:regex:^v.*2$"
+```
+
+```json
+{
+ "/vol2": {
+ "metadata": {},
+ "objectID": -73548,
+ "updateID": 2384,
+ "adminName": "om",
+ "ownerName": "om",
+ "volume": "vol2",
+ "creationTime": 11980979907,
+ "modificationTime": 1296280979900,
+ "quotaInBytes": 417913685250,
+ "quotaInNamespace": 100000000,
+ "usedNamespace": 1,
+ "acls": [
+ {
+ "type": "USER",
+ "name": "om",
+ "aclScope": "ACCESS"
+ }
+ ],
+ "refCount": 0
+ }
+ }
+```
+
+Using multiple filters:
+
+```bash
+ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable
--filter="usedNamespace:equals:2,volume:regex:^.*4$"
+```
+
+```json
+{
+ "/vol4": {
+ "metadata": {},
+ "objectID": -888,
+ "updateID": 5000,
+ "adminName": "om",
+ "ownerName": "om",
+ "volume": "vol4",
+ "creationTime": 1696280979907,
+ "modificationTime": 1696280979907,
+ "quotaInBytes": 2251799813685250,
+ "quotaInNamespace": 100000000,
+ "usedNamespace": 2,
+ "acls": [
+ {
+ "type": "USER",
+ "name": "om",
+ "aclScope": "ACCESS"
+ }
+ ],
+ "refCount": 0
+ }
+ }
+```
+
+## value-schema command
+
+`value-schema` command shows the schema of the value stored in a column-family
of a RocksDB, i.e., it shows the fields stored in the value and it's datatype.
+`--depth` can be used optionally to limit the level until which the fields are
fetched.
+
+```bash
+ozone debug ldb --db=/data/metadata/om.db value-schema --cf=keyTable --depth=1
+```
+
+```json
+{
+ "OmKeyInfo" : {
+ "bucketName" : "String",
+ "metadata" : "struct",
+ "fileName" : "String",
+ "creationTime" : "long",
+ "isFile" : "boolean",
+ "acls" : "struct",
+ "keyName" : "String",
+ "replicationConfig" : "struct",
+ "encInfo" : "struct",
+ "dataSize" : "long",
+ "tags" : "struct",
+ "keyLocationVersions" : "struct",
+ "updateID" : "long",
+ "ownerName" : "String",
+ "modificationTime" : "long",
+ "parentObjectID" : "long",
+ "volumeName" : "String",
+ "fileChecksum" : "struct",
+ "objectID" : "long"
+}
+ }
+```
+
+```bash
+ozone debug ldb --db=/data/metadata/om.db value-schema --cf=keyTable
+```
+
+```json
+{
+ "OmKeyInfo" : {
+ "bucketName" : "String",
+ "metadata" : { },
+ "fileName" : "String",
+ "creationTime" : "long",
+ "isFile" : "boolean",
+ "acls" : {
+ "toStringMethod" : { },
+ "hashCodeMethod" : { },
+ "name" : "String",
+ "type" : {
+ "name" : "String",
+ "value" : "String",
+ "ordinal" : "int"
+ },
+ "aclScope" : {
+ "name" : "String",
+ "ordinal" : "int"
+ },
+ "aclBits" : "int"
+ },
+ "keyName" : "String",
+ "replicationConfig" : { },
+ "encInfo" : {
+ "ezKeyVersionName" : "String",
+ "keyName" : "String",
+ "edek" : { },
+ "cipherSuite" : {
+ "unknownValue" : {
+ "value" : "int"
+ },
+ "name" : "String",
+ "algoBlockSize" : "int",
+ "ordinal" : "int"
+ },
+ "version" : {
+ "unknownValue" : {
+ "value" : "int"
+ },
+ "name" : "String",
+ "description" : "String",
+ "version" : "int",
+ "ordinal" : "int"
+ },
+ "iv" : { }
+ },
+ "dataSize" : "long",
+ "tags" : { },
+ "keyLocationVersions" : {
+ "isMultipartKey" : "boolean",
+ "locationVersionMap" : { },
+ "version" : "long"
+ },
+ "updateID" : "long",
+ "ownerName" : "String",
+ "modificationTime" : "long",
+ "parentObjectID" : "long",
+ "volumeName" : "String",
+ "fileChecksum" : { },
+ "objectID" : "long"
+ }
+}
+```
+
+## checkpoint command
+
+`checkpoint` command takes a checkpoint of a RocksDB, at a provided path.
+
+```bash
+ozone debug ldb --db=/data/metadata/om.db checkpoint
--output=/tmp/om-checkpoint
+```
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]