Skip to content

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

Cassandra Restore Guide

Restoring a Cassandra cluster requires understanding both the failure scenario and the appropriate recovery method. The correct approach depends on:

  • Scope of failure: Single table, single node, rack, datacenter, or entire cluster
  • Availability of replicas: Whether healthy replicas exist to stream data from
  • Backup age: Whether the backup is within gc_grace_seconds (default 10 days)
  • Topology match: Whether source and target clusters have the same token assignments

This guide covers each failure scenario, the decision factors involved, and the restore methods available.


Understanding Cassandra’s data directory structure is essential for correct file placement during restore.

/var/lib/cassandra/data/
├── system/ ← System keyspace
│ ├── local-7ad54392bcdd35a684174e047860b377/
│ ├── peers_v2-c4325fec8a5a3595bd614e9f3c27c461/
│ └── ...
├── system_schema/ ← Schema definitions
│ ├── tables-afddfb9dbc1e30688056eed6c302ba09/
│ ├── columns-24101c25a2ae3af787c1b40ee1aca33f/
│ └── ...
├── my_keyspace/ ← User keyspace
│ ├── users-a1b2c3d4e5f6g7h8i9j0k1l2/ ← Table directory
│ │ ├── na-1-big-Data.db
│ │ ├── na-1-big-Index.db
│ │ ├── na-1-big-Filter.db
│ │ └── ...
│ └── orders-m3n4o5p6q7r8s9t0u1v2w3x4/
│ └── ...
└── another_keyspace/
└── ...

Each table directory follows the pattern:

<table_name>-<table_uuid>
ComponentDescriptionExample
Table nameThe table name as defined in schemausers
SeparatorHyphen-
Table UUID32-character unique identifiera1b2c3d4e5f6g7h8i9j0k1l2

The UUID is assigned when the table is created and is stored in system_schema.tables. This UUID is critical for restore operations.

The table UUID links the physical files to the schema definition:

Schema (system_schema.tables):
┌─────────────────────────────────────────────────────────┐
│ keyspace_name │ table_name │ id │
├───────────────┼────────────┼────────────────────────────┤
│ my_keyspace │ users │ a1b2c3d4-e5f6-g7h8-... │
└─────────────────────────────────────────────────────────┘
Data Directory:
/var/lib/cassandra/data/my_keyspace/users-a1b2c3d4e5f6g7h8i9j0k1l2/

If the UUID in the directory name does not match the UUID in system_schema.tables, Cassandra will not recognize the files.


The correct file placement depends on whether the schema already exists on the target.

When restoring to a running cluster where the table schema exists (e.g., after TRUNCATE or data corruption):

The table directory already exists with its UUID. SSTable files must be placed in this existing directory.

StepAction
1Identify existing table directory with its UUID
2Copy SSTable files from backup into this directory
3Set correct file ownership
4Run nodetool refresh to load the files

Finding the existing table directory:

The table directory is located at:

/var/lib/cassandra/data/<keyspace>/<table>-<uuid>/

Since the table name is known but the UUID may not be, locate it by listing the keyspace directory. There will be only one directory starting with the table name.

Important: Do not create a new directory with a different UUID. The files must go into the existing directory that matches the schema.

Scenario B: Schema Does Not Exist (Table Was Dropped)

Section titled “Scenario B: Schema Does Not Exist (Table Was Dropped)”

When the table was dropped and must be recreated:

StepAction
1Recreate the table using the original schema
2A new table directory is created with a new UUID
3Copy SSTable files from backup into the new directory
4Set correct file ownership
5Run nodetool refresh to load the files

Critical consideration: The new table has a different UUID than the backup. This works because:

  • SSTable files contain the data, not references to table UUIDs
  • nodetool refresh loads SSTables into whatever table directory they reside in
  • The schema (column definitions, types, clustering order) must match exactly

Schema compatibility requirements:

Schema ElementRequirement
Column namesMust match exactly
Column typesMust match exactly
Primary keyMust match exactly
Clustering orderMust match exactly
Table optionsShould match (compression, compaction, etc.)

If the schema differs, the restore will fail or produce corrupt/unreadable data.

