ClickHouse backup.

BACKUP

BACKUP TABLE events TO Disk('backups', 'events-2026-01-15.zip');
BACKUP DATABASE myapp TO Disk('backups', 'myapp-2026-01-15');
BACKUP TABLE events TO S3('https://bucket.s3.../', 'access_key', 'secret_key');

RESTORE

RESTORE TABLE events FROM Disk('backups', 'events-2026-01-15.zip');
RESTORE DATABASE myapp FROM Disk('backups', 'myapp-2026-01-15');

Incremental backup

BACKUP TABLE events TO Disk('backups', 'inc-2026-01-15')
SETTINGS base_backup = Disk('backups', 'full-2026-01-14');

FREEZE

ALTER TABLE events FREEZE;

Creates hard links in /var/lib/clickhouse/shadow/. Snapshot.

Backup script

#!/bin/bash
date=$(date +%F)
clickhouse-client --query "BACKUP DATABASE myapp TO Disk('backups', 'myapp-$date')"
aws s3 cp /var/lib/clickhouse/backups/myapp-$date s3://bucket/clickhouse/ --recursive

clickhouse-backup tool

Third-party tool:

clickhouse-backup create
clickhouse-backup upload backup-name
clickhouse-backup restore backup-name

Manages full + incremental.

Replication ≠ backup

Replica is not a backup. Bug deletes data → all replicas affected.

Common mistakes

  • Backup never restored as test.
  • Backup on same disk as data.
  • No PITR (oplog equivalent).
  • Forgetting to back up schema separately if backup tool doesn’t include.

Read this next

If you want my backup setup, it’s at rajpoot.dev .


Building something AI-, backend-, or data-heavy and want a second pair of eyes? I do consulting and freelance work — see my projects and ways to reach me at rajpoot.dev .