|
| 1 | +--- |
| 2 | +icon: simple/clickhouse |
| 3 | +--- |
| 4 | + |
| 5 | +# ClickHouse Backup |
| 6 | + |
| 7 | +The `clickhouse` backup type creates backups of ClickHouse databases using the native `BACKUP`/`RESTORE` SQL commands available in ClickHouse 22.8+. |
| 8 | + |
| 9 | +## Overview |
| 10 | + |
| 11 | +- **Backup Method**: Native `BACKUP DATABASE` SQL via `clickhouse-client` |
| 12 | +- **Compression**: zstd compression |
| 13 | +- **Output Format**: `.tar.zst` containing the ClickHouse backup directory |
| 14 | +- **Restore Method**: Native `RESTORE` SQL via `clickhouse-client` |
| 15 | +- **Compatibility**: ClickHouse 22.8+ |
| 16 | + |
| 17 | +## Configuration |
| 18 | + |
| 19 | +```yaml |
| 20 | +labels: |
| 21 | + - docker-backup.enable=true |
| 22 | + - docker-backup.db.type=clickhouse |
| 23 | + - docker-backup.db.schedule=0 3 * * * |
| 24 | + - docker-backup.db.retention=7 |
| 25 | +``` |
| 26 | +
|
| 27 | +## Requirements |
| 28 | +
|
| 29 | +### Environment Variables |
| 30 | +
|
| 31 | +| Variable | Required | Default | Description | |
| 32 | +|----------|----------|---------|-------------| |
| 33 | +| `CLICKHOUSE_USER` | No | `default` | ClickHouse username | |
| 34 | +| `CLICKHOUSE_PASSWORD` | No | *(empty)* | ClickHouse password | |
| 35 | +| `CLICKHOUSE_DB` | No | *(all user DBs)* | Specific database to back up | |
| 36 | + |
| 37 | +ClickHouse works with default credentials out of the box, so no environment variables are strictly required. |
| 38 | + |
| 39 | +### Container Requirements |
| 40 | + |
| 41 | +- ClickHouse server version **22.8 or later** (for native `BACKUP`/`RESTORE` support) |
| 42 | +- `clickhouse-client` must be available in the container (included in official `clickhouse/clickhouse-server` images) |
| 43 | + |
| 44 | +## How It Works |
| 45 | + |
| 46 | +### Backup Process |
| 47 | + |
| 48 | +1. **Version Check**: Verifies `clickhouse-client` exists and ClickHouse version is >= 22.8 |
| 49 | +2. **Configure Path**: Writes a config snippet to allow `/tmp/docker-backup/` as a backup path |
| 50 | +3. **Discover Databases**: If `CLICKHOUSE_DB` is set, backs up that database only. Otherwise, queries `system.databases` and backs up all user databases (excluding `system`, `INFORMATION_SCHEMA`, `information_schema`, `default`) |
| 51 | +4. **Execute Backup**: Runs `BACKUP DATABASE ... TO File('/tmp/docker-backup/<uuid>/')` inside the container |
| 52 | +5. **Stream Out**: Tars the backup directory and streams it through zstd compression to storage |
| 53 | +6. **Cleanup**: Removes temporary backup files from the container |
| 54 | + |
| 55 | +### Backup Contents |
| 56 | + |
| 57 | +The backup file (`.tar.zst`) contains a ClickHouse native backup directory: |
| 58 | + |
| 59 | +``` |
| 60 | +backup.tar.zst |
| 61 | +└── <uuid>/ |
| 62 | + ├── .backup # Backup metadata |
| 63 | + └── data/ # Table data parts and schema |
| 64 | +``` |
| 65 | + |
| 66 | +### Restore Process |
| 67 | + |
| 68 | +1. **Decompress**: Reads the zstd-compressed tar archive |
| 69 | +2. **Extract**: Pipes the tar stream into the container, recreating the backup directory |
| 70 | +3. **Execute Restore**: Runs `RESTORE ALL FROM File('/tmp/docker-backup/<uuid>/') SETTINGS allow_non_empty_tables=true` |
| 71 | +4. **Cleanup**: Removes temporary files from the container |
| 72 | + |
| 73 | +## Example Configurations |
| 74 | + |
| 75 | +### Basic Setup |
| 76 | + |
| 77 | +```yaml |
| 78 | +services: |
| 79 | + clickhouse: |
| 80 | + image: clickhouse/clickhouse-server:latest |
| 81 | + environment: |
| 82 | + CLICKHOUSE_USER: admin |
| 83 | + CLICKHOUSE_PASSWORD: secret |
| 84 | + CLICKHOUSE_DB: analytics |
| 85 | + labels: |
| 86 | + - docker-backup.enable=true |
| 87 | + - docker-backup.db.type=clickhouse |
| 88 | + - docker-backup.db.schedule=0 3 * * * |
| 89 | + - docker-backup.db.retention=7 |
| 90 | +``` |
| 91 | + |
| 92 | +### Default Credentials |
| 93 | + |
| 94 | +ClickHouse uses `default` user with no password by default. No env vars needed: |
| 95 | + |
| 96 | +```yaml |
| 97 | +services: |
| 98 | + clickhouse: |
| 99 | + image: clickhouse/clickhouse-server:latest |
| 100 | + labels: |
| 101 | + - docker-backup.enable=true |
| 102 | + - docker-backup.db.type=clickhouse |
| 103 | + - docker-backup.db.schedule=0 3 * * * |
| 104 | + - docker-backup.db.retention=7 |
| 105 | +``` |
| 106 | + |
| 107 | +### Multiple Backup Schedules |
| 108 | + |
| 109 | +```yaml |
| 110 | +services: |
| 111 | + clickhouse: |
| 112 | + image: clickhouse/clickhouse-server:latest |
| 113 | + environment: |
| 114 | + CLICKHOUSE_USER: admin |
| 115 | + CLICKHOUSE_PASSWORD: secret |
| 116 | + CLICKHOUSE_DB: analytics |
| 117 | + labels: |
| 118 | + - docker-backup.enable=true |
| 119 | + - docker-backup.notify=telegram |
| 120 | +
|
| 121 | + # Hourly backups (short retention) |
| 122 | + - docker-backup.hourly.type=clickhouse |
| 123 | + - docker-backup.hourly.schedule=0 * * * * |
| 124 | + - docker-backup.hourly.retention=24 |
| 125 | + - docker-backup.hourly.storage=local-fast |
| 126 | +
|
| 127 | + # Daily backups (long retention) |
| 128 | + - docker-backup.daily.type=clickhouse |
| 129 | + - docker-backup.daily.schedule=0 2 * * * |
| 130 | + - docker-backup.daily.retention=30 |
| 131 | + - docker-backup.daily.storage=s3 |
| 132 | +``` |
| 133 | + |
| 134 | +### With S3 Storage |
| 135 | + |
| 136 | +```yaml |
| 137 | +services: |
| 138 | + docker-backup: |
| 139 | + image: ghcr.io/shyim/docker-backup:latest |
| 140 | + command: |
| 141 | + - daemon |
| 142 | + - --storage=s3.type=s3 |
| 143 | + - --storage=s3.bucket=my-backups |
| 144 | + - --storage=s3.region=us-east-1 |
| 145 | + - --storage=s3.access-key=AKIA... |
| 146 | + - --storage=s3.secret-key=secret |
| 147 | + - --default-storage=s3 |
| 148 | + volumes: |
| 149 | + - /var/run/docker.sock:/var/run/docker.sock:ro |
| 150 | +
|
| 151 | + clickhouse: |
| 152 | + image: clickhouse/clickhouse-server:latest |
| 153 | + environment: |
| 154 | + CLICKHOUSE_USER: admin |
| 155 | + CLICKHOUSE_PASSWORD: secret |
| 156 | + CLICKHOUSE_DB: analytics |
| 157 | + labels: |
| 158 | + - docker-backup.enable=true |
| 159 | + - docker-backup.db.type=clickhouse |
| 160 | + - docker-backup.db.schedule=0 3 * * * |
| 161 | + - docker-backup.db.retention=7 |
| 162 | + - docker-backup.db.storage=s3 |
| 163 | +``` |
| 164 | + |
| 165 | +## Manual Operations |
| 166 | + |
| 167 | +### Trigger Backup |
| 168 | + |
| 169 | +```bash |
| 170 | +docker-backup backup run clickhouse |
| 171 | +``` |
| 172 | + |
| 173 | +### List Backups |
| 174 | + |
| 175 | +```bash |
| 176 | +docker-backup backup list clickhouse |
| 177 | +``` |
| 178 | + |
| 179 | +Output: |
| 180 | +``` |
| 181 | +KEY SIZE DATE |
| 182 | +clickhouse/db/2024-01-15/030000.tar.zst 2.1 MB 2024-01-15 03:00:00 |
| 183 | +clickhouse/db/2024-01-14/030000.tar.zst 2.0 MB 2024-01-14 03:00:00 |
| 184 | +``` |
| 185 | + |
| 186 | +### Restore Backup |
| 187 | + |
| 188 | +```bash |
| 189 | +docker-backup backup restore clickhouse "clickhouse/db/2024-01-15/030000.tar.zst" |
| 190 | +``` |
| 191 | + |
| 192 | +!!! warning "Restore Behavior" |
| 193 | + Restoring will: |
| 194 | + |
| 195 | + - Recreate databases and tables included in the backup |
| 196 | + - Use `allow_non_empty_tables=true`, which may mix existing data with restored data |
| 197 | + - Not affect databases not included in the backup |
| 198 | + |
| 199 | +## Troubleshooting |
| 200 | + |
| 201 | +### "clickhouse-client not found" Error |
| 202 | + |
| 203 | +Ensure you're using an official ClickHouse Docker image (`clickhouse/clickhouse-server`), which includes the client binary. Minimal or custom images may not have it. |
| 204 | + |
| 205 | +### "version X.Y is too old" Error |
| 206 | + |
| 207 | +Native `BACKUP`/`RESTORE` requires ClickHouse 22.8 or later. Upgrade your ClickHouse image: |
| 208 | + |
| 209 | +```yaml |
| 210 | +image: clickhouse/clickhouse-server:latest |
| 211 | +``` |
| 212 | + |
| 213 | +### "Path is not allowed for backups" Error |
| 214 | + |
| 215 | +docker-backup automatically configures the backup path on first run. If you see this error, it may indicate the config reload failed. Verify the ClickHouse server can write to `/tmp/docker-backup/`: |
| 216 | + |
| 217 | +```bash |
| 218 | +docker exec clickhouse ls -la /etc/clickhouse-server/config.d/ |
| 219 | +``` |
| 220 | + |
| 221 | +### Large Databases |
| 222 | + |
| 223 | +For very large ClickHouse databases, consider: |
| 224 | + |
| 225 | +1. Setting `CLICKHOUSE_DB` to back up a specific database instead of all databases |
| 226 | +2. Backing up during low-traffic periods to minimize I/O impact |
| 227 | +3. Ensuring sufficient temporary disk space inside the container (backup is staged at `/tmp/docker-backup/` before streaming) |
0 commit comments