Scenario C: Full Node Restore (Before Cassandra Starts)

Section titled “Scenario C: Full Node Restore (Before Cassandra Starts)”

When restoring an entire node from backup before starting Cassandra:

StepAction
1Ensure Cassandra is stopped
2Copy entire data directory structure from backup
3Set correct file ownership recursively
4Start Cassandra

Directory structure must be preserved exactly:

Backup structure:
/backup/node1/
├── system/
│ └── ...
├── system_schema/
│ └── ...
├── my_keyspace/
│ └── users-a1b2c3d4e5f6g7h8i9j0k1l2/
│ └── ...
Restore to:
/var/lib/cassandra/data/
├── system/
│ └── ...
├── system_schema/
│ └── ...
├── my_keyspace/
│ └── users-a1b2c3d4e5f6g7h8i9j0k1l2/
│ └── ...

When restoring system_schema along with data directories, the UUIDs will match because the schema came from the same backup.

When restoring to a cluster with different schema (different table UUIDs):

Direct file copy will not work. The target cluster has different table UUIDs in its schema.

Options:

OptionDescription
Use sstableloaderStreams data to correct locations automatically
Match UUIDs manuallyCopy system_schema from source (complex, not recommended)
Recreate schema, copy filesWorks if schema matches exactly (see Scenario B)

sstableloader is the recommended approach—it reads SSTables and streams rows to the correct nodes regardless of table UUIDs or token assignments.


Restored files must have correct ownership for Cassandra to read them.

RequirementValue
Ownercassandra (or configured user)
Groupcassandra (or configured group)
PermissionsFiles: 644, Directories: 755 (typical)

After copying files, set ownership recursively on the restored directories.

Common mistake: Copying files as root and forgetting to change ownership. Cassandra will fail to read the files and may not log a clear error.


When restoring, all components of each SSTable must be present:

File SuffixPurposeRequired
-Data.dbRow dataYes
-Index.dbPartition indexYes
-Filter.dbBloom filterYes
-Statistics.dbSSTable metadataYes
-CompressionInfo.dbCompression offsetsIf compressed
-Digest.crc32ChecksumYes
-TOC.txtComponent listingYes
-Summary.dbIndex summaryPre-4.0

All components share the same prefix (e.g., na-1-big-). If any required component is missing, the SSTable cannot be loaded.


Situation: Accidental TRUNCATE, localized data corruption, or need to recover specific table data. Other replicas are healthy and contain current data.

RequirementDetails
Backup ageMust be < gc_grace_seconds (default 10 days) to avoid data resurrection
Schema stateTable must exist with matching schema, or schema must be recreated first
Token ownershipBackup SSTables must originate from this node’s token range
Disk spaceSufficient space for restored SSTables plus compaction overhead

When restoring a single table to a single node:

Single Table Restore ProcessSingle Table Restore ProcessBefore RestoreAfter Restore + RepairNode 1 (Target)Table: EMPTY/CorruptedNode 2 (Replica)Table: Current DataNode 3 (Replica)Table: Current DataNode 1 (Target)Table: Backup + RepairedNode 2 (Replica)Table: Current DataNode 3 (Replica)Table: Current DataRepair reconciles differences:• Data in backup but deleted after → stays deleted (tombstones from replicas)• Data written after backup → streams from replicas• Data in backup matching replicas → no action needed

TRUNCATE removes all data but preserves the table schema. The table directory and UUID remain the same.

ComponentState After TRUNCATE
SchemaPreserved
Table UUIDPreserved
Data directoryExists but empty
SSTablesDeleted

Restore process:

  1. Copy backup SSTables to existing table directory
  2. Run nodetool refresh
  3. Run repair to reconcile with replicas

DROP TABLE removes the schema and all data. If auto_snapshot was enabled (default), a snapshot exists.

ComponentState After DROP
SchemaRemoved from cluster
Table UUIDNo longer exists
Data directoryDeleted (or in snapshot)
SSTablesDeleted (or in snapshot)

Restore process:

  1. Recreate table schema (must match original exactly)
  2. New table directory created with new UUID
  3. Copy backup SSTables to new directory
  4. Run nodetool refresh
  5. Run repair to reconcile

