Создание снимка
Для резервного копирования снимков используется стандартная командаBACKUP с параметром experimental_lightweight_snapshot = true. Параметр id обязателен — он задаёт имя снимка и используется для обращения к нему в командах разблокировки и обсервабилити:
id и status, а id можно использовать для отслеживания операции в system.backups.
Создайте резервную копию отдельной таблицы в S3:
Восстановление в тот же сервис
Поскольку снимок хранит ссылки на файлы в Объектном хранилище, а не копии данных, для восстановления в новый или другой сервис ClickHouse нужен доступ к исходному Объектному хранилищу. Поэтому межсервисное восстановление через SQL не поддерживается — оно доступно только через интерфейс. Через SQL можно восстановить снимок в тот же сервис из бакета с внешней резервной копией, используяsnapshot_from_current_service = 1. В этом случае объекты считываются напрямую через диск пункта назначения, а не через механизм чтения удалённого снимка:
AS выполняет восстановление в таблицу с новым именем, сохраняя исходную таблицу. Чтобы перезаписать исходную таблицу, сначала удалите её:
Разблокировка снимка
Каждый снимок удерживает блокировки в ClickHouse Keeper, из-за которых файлы объектного хранилища, на которые он ссылается, не удаляются сборщиком мусора. После завершения восстановления — или когда снимок больше не нужен — разблокируйте его, чтобы снять эти блокировки. Есть два варианта: разблокировка на уровне системы, которая сразу снимает все блокировки снимка, и разблокировка на уровне отдельной таблицы, которая снимает блокировку только для одной таблицы, оставляя остальную часть снимка без изменений. Разблокировка на уровне системы — снимает все блокировки снимка:FROM необязательно, если пункт назначения снимка был сохранён в Keeper при создании (это видно в столбце info таблицы system.snapshot_locks):
system.snapshot_locks, а части, на которые больше не ссылаются другие снимки, пропадают из system.snapshot_parts.
Обсервабилити
system.backups
Все операции со снимками появляются вsystem.backups наряду с обычными операциями резервного копирования и восстановления. Выполните запрос к этой таблице по заданному id (или по UUID, возвращённому командой):
system.snapshot_locks
system.snapshot_locks показывает зафиксированные снимки, которые в данный момент зарегистрированы в Keeper. Когда снимок фиксируется, в Keeper создаётся узел по пути /clickhouse/snapshot/committed/{snapshot_id}. Перед удалением любой части данных сервер проверяет, не удерживает ли какой-либо зафиксированный снимок блокировку на эту часть. Если удерживает, удаление не выполняется. Блокировка сохраняется, пока вы явно не разблокируете снимок.
Каждая строка соответствует одному зафиксированному снимку. Если вы видите блокировки для снимков, у которых больше нет действительного пункта назначения резервной копии, выполните
SYSTEM UNLOCK SNAPSHOT, чтобы удалить их.
Чтобы проверить, существует ли блокировка для конкретного снимка:
system.snapshot_parts
system.snapshot_parts показывает части данных, которые в данный момент закреплены как минимум одной блокировкой снимка. Для каждой заблокированной части в Keeper существует узел по пути /clickhouse/snapshot/{table_uuid}/{part_name}, содержащий размер части в сжатом и несжатом виде. Эта таблица читает эти узлы, чтобы показать, какие части в настоящее время защищены от удаления.
На части с
snapshots_size > 1 ссылаются несколько снимков, и они не будут удалены из Объектного хранилища, пока не будут разблокированы все удерживающие их снимки.
Чтобы проверить общий объём закреплённого хранилища: