- Add multi-database limitations to distributed docs - Fix backup commands and add multi-database backup guidance - Add SQL migration section to schema docs - Update storage examples to use per-database paths
6.6 KiB
Backup & Recovery
BaraDB provides multiple backup strategies ranging from full snapshots to incremental and online consistent backups.
⚠️ Multi-Database Setup BaraDB supports multiple databases (
CREATE DATABASE). Each database has its own isolated data directory (e.g.data/databases/<name>/). Backup, repair, checkpoint, and migration commands operate on one directory at a time. If you use multiple databases, run the commands for each database separately or back up the entiredata/databases/parent directory.
Architecture
┌─────────────────────────────────────────┐
│ Data Directory │
│ ├── MANIFEST (atomic catalog) │
│ ├── sstables/ (SSTable v3 CRC) │
│ │ ├── 1.sst │
│ │ └── 2.sst │
│ └── wal/ │
│ ├── wal.log (active segment) │
│ └── wal_archive/ (rotated segments│
└─────────────────────────────────────────┘
Backup Tool
The backup tool is shipped as src/barabadb/core/backup.nim. Build it before use:
nim c -o:build/backup src/barabadb/core/backup.nim
SSTable Integrity (v3 CRC Footer)
Every SSTable file written by BaraDB includes a CRC32 footer:
[Header] 36 bytes
magic, version(3), entryCount, level,
indexOffset, bloomOffset, footerOffset
[Data Block]
[Index Block]
[Bloom Block]
[Footer] 16 bytes
dataCrc32, indexCrc32, bloomCrc32, reserved
This enables independent verification of each SSTable:
# Via Nim API
import barabadb/storage/lsm
let (ok, msg) = verifySSTable("data/databases/default/sstables/1.sst")
Storage Repair (baradadb repair)
If corruption is suspected, run the repair tool against a specific database directory:
# Dry run — preview only
./build/baradadb repair --data-dir=./data/databases/default --dry-run
# Full repair — verify, move corrupt files, replay WAL
./build/baradadb repair --data-dir=./data/databases/default
What repair does:
- Scans all
sstables/*.sstand verifies CRC - Moves corrupt SSTables to
<data-dir>/corrupt/ - Replays WAL to recover unflushed committed data
- Reports results
MANIFEST Catalog
The MANIFEST file is the single source of truth for active SSTables. It is updated atomically on every flush and compaction.
{
"version": 1,
"sequence": 42,
"createdAt": 1779103266,
"sstables": [
{"id": 1, "path": "sstables/1.sst", "level": 0, "minKey": "a", "maxKey": "z", "entryCount": 100}
]
}
Benefits:
- Consistent view — no orphan SSTables after crash
- Fast startup — load from MANIFEST instead of directory scan
- Orphan detection —
checkStorageConsistency()reports extra/missing files
In a multi-database setup, each database maintains its own independent MANIFEST inside its data directory.
WAL Rotation
The Write-Ahead Log rotates when it reaches 64MB:
wal/wal.log → active segment
wal/wal_archive/
├── wal.000001.log
├── wal.000002.log
└── wal.000003.log
Rotation happens:
- Every 1000 WAL entries (lightweight size check)
- On every
flush/checkpoint
Checkpoint
A checkpoint creates a consistent storage boundary without stopping the server:
./build/baradadb checkpoint --data-dir=./data/databases/default
How it works:
- Freeze memtable (swap to immutable, new memtable for writes)
- Flush frozen memtable to SSTable
- Rotate WAL
- Write MANIFEST
The freeze takes < 1ms; the flush proceeds concurrently with writes.
Backup Commands
Build the backup tool first:
nim c -o:build/backup src/barabadb/core/backup.nim
Full Backup (tar.gz)
./build/backup backup --data-dir=./data/databases/default --output=backup_$(date +%s).tar.gz
Archives the entire data directory of the specified database.
Incremental Backup
./build/backup incremental --data-dir=./data/databases/default --output=backup_inc_$(date +%s).tar.gz
Includes only:
MANIFEST- Active SSTables (from MANIFEST)
- Current WAL (
wal/wal.log) - WAL archive (
wal/wal_archive/*.log)
All SSTables are CRC-verified before archiving.
Online Consistent Backup
./build/backup backup --online --data-dir=./data/databases/default --output=backup_online_$(date +%s).tar.gz
Equivalent to:
checkpointincremental backup
Safe to run while the server is running. The checkpoint creates a consistent snapshot, then the incremental backup archives it.
SSTable Version Migration
If you have legacy v1/v2 SSTables, migrate them to v3 per database:
# Preview
./build/baradadb migrate --data-dir=./data/databases/default --dry-run
# Migrate
./build/baradadb migrate --data-dir=./data/databases/default
Migration rewrites each legacy SSTable with the current v3 format (CRC footer) and updates the MANIFEST.
Recovery Procedures
Scenario 1: Corrupt SSTable Detected
# Repair moves corrupt files and replays WAL
./build/baradadb repair --data-dir=./data/databases/default
# Verify consistency
./build/baradadb repair --data-dir=./data/databases/default --dry-run
Scenario 2: Restore from Backup (Single Database)
# Stop the server
# Extract backup into the database directory
tar -xzf backup_1234567890.tar.gz -C ./data/databases/default
# Restart — LSMTree loads from MANIFEST
./build/baradadb
Scenario 3: Restore All Databases
If you back up the entire data/databases/ tree:
# 1. Extract latest backup
tar -xzf backup_latest.tar.gz -C ./data
# 2. Run repair for each database to replay any available WAL
for db in ./data/databases/*/; do
./build/baradadb repair --data-dir="$db" --dry-run
done
# 3. Start server
./build/baradadb
Storage Requirements
| Backup Type | Size | Frequency | Retention |
|---|---|---|---|
| Full tar.gz | ~1× data size | Weekly | 4 weeks |
| Incremental | ~0.05× data size | Hourly | 24 hours |
| WAL archive | ~0.02× data size / day | Continuous | 7 days |
Best Practices
- Run repair after unclean shutdown —
./build/baradadb repair - Migrate legacy SSTables —
./build/baradadb migrate - Test restores regularly — A backup you can't restore is useless
- Use incremental + checkpoint — For frequent consistent snapshots
- Store backups offsite — S3, GCS, or another server
- Monitor MANIFEST sequence — Should grow monotonically with flushes