Schema matching requirement: The restored SSTables were written with a specific schema. If the recreated schema differs (different column types, missing columns, different clustering order), the restore will fail or produce corrupt data.

After nodetool refresh loads the SSTables:

EventResult
Read request for restored dataData served from restored SSTables
Read repair triggeredCompares with replicas, reconciles differences
Explicit repair runFull reconciliation with replicas
CompactionRestored SSTables compacted normally

Recommendation: Run nodetool repair on the restored table to ensure full consistency with replicas.

AxonOps provides a guided restore interface for single-table recovery, automatically handling file placement, ownership, and refresh operations.


Situation: Complete node loss due to hardware failure, disk corruption, VM termination, or need to replace infrastructure.

Failure TypeData StateRecovery Options
Disk failure (data only)LostRebuild or restore
Disk failure (OS + data)LostReplace node, rebuild or restore
Memory/CPU failureIntact on diskRepair disk, restart
VM terminated (ephemeral)LostRebuild or restore
VM terminated (persistent)Intact on volumeReattach, restart
Corruption detectedPartially intactDepends on extent

The cluster reconstructs the node’s data by streaming from other replicas. No backup required.

When to choose rebuild:

FactorFavors Rebuild
Backup availabilityNo recent backup available
Data freshnessNeed current data, not point-in-time
Cluster capacityOther nodes can handle streaming load
Network bandwidthSufficient for data transfer

Process overview:

  1. Provision replacement node with same IP address
  2. Configure with same tokens (or use auto_bootstrap)
  3. Start Cassandra—node joins cluster
  4. Data streams from replicas automatically
  5. Run repair after streaming completes

Token assignment considerations:

ApproachWhen to Use
Same tokensReplacing failed node, want predictable data distribution
auto_bootstrapJoining as “new” node, cluster rebalances
replace_addressTaking over dead node’s tokens without full bootstrap

Using replace_address:

When a node fails and cannot be restarted, use replace_address to have the replacement node assume the dead node’s tokens:

Configure in cassandra.yaml or JVM options:

-Dcassandra.replace_address=<dead_node_ip>

The replacement node streams data for the dead node’s token ranges from replicas.

Copy the node’s backup to local storage before starting Cassandra.

When to choose restore:

FactorFavors Restore
Cluster loadOther nodes already stressed
Data volumeLarge dataset would take hours to stream
Network constraintsLimited bandwidth between nodes
Backup recencyRecent backup available locally

Process overview:

  1. Provision replacement node
  2. Copy backup files to data directories (before starting Cassandra)
  3. Set correct file ownership
  4. Start Cassandra
  5. Run repair to synchronize changes since backup

Directory structure for restore:

/var/lib/cassandra/data/
├── system/ ← System tables (restore recommended)
├── system_schema/ ← Schema tables (restore recommended)
├── <keyspace>/
│ └── <table>-<uuid>/
│ ├── na-1-big-Data.db
│ ├── na-1-big-Index.db
│ └── ...

What to restore:

DirectoryRestore?Notes
User keyspacesYesPrimary data
systemOptionalLocal node state, can regenerate
system_schemaYesRequired for schema consistency
system_authYesIf using internal authentication
system_distributedOptionalRepair history, can regenerate
system_tracesNoTrace data, not critical

Restore from backup to get the node online quickly, then repair to synchronize.

Timeline comparison:
Full Rebuild:
|─────── Streaming (hours) ───────|── Repair ──|
↑ Node serving reads
Hybrid (Restore + Repair):
|── Restore ──|── Repair ──|
↑ Node serving reads (with backup data)

The hybrid approach gets the node serving reads faster, though initially with potentially stale data.

AxonOps simplifies node restore through its dashboard interface—select the node and backup point, and AxonOps handles file transfer, placement, and Cassandra restart coordination.


Situation: Multiple nodes fail simultaneously due to shared infrastructure failure (top-of-rack switch, PDU, cooling zone).

RequirementDetails
Rack-aware replicationNetworkTopologyStrategy with rack configuration
Sufficient RFRF ≥ number of racks for full redundancy
Other racks healthyAt least one complete replica set available

Before a failure occurs, verify that data is distributed across racks:

