Skip to content

AxonOps — AI-Native Control Plane for Open Source Data Platforms

Cassandra SSTable Tools

Apache Cassandra provides a suite of command-line utilities for managing SSTables (Sorted String Tables) directly on disk. These tools operate at the storage layer, enabling administrators to inspect, repair, migrate, and manipulate SSTable files outside of normal Cassandra operations.


SSTables are immutable data files that store Cassandra's on-disk data. Each SSTable consists of multiple component files:

Data.db # Actual row data
Index.db # Partition index
Filter.db # Bloom filter for partition lookup
Statistics.db # SSTable metadata and statistics
Summary.db # Index summary for faster lookups
TOC.txt # Table of contents listing components
CompressionInfo.db # Compression metadata (if compressed)
Digest.crc32 # Checksum for data integrity
ScenarioTool
Bulk loading data into clustersstableloader
Recovering from SSTable corruptionsstablescrub
Verifying SSTable integritysstableverify
Upgrading after Cassandra version changesstableupgrade
Inspecting SSTable contentssstabledump
Viewing SSTable metadatasstablemetadata
Finding large partitionssstablepartitions
Splitting oversized SSTablessstablesplit
Managing repair statussstablerepairedset
Fixing LCS level issuessstablelevelreset, sstableofflinerelevel
Diagnosing tombstone issuessstableexpiredblockers
Listing SSTable filessstableutil

Stop Cassandra Before Running Most Tools

Most SSTable tools require Cassandra to be stopped before execution. Running these tools while Cassandra is active can cause:

  • Data corruption
  • Inconsistent reads
  • SSTable file conflicts
  • Unexpected behavior

Exceptions: sstablepartitions and sstableutil can run while Cassandra is active.

Terminal window
# 1. Verify Cassandra is stopped
nodetool drain # Flush and stop accepting writes
sudo systemctl stop cassandra # Stop the service
pgrep -f CassandraDaemon # Verify no process running
# 2. Backup before destructive operations
nodetool snapshot -t before_sstable_ops keyspace_name
# 3. Verify SSTable locations
ls -la /var/lib/cassandra/data/<keyspace>/<table>-*/

Tools for moving data into Cassandra clusters.

ToolDescriptionCassandra Running?
sstableloaderBulk load SSTables into a live clusterYes (target cluster)

Tools for fixing corrupted or problematic SSTables.

ToolDescriptionCassandra Running?
sstablescrubRemove corruption, preserve valid dataNo
sstableverifyCheck SSTable integrity without modificationNo

Tools for examining SSTable contents and metadata.

ToolDescriptionCassandra Running?
sstabledumpExport SSTable data as JSONNo
sstablemetadataDisplay SSTable statistics and propertiesNo
sstablepartitionsIdentify large partitionsYes (safe)
sstableexpiredblockersFind SSTables blocking tombstone removalNo
sstableutilList SSTable files for a tableYes (safe)

Tools for SSTable maintenance operations.

ToolDescriptionCassandra Running?
sstableupgradeUpgrade SSTables to current Cassandra versionNo
sstablesplitSplit large SSTables into smaller filesNo
sstablelevelresetReset LCS levels to zeroNo
sstableofflinerelevelRecalculate LCS levels offlineNo
sstablerepairedsetMark SSTables as repaired/unrepairedNo

Terminal window
# Data directory (default)
/var/lib/cassandra/data/<keyspace>/<table>-<uuid>/
# Example
/var/lib/cassandra/data/my_keyspace/users-a1b2c3d4e5f6/
# SSTable naming convention (Cassandra 3.0+)
<version>-<generation>-<format>-<component>.db
# Example: nb-1-big-Data.db
Terminal window
# List all SSTables for a table
sstableutil my_keyspace my_table
# Find Data.db files directly
find /var/lib/cassandra/data/my_keyspace/my_table-*/ -name "*Data.db"
# Find with human-readable sizes
find /var/lib/cassandra/data/my_keyspace/my_table-*/ -name "*Data.db" -exec ls -lh {} \;

When Cassandra reports SSTable corruption or fails to start:

Terminal window
# 1. Stop Cassandra
sudo systemctl stop cassandra
# 2. Identify corrupted SSTables
sstableverify my_keyspace my_table
# 3. Attempt to scrub corrupted files
sstablescrub my_keyspace my_table
# 4. If scrub fails, try with skip-corrupted
sstablescrub --skip-corrupted my_keyspace my_table
# 5. Start Cassandra
sudo systemctl start cassandra
# 6. Run repair to restore consistency
nodetool repair my_keyspace my_table

Workflow 2: Post-Upgrade SSTable Migration

Section titled “Workflow 2: Post-Upgrade SSTable Migration”

After upgrading Cassandra to a new major version:

Terminal window
# 1. Stop Cassandra after upgrade
sudo systemctl stop cassandra
# 2. Upgrade all SSTables
sstableupgrade my_keyspace my_table
# Or upgrade all tables in keyspace
for table in $(ls /var/lib/cassandra/data/my_keyspace/); do
table_name=$(echo $table | cut -d'-' -f1)
sstableupgrade my_keyspace $table_name
done
# 3. Start Cassandra
sudo systemctl start cassandra

Loading SSTables from another cluster or backup:

