Процедура бекапа и восстановления в Clickhouse связана с прямыми операциями с файлами и не требует никаких дополнительных инструментов. Физически эта база данных оперирует не таблицами, а партициями — частями таблиц.

Бекап данных

Бекапы в Clickhouse делается в два этапа:

  1. Заморозка данных (партиций).
  2. Копирование данных на внешний сервер.

Первым шагом необходимо выполнить т.н. "заморозку" данных на диске. Сначала нужно получить список всех таблиц и их партиций той базы данных, которую мы собираемся бекапить:

SELECT partition, table, database FROM system.parts WHERE active AND database = 'default';

# список партиций и таблиц базы дынных default

Примерный ответ от сервера:

┌─partition─┬─table─────┬─database─┐
│ 197510    │ carts     │ default  │
...

После этого каждую партицию каждой таблицы необходимо заморозить:

ALTER TABLE  default.carts FREEZE PARTITION '197510';

# замораживаем партицию 197510 таблицы carts

После заморозки партиций Clickhouse создает в директории /var/lib/clickhouse/shadow/N/ бекапы с такой же структурой как и в основной папке данных. N — инкрементальный номер бекапа. Данные создаются жесткими ссылками — почти моментально даже для больших таблиц.

Данные внутри папки с бекапом будут выглядеть так:

root@ruhighload:/var/lib/clickhouse/shadow/1/data/default# ls -la
total 12
drwxr-x--- 3 clickhouse clickhouse 4096 May 28 14:06 .
drwxr-x--- 3 clickhouse clickhouse 4096 May 28 14:06 ..
drwxr-x--- 3 clickhouse clickhouse 4096 May 28 14:06 carts

# структура данных будет такой же, как и в папке с данными

Далее достаточно скопировать данные из папки /var/lib/clickhouse/shadow/ на резервный сервер (после этого можно удалить их из этой папки) либо оставить в этой папке.

Кроме данных таблиц, имеет смысл также копировать их метаданные. В папке /var/lib/clickhouse/metadata/[БД] будут лежать SQL файлы с определением структуры таблиц. В нашем случае необходимо скопировать:

cp /var/lib/clickhouse/metadata/default/carts.sql /mnt/s3/backup.sql

# копируем файл со структурой таблицы

Восстановление данных

Процедура восстановления зеркальная. Восстановим данные в базе данных restored:

CREATE DATABASE restored
Первым делом необходимо создать таблицы, выполнив запросы из SQL файлов метаданных (не забудем изменить "ATTACH" на "CREATE" в файлах с метаданными):
sed 's/ATTACH/CREATE/g' /mnt/s3/backup.sql | clickhouse-client --database restored

# создаем таблицы в базе данных restored

После этого скопируем данные в папку /var/lib/clickhouse/data/[БД]/[таблица]/detached/:

cp -r /mnt/s3/cart /var/lib/clickhouse/data/restored/carts/detached/

# внутри папки cart будут папки партиций в виде 19751006_19751020_1_4_1

Убедимся, что у Clickhouse будут права на чтение и запись файлов:

chown clickhouse:clickhouse /var/lib/clickhouse/data/restored/carts/ -R

После этого необходимо для всех партиций таблиц выполнить ATTACH:

ALTER TABLE restored.carts ATTACH PARTITION '197510'

# Выполняем для всех партиций

Готово, с таблицей можно работать:

SELECT *
FROM restored.carts 

┌─cart_id─┬─product_id─┬─count─┬─added_date─┬──────────added_time─┐
│       1 │          1 │     1 │ 1975-10-06 │ 2018-03-24 11:11:36 │
│       2 │          1 │     1 │ 1975-10-16 │ 2018-03-24 11:11:46 │
│       1 │          2 │     1 │ 1975-10-11 │ 2018-03-24 11:11:41 │
│       3 │          3 │     1 │ 1975-10-20 │ 2018-03-24 11:11:50 │
└─────────┴────────────┴───────┴────────────┴─────────────────────┘

4 rows in set. Elapsed: 0.003 sec.

TL;DR

Бекапы в Clickhouse делаются в папку /var/lib/clickhouse/shadow/ автоматически после замораживания всех партиций таблиц (ALTER TABLE ... FREEZE PARTITION ...). Файлы из этой папки можно копировать на резервный сервер. Восстановление делается копированием этих файлов обратно и выполнением ALTER TABLE ... ATTACH PARTITION ... для каждой партиции.