CheckExpected Result
nodetool statusShows rack assignments for all nodes
Keyspace RFMatches or exceeds rack count
Data distributionEach rack has replica for all token ranges

If RF < rack count, some data may exist on only one rack, making rack failure cause data unavailability.

ApproachWhen to Use
Wait for rack recoveryHardware issue temporary, data intact
Rebuild from other racksNo backup, other racks have data
Restore from backupMinimize load on surviving racks

When restoring multiple nodes simultaneously:

ConsiderationRecommendation
Restore orderCan restore all nodes in parallel
Startup sequenceStart nodes after all restores complete
Repair coordinationStagger repairs to avoid overload

Repair strategy for rack restore:

OptionDescription
Sequential repairOne node at a time, minimal impact
Parallel with -prEach node repairs only primary range
Subrange repairDivide ranges for finer control

Using -pr (primary range only) prevents redundant work when repairing multiple nodes:

Without -pr:
Node 1 repairs: A, B, C (including replicas)
Node 2 repairs: A, B, C (overlapping work)
Node 3 repairs: A, B, C (overlapping work)
With -pr:
Node 1 repairs: A (primary only)
Node 2 repairs: B (primary only)
Node 3 repairs: C (primary only)

Situation: Complete loss of a datacenter due to major disaster, facility failure, or regional outage.

With only one datacenter, all data must come from backups. No replicas exist elsewhere.

Critical requirements:

RequirementDetails
Complete backup setBackups from all nodes at consistent point
Schema backupMust restore before data
Configuration backupcassandra.yaml, JVM settings for each node
Topology informationToken assignments, rack layout

Restore sequence:

StepActionNotes
1Provision infrastructureSame or new hardware
2Configure CassandraSame tokens, same cluster name
3Restore schemaOn one node, schema replicates
4Restore data to all nodesParallel restore
5Start all nodesCoordinate startup
6Verify clusternodetool status, data queries

Token assignment for full restore:

ApproachWhen to Use
Same tokens as originalRestoring to same topology
New tokensRestoring to different topology, use sstableloader

If restoring with original tokens, SSTables can be copied directly. If tokens differ, data must be loaded via sstableloader for remapping.

Schema restoration:

The schema must be restored before data loading. Schema is stored in system_schema keyspace and replicates automatically once one node has it.

Options:

  • Restore system_schema directory from backup
  • Execute saved schema CQL (from DESC SCHEMA output)

With surviving datacenters, multiple recovery options exist.

Rebuild from surviving DC:

AdvantageDisadvantage
Gets current dataHigh network traffic
No backup requiredLoads surviving DC heavily
Simpler processMay take hours for large datasets

Uses nodetool rebuild <source_dc> on each restored node.

Restore from backup + repair:

AdvantageDisadvantage
Minimal impact on surviving DCRequires recent backup
Faster initial availabilityData initially stale
Predictable loadMore complex process

Choosing between approaches:

FactorFavors RebuildFavors Restore
Surviving DC capacityHighLow (already stressed)
Data volumeSmall to mediumLarge
Backup availabilityNone availableRecent backup exists
Network bandwidthHighLimited
RTO requirementsFlexibleAggressive

Rebuilding a datacenter streams significant data across the WAN:

Data VolumeEstimated Time (100 Mbps)Estimated Time (1 Gbps)
100 GB~2.5 hours~15 minutes
1 TB~25 hours~2.5 hours
10 TB~10 days~25 hours

Consider:

  • Time of day (avoid peak traffic)
  • Throttling to prevent network saturation
  • Impact on production traffic sharing the link

Situation: Need to restore the cluster to a specific moment in time, typically to recover from data corruption or accidental bulk deletion that affected all replicas.

SituationWhy Regular Restore Fails
Application bug wrote bad dataBad data replicated everywhere
Bulk DELETE ran too broadlyDeletions replicated everywhere
Ransomware encrypted dataEncryption replicated everywhere
Need exact transaction stateRegular snapshot may be before or after
ComponentPurposeStorage Location
Base snapshotStarting point for replayRemote backup storage
Commit logsRecord of all writes since snapshotArchive storage
Target timestampDesired recovery pointAdministrator-specified