Terminal window
# 1. Prepare directory structure
mkdir -p /tmp/load/my_keyspace/my_table/
# 2. Copy SSTable files
cp /backup/my_keyspace/my_table/*.db /tmp/load/my_keyspace/my_table/
# 3. Load into cluster (Cassandra must be running on target)
sstableloader -d node1,node2,node3 /tmp/load/my_keyspace/my_table/
# 4. Verify data loaded
cqlsh -e "SELECT COUNT(*) FROM my_keyspace.my_table;"

Finding partitions that may cause performance issues:

Terminal window
# 1. Scan for large partitions (can run while Cassandra is up)
sstablepartitions --min-size 100MiB /var/lib/cassandra/data/my_keyspace/my_table-*/
# 2. Get detailed metadata
sstablemetadata /var/lib/cassandra/data/my_keyspace/my_table-*/nb-1-big-Data.db
# 3. Dump specific partition for analysis
sstabledump -k "problem_partition_key" /path/to/sstable-Data.db

Workflow 5: Preparing for Incremental Repair Migration

Section titled “Workflow 5: Preparing for Incremental Repair Migration”

Migrating to incremental repair:

Terminal window
# 1. Stop Cassandra
sudo systemctl stop cassandra
# 2. Mark all existing SSTables as unrepaired
find /var/lib/cassandra/data/my_keyspace/my_table-*/ -name "*Data.db" -print0 | \
xargs -0 -I {} sstablerepairedset --really-set --is-unrepaired {}
# 3. Start Cassandra
sudo systemctl start cassandra
# 4. Run incremental repair
nodetool repair -pr my_keyspace my_table

Terminal window
# View SSTable metadata
sstablemetadata /path/to/sstable-Data.db
# Dump entire SSTable as JSON
sstabledump /path/to/sstable-Data.db
# Dump specific partition
sstabledump -k "partition_key" /path/to/sstable-Data.db
# Find large partitions
sstablepartitions --min-size 50MiB /path/to/data/
# List SSTable files
sstableutil my_keyspace my_table
# Find expired tombstone blockers
sstableexpiredblockers my_keyspace my_table
Terminal window
# Verify SSTable integrity
sstableverify my_keyspace my_table
# Scrub corrupted SSTables
sstablescrub my_keyspace my_table
# Scrub with options
sstablescrub --skip-corrupted --no-validate my_keyspace my_table
Terminal window
# Upgrade SSTables after version upgrade
sstableupgrade my_keyspace my_table
# Split large SSTables (50MB default)
sstablesplit --size 100 /path/to/sstable-Data.db
# Reset LCS levels
sstablelevelreset --really-reset my_keyspace my_table
# Relevel offline
sstableofflinerelevel my_keyspace my_table
# Mark as repaired
sstablerepairedset --really-set --is-repaired /path/to/sstable-Data.db
Terminal window
# Load SSTables into cluster
sstableloader -d host1,host2 /path/to/keyspace/table/
# With throttling
sstableloader -d host1,host2 --throttle-mib 50 /path/to/keyspace/table/
# With authentication
sstableloader -d host1,host2 -u user -pw pass /path/to/keyspace/table/

Terminal window
# Check JAVA_HOME
echo $JAVA_HOME
# Check Cassandra environment
source /etc/cassandra/cassandra-env.sh
# Run with full path
/usr/share/cassandra/tools/bin/sstablemetadata /path/to/sstable
Terminal window
# Tools must run as cassandra user or with appropriate permissions
sudo -u cassandra sstablemetadata /var/lib/cassandra/data/...
# Or fix permissions
sudo chown -R cassandra:cassandra /var/lib/cassandra/data/
Terminal window
# Use sstableutil to find correct paths
sstableutil my_keyspace my_table
# Check for transaction logs indicating in-progress operations
ls /var/lib/cassandra/data/my_keyspace/my_table-*/*.log
Terminal window
# Increase heap for SSTable tools
export JVM_OPTS="-Xmx4G"
sstablescrub my_keyspace my_table
# Or edit cassandra-env.sh

SSTable Tool Guidelines

  1. Always backup first - Snapshot before running destructive tools
  2. Stop Cassandra - Most tools require Cassandra to be stopped
  3. Run as cassandra user - Ensure proper file permissions
  4. Test in staging - Validate procedures before production
  5. Monitor disk space - Some tools create temporary files
  6. Check exit codes - Verify tools completed successfully
  7. Run repair after - Restore consistency after SSTable modifications

Data Safety

  • sstablescrub may drop corrupted rows permanently
  • sstablesplit creates new files before removing originals
  • sstablerepairedset affects incremental repair behavior
  • Always have a repair strategy after SSTable modifications

ToolPurposeDocumentation
sstabledumpExport SSTable data as JSONsstabledump
sstableexpiredblockersFind tombstone blocking SSTablessstableexpiredblockers
sstablelevelresetReset LCS levels to zerosstablelevelreset
sstableloaderBulk load SSTables into clustersstableloader
sstablemetadataDisplay SSTable metadatasstablemetadata
sstableofflinerelevelRecalculate LCS levelssstableofflinerelevel
sstablepartitionsFind large partitionssstablepartitions
sstablerepairedsetManage repair statussstablerepairedset
sstablescrubRepair corrupted SSTablessstablescrub
sstablesplitSplit large SSTablessstablesplit
sstableupgradeUpgrade SSTable formatsstableupgrade
sstableutilList SSTable filessstableutil
sstableverifyVerify SSTable integritysstableverify