Резервное копирование и восстановление снимков
Резервное копирование снимков — это облегченный режим резервного копирования для облачных движков таблиц. Вместо копирования данных он записывает в ClickHouse Keeper узлы блокировки для каждой части. Эти блокировки не позволяют серверу удалять части в объектном хранилище, на которые есть ссылки, пока хранится снимок. Затем резервная копия сохраняет ссылки на объектное хранилище вместо физического копирования данных, поэтому снимок создается быстро независимо от размера таблицы.
Облегченный режим применяется к SharedMergeTree, SharedSet и таблицам SharedJoin. Для всех остальных типов движков — например, Log или Memory — резервное копирование автоматически переходит к стандартному варианту с копированием данных.
Создание снимка
Для резервного копирования снимков используется стандартная команда BACKUP с параметром experimental_lightweight_snapshot = true. Параметр id обязателен — он задает имя снимка и используется для обращения к нему в командах разблокировки и обсервабилити:
Команда возвращает id и status, а id можно использовать для отслеживания операции в system.backups.
Создайте резервную копию отдельной таблицы в S3:
Создайте резервную копию всей базы данных:
Создайте резервную копию всех таблиц, кроме одной:
Те же команды применимы и к Azure Blob Storage:
Восстановление в том же сервисе
Поскольку снимок хранит ссылки на файлы в объектном хранилище, а не копии данных, для восстановления в новом или другом сервисе ClickHouse требуется доступ к исходному объектному хранилищу. По этой причине межсервисное восстановление через SQL не поддерживается — оно доступно только в UI. Через 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}. Перед удалением любой части данных сервер проверяет, не удерживает ли какой-либо зафиксированный снимок блокировку этой части. Если да, удаление пропускается. Блокировка сохраняется, пока вы явно не снимете её со снимка.
| Столбец | Тип | Описание |
|---|---|---|
id | String | Идентификатор снимка |
info | String | Место назначения снимка, например S3('...') |
ctime | DateTime | Время создания этой блокировки в Keeper |
lock_path | String | Путь в Keeper для этой блокировки |
Каждая строка соответствует одному зафиксированному снимку. Если вы видите блокировки снимков, для которых больше не существует действительного места назначения резервной копии, выполните SYSTEM UNLOCK SNAPSHOT, чтобы удалить их.
Чтобы проверить, существует ли блокировка для конкретного снимка:
system.snapshot_parts
system.snapshot_parts показывает части данных, в данный момент закреплённые как минимум одной блокировкой снимка. Для каждой заблокированной части по пути /clickhouse/snapshot/{table_uuid}/{part_name} существует узел Keeper, содержащий сжатый и несжатый размеры части. Эта таблица считывает эти узлы и показывает, какие части сейчас защищены от удаления.
| Столбец | Тип | Описание |
|---|---|---|
name | String | Имя части |
table_id | String | UUID таблицы, которой принадлежит эта часть |
data_compressed_bytes | UInt64 | Размер этой части в сжатом виде |
data_uncompressed_bytes | UInt64 | Размер этой части в несжатом виде |
snapshots_size | UInt64 | Количество снимков, которые в данный момент удерживают блокировку этой части |
На части, для которых snapshots_size > 1, ссылаются несколько снимков, и они не будут удалены из Объектного хранилища, пока не будут разблокированы все удерживающие их снимки.
Чтобы проверить общий объём закреплённых данных:
Чтобы найти части, заблокированные снимком, но уже удалённые или больше не активные на сервере, — то есть данные, которые удерживаются в объектном хранилище исключительно из-за блокировок снимка:
Это полезно для оценки накладных расходов на хранение снимков после изменения или удаления исходных данных.