Commit log archiving must be configured before the incident. PITR is not possible without archived commit logs.

AxonOps PITR provides a visual timeline interface for selecting the exact recovery point. The restore process is guided through the UI, with automatic handling of snapshot selection and commit log replay configuration.

Timeline:
├── Snapshot taken (Day 1, 00:00)
│ └── Commit logs archived continuously
├── Normal operations (Day 1-3)
│ └── Commit logs archived continuously
├── Data corruption event (Day 3, 14:30)
│ └── Commit logs archived continuously
└── PITR initiated (Day 3, 16:00)
└── Target: Day 3, 14:00 (before corruption)
Replay process:
1. Restore snapshot (Day 1, 00:00 state)
2. Replay commit logs from Day 1, 00:00 to Day 3, 14:00
3. Stop replay at target timestamp
4. Cluster now reflects Day 3, 14:00 state

The commitlog_archiving.properties file (located in $CASSANDRA_HOME/conf/) controls PITR restore behavior. AxonOps manages this file dynamically without requiring a node restart; in standard Cassandra, changes require a restart.

ParameterPurpose
restore_point_in_timeTarget timestamp for recovery
restore_directoriesPath to archived commit logs
restore_commandCommand to retrieve commit logs

The restore_point_in_time value must be in GMT. Three precisions are supported:

PrecisionFormatExample
Secondsyyyy:MM:dd HH:mm:ss2024:01:15 14:00:00
Millisecondsyyyy:MM:dd HH:mm:ss.SSS2024:01:15 14:00:00.633
Microsecondsyyyy:MM:dd HH:mm:ss.SSSSSS2024:01:15 14:00:00.633222

Note: the date separator is a colon (:), not a dash.

LimitationImplication
Cluster-wide onlyCannot PITR a single table or keyspace
All nodes requiredEvery node must restore to same point
Commit log continuityGaps in archived logs = incomplete recovery
Storage requirementsMust retain all commit logs since last usable snapshot
gc_grace_secondsTarget time must be within gc_grace window
Processing timeReplay can take significant time for large log volumes

Commit logs accumulate continuously. Storage planning:

Write RateDaily Volume7-Day Retention30-Day Retention
1,000/sec~1.2 GB~8.4 GB~36 GB
10,000/sec~12 GB~84 GB~360 GB
100,000/sec~120 GB~840 GB~3.6 TB

Multiply by node count for cluster-wide storage.


Scenario 6: Migration to Different Cluster (Same Topology)

Section titled “Scenario 6: Migration to Different Cluster (Same Topology)”

Situation: Moving data to new infrastructure with identical node count, or creating a staging environment from production.

Before choosing a restore method, compare token assignments:

ScenarioToken StateRecommended Method
Same tokens, same node countCompatibleDirect file copy + refresh
Different tokens, same node countIncompatiblesstableloader
Intentionally matchingMade compatibleDirect file copy + refresh

Checking token assignments:

Compare nodetool ring output between clusters. Tokens must match exactly for direct file copy.

When tokens match, SSTables can be copied directly because each node’s backup contains exactly the data that node should own.

Process:

StepAction
1Verify token match between clusters
2Restore schema on target cluster
3Copy node1-source backup → node1-target
4Copy node2-source backup → node2-target
5… (repeat for all nodes)
6Run nodetool refresh on each node

Advantages:

  • Fastest possible restore method
  • No data streaming or remapping
  • Minimal resource usage

Requirements:

  • Exact token match
  • Same node count
  • Schema pre-created on target

When tokens differ, sstableloader reads each SSTable and streams rows to their correct owners in the target cluster.

Why tokens might differ:

ReasonExplanation
Default token assignmentCassandra generates random tokens
Different num_tokensDifferent virtual node count
Cluster created independentlyNo coordination of token ranges

See Scenario 7 for detailed sstableloader usage.


Scenario 7: Migration to Different Cluster (Different Topology)

Section titled “Scenario 7: Migration to Different Cluster (Different Topology)”

Situation: Moving data to a cluster with different node count, different replication factor, or completely different architecture.

