Перейти к основному содержанию
Перейти к основному содержанию

РЕЗЕРВНОЕ КОПИРОВАНИЕ / ВОССТАНОВЛЕНИЕ на или с S3-эндпоинта

В этой статье рассматривается создание и восстановление резервных копий в/из бакета S3 через S3-эндпоинт.

Синтаксис

-- основные команды
BACKUP | RESTORE [ASYNC]
--- что включить в резервную копию/восстановление (или исключить)
TABLE [db.]table_name           [AS [db.]table_name_in_backup] |
DICTIONARY [db.]dictionary_name [AS [db.]name_in_backup] |
DATABASE database_name          [AS database_name_in_backup] |
TEMPORARY TABLE table_name      [AS table_name_in_backup] |
VIEW view_name                  [AS view_name_in_backup] |
[EXCEPT TABLES ...] |
ALL [EXCEPT {TABLES|DATABASES}...] } [,...]
--- 
[ON CLUSTER 'cluster_name']
--- куда сохранять резервную копию или откуда выполнять восстановление
TO|FROM 
File('<path>/<filename>') | 
Disk('<disk_name>', '<path>/') | 
S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>', '<extra_credentials>') |
AzureBlobStorage('<connection string>/<url>', '<container>', '<path>', '<account name>', '<account key>')
--- дополнительные настройки
[SETTINGS ...]

Дополнительные сведения о каждой команде см. в разделе "краткий обзор команд".

Пример использования

Инкрементное резервное копирование на конечную точку S3

В этом примере мы создадим резервную копию на конечную точку S3, а затем восстановим из неё данные.

Примечание

Объяснение различий между полным и инкрементным резервным копированием см. в разделе «Типы резервных копий»

Для использования этого метода потребуется следующая информация:

ПараметрПример
Конечная точка S3https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/
Идентификатор ключа доступаBKIOZLE2VYN3VXXTP9RC
Секретный ключ доступа40bwYnbqN7xU8bVePaUCh3+YEyGXu8UOMV9ANpwL
Совет

Создание корзины S3 рассматривается в разделе «Использование объектного хранилища S3 в качестве диска ClickHouse»

Место назначения для резервной копии указывается следующим образом:

S3('<s3 endpoint>/<directory>', '<access key id>', '<secret access key>', '<extra_credentials>')

Настройка

Создайте следующую базу данных и таблицу, затем вставьте в неё случайные данные:

CREATE DATABASE IF NOT EXISTS test_db;
CREATE TABLE test_db.test_table
(
    `key` Int,
    `value` String,
    `array` Array(String)
)
ENGINE = MergeTree
ORDER BY tuple()
INSERT INTO test_db.test_table SELECT *
FROM generateRandom('key Int, value String, array Array(String)')
LIMIT 1000

Создание базовой резервной копии

Для инкрементного резервного копирования требуется базовая резервная копия в качестве отправной точки. Первый параметр места назначения S3 — это конечная точка S3, за которой следует каталог внутри корзины для данной резервной копии. В этом примере каталог называется my_backup.

Выполните следующую команду для создания базовой резервной копии:

BACKUP TABLE test_db.test_table TO S3(
'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/base_backup',
'<access key id>',
'<secret access key>'
)
┌─id───────────────────────────────────┬─status─────────┐
│ de442b75-a66c-4a3c-a193-f76f278c70f3 │ BACKUP_CREATED │
└──────────────────────────────────────┴────────────────┘

Добавление дополнительных данных

Инкрементные резервные копии содержат разницу между базовой резервной копией и текущим содержимым резервируемой таблицы. Добавьте дополнительные данные перед созданием инкрементной резервной копии:

INSERT INTO test_db.test_table SELECT *
FROM generateRandom('key Int, value String, array Array(String)')
LIMIT 100

Создание инкрементной резервной копии

Эта команда резервного копирования аналогична команде для базовой резервной копии, но добавляет SETTINGS base_backup и расположение базовой резервной копии. Обратите внимание, что место назначения для инкрементной резервной копии — это не тот же каталог, что и для базовой, а та же конечная точка с другим целевым каталогом внутри корзины. Базовая резервная копия находится в my_backup, а инкрементная будет записана в my_incremental:

BACKUP TABLE test_db.test_table TO S3(
'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/incremental_backup',
'<access key id>',
'<secret access key>'
)
SETTINGS base_backup = S3(
'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/base_backup',
'<access key id>',
'<secret access key>'
)
┌─id───────────────────────────────────┬─status─────────┐
│ f6cd3900-850f-41c9-94f1-0c4df33ea528 │ BACKUP_CREATED │
└──────────────────────────────────────┴────────────────┘

Восстановление из инкрементной резервной копии

Эта команда восстанавливает инкрементную резервную копию в новую таблицу test_table_restored.
Обратите внимание, что при восстановлении инкрементной резервной копии базовая резервная копия также включается. При восстановлении указывайте только инкрементную резервную копию:

RESTORE TABLE data AS test_db.test_table_restored FROM S3(
'https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/incremental_backup',
'<access key id>',
'<secret access key>'
)
┌─id───────────────────────────────────┬─status───┐
│ ff0c8c39-7dff-4324-a241-000796de11ca │ RESTORED │
└──────────────────────────────────────┴──────────┘

Проверка количества записей

В исходную таблицу data было выполнено две вставки: одна на 1 000 строк и одна на 100 строк, всего 1 100 строк. Убедитесь, что восстановленная таблица содержит 1 100 строк:

SELECT count()
FROM test_db.test_table_restored
┌─count()─┐
│    1100 │
└─────────┘

Проверка содержимого

Следующий запрос сравнивает содержимое исходной таблицы test_table с восстановленной таблицей test_table_restored:

SELECT throwIf((
   SELECT groupArray(tuple(*))
   FROM test_db.test_table
   ) != (
   SELECT groupArray(tuple(*))
   FROM test_db.test_table_restored
), 'Data does not match after BACKUP/RESTORE')