SourceTargetMethod Required
6 nodes6 nodes, different tokenssstableloader
6 nodes12 nodessstableloader
6 nodes3 nodessstableloader
RF=3RF=5sstableloader
Single DCMulti DCsstableloader
sstableloader Processsstableloader ProcessSSTable Files(from backup)Read partitionsfrom SSTablesCalculate tokenfor each rowQuery target clusterfor token ownershipStream rows toowning nodesTarget nodes writeas normal inserts
OptionPurpose
-d <hosts>Contact points in target cluster
-u <username>Authentication username
-pw <password>Authentication password
--throttle <MB/s>Limit streaming bandwidth
-f <config>Path to cassandra.yaml for SSL settings
--connections-per-host <n>Parallel connections per node
FactorImpactMitigation
Network bandwidthPrimary bottleneckUse --throttle, run from multiple sources
Target cluster loadWrites increaseRun during off-peak, throttle
Compaction on targetCPU and I/O spikeMonitor, may need to pause
Memory on loaderHolds data in transitEnsure sufficient heap

For large datasets, run sstableloader from multiple sources simultaneously:

Source cluster nodes:
├── Node 1: Load keyspace1, keyspace2
├── Node 2: Load keyspace3, keyspace4
└── Node 3: Load keyspace5, keyspace6
Each node loads its local backup in parallel.
Target cluster receives streams from all sources.

Coordination considerations:

AspectRecommendation
Total throughputSum of all loaders, may need throttling
Contact pointsDistribute across target nodes
MonitoringWatch target cluster metrics
Failure handlingLoader failure = restart that loader only

The target cluster must have matching schema before loading data:

Schema AspectRequirement
KeyspaceMust exist with appropriate replication
TableMust exist with matching structure
Column typesMust match source exactly
Clustering orderMust match source exactly
IndexesRecreate after data load (faster)
MVsRecreate after data load (will rebuild)

Recommendation: Export schema from source (DESC SCHEMA), apply to target before loading.


Quick reference for choosing a restore approach:

ScenarioBackup AgeReplicas AvailableRecommended Approach
Single table< gc_graceYesCopy + refresh + repair
Single table> gc_graceYesRestore to ALL nodes or accept resurrection
Single node< gc_graceYesRestore + repair or rebuild
Single node> gc_graceYesRebuild from replicas preferred
RackAnyYes (other racks)Restore parallel + staggered repair
Datacenter (multi-DC)AnyYes (other DC)Rebuild or restore + repair
Datacenter (single-DC)AnyNoFull restore, must have backup
Full clusterAnyNoFull restore, same point-in-time
PITRWithin gc_graceN/ASnapshot + commit log replay
Migration (same topo)N/AN/ADirect copy if tokens match
Migration (diff topo)N/AN/Asstableloader required

AxonOps guides operators through restore scenario selection, automatically recommending the appropriate approach based on cluster state and backup availability.


The gc_grace_seconds parameter (default: 10 days) fundamentally constrains restore options.

Cassandra uses tombstones (deletion markers) instead of immediately removing data. Tombstones must propagate to all replicas before being removed, or deleted data can “resurrect.”

PhaseDurationState
Delete issuedT=0Tombstone created
Tombstone propagationT=0 to gc_graceTombstone on all replicas
Tombstone removal eligibleT > gc_graceCompaction can remove tombstone
Tombstone removedAfter compactionNo record deletion occurred
Data Resurrection TimelineData Resurrection TimelineTimelineDay 0Backup taken(contains Row X)Day 3Row X deleted(tombstone created)Day 11gc_grace expires(tombstone removable)Day 12Compaction removestombstoneDay 15Restore backupto Node 1 only
State After Restore (Resurrection Risk)State After Restore (Resurrection Risk)Node 1Node 2Node 3Row X: EXISTS(from backup)Row X: (none)No tombstoneRow X: (none)No tombstoneDuring read or repair:• System sees Row X on Node 1• No tombstone on Nodes 2, 3 to indicate deletion• Row X streams to Nodes 2, 3 as "missing" dataDeleted data has resurrected
Backup AgeScopeSafe?Notes
< gc_graceSingle nodeYesTombstones still exist on replicas
< gc_graceSingle tableYesTombstones still exist on replicas
< gc_graceFull clusterYesAll nodes at same state
> gc_graceSingle nodeNoResurrection risk
> gc_graceSingle tableNoResurrection risk
> gc_graceFull clusterYesAll nodes at same state, no conflict

Default is 864000 seconds (10 days).

Per-table setting viewable via:

  • Schema: DESC TABLE keyspace.table
  • System tables: Query system_schema.tables

If restoring a backup older than gc_grace_seconds:

OptionDescriptionTrade-off
Full cluster restoreRestore all nodes from same backupLose data newer than backup
Accept resurrectionRestore anyway, deal with resurrected dataMay have data inconsistency
Increase gc_grace firstSet higher gc_grace, wait for propagation, then restoreComplex, delays restore
Manual cleanupRestore, identify resurrected data, delete againLabor intensive

Purpose: Load SSTables from disk into a running Cassandra node.

How it works:

  1. Scans table’s data directory for SSTable files not yet loaded
  2. Adds new SSTables to the table’s live SSTable set
  3. Data immediately available for reads
  4. No streaming—purely local operation

Requirements:

  • Cassandra must be running
  • SSTables must be in correct table directory
  • File ownership must be correct (cassandra:cassandra)
  • SSTables must belong to this node’s token range

Limitations:

  • Does not remap data to different token ranges
  • Does not validate SSTable integrity
  • Does not trigger repair

Purpose: Stream all data for the local node’s token ranges from another datacenter.

How it works:

  1. Contacts specified source datacenter
  2. Identifies all token ranges owned locally
  3. Streams data for those ranges from source DC
  4. Writes received data as local SSTables

When to use:

  • Rebuilding a datacenter from surviving DC
  • Adding a new datacenter to existing cluster
  • No backup available but other DC has data

Requirements:

  • At least one other datacenter with complete data
  • Network connectivity to source DC
  • Sufficient bandwidth for data volume

Purpose: Stream SSTable data to a cluster with automatic token-based routing.

How it works:

  1. Reads SSTable files from specified directory
  2. Contacts target cluster for token ring information
  3. For each partition, calculates owning nodes
  4. Streams data to appropriate nodes
  5. Target nodes write data normally

When to use:

  • Migrating between clusters with different topologies
  • Restoring when token assignments don’t match
  • Loading data from any source to any target

Considerations:

  • Slower than direct copy (full streaming)
  • Target cluster experiences write load
  • May trigger compaction on target nodes
  • Schema must exist before loading

Purpose: Copy SSTable files directly to data directory for fastest possible restore.

How it works:

  1. Copy SSTable files to table directory
  2. Set correct ownership
  3. Use nodetool refresh to load

When to use:

  • Restoring to same node or identical topology
  • Token ranges match exactly between source and target
  • Maximum restore speed required

Requirements:

  • Exact token match between source and target
  • Correct directory structure
  • Correct file permissions
  • Schema must exist

CheckPurposeMethod
Cluster statusAll nodes joinednodetool status
Table accessibleSchema correctQuery table
Data presentRows existSELECT COUNT(*) or sample queries
No errors in logsClean startupCheck system.log
CheckPurposeMethod
Run repairSynchronize replicasnodetool repair
Verify dataSSTable integritynodetool verify
Compare countsExpected vs actualApplication-level checks
CheckPurpose
Known record queriesVerify specific expected data
Application health checksEnd-to-end functionality
Integration testsFull application flow
User acceptanceBusiness validation

AxonOps Backup & Restore provides guided restore operations through its dashboard:

Snapshot Restore:

  • Browse available backups by date and time
  • Select individual tables, keyspaces, or full node restore
  • Automatic file placement and ownership handling
  • Progress tracking with detailed status updates

Point-in-Time Recovery:

  • Visual timeline for selecting exact recovery point
  • Automatic base snapshot selection
  • Managed commit log replay configuration
  • Validation of target timestamp feasibility

Restore Validation:

  • Automatic integrity verification of restored data
  • Schema compatibility checking before restore
  • Post-restore health verification
  • Repair recommendations based on restore scope

See AxonOps Restore Operations for detailed procedures.