Este artigo aborda como fazer backup ou restaurar backups para e de um bucket do S3 por meio de um endpoint do S3.
Sintaxe
-- comandos principais
BACKUP | RESTORE
--- o que incluir no backup/restaurar (ou excluir)
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']
--- destino ou origem do backup ou restauração
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>')
--- configurações adicionais
[SETTINGS ...]
[ASYNC]Consulte "resumo dos comandos" para obter mais detalhes sobre cada comando.
Exemplo de uso
Backup incremental para um endpoint do S3
Neste exemplo, vamos criar um backup em um endpoint do S3 e depois restaurá-lo a partir dele.
Você precisará das seguintes informações para usar este método:
| Parâmetro | Exemplo |
|---|---|
| Um endpoint do S3 | https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/ |
| ID da chave de acesso | BKIOZLE2VYN3VXXTP9RC |
| Chave de acesso secreta | 40bwYnbqN7xU8bVePaUCh3+YEyGXu8UOMV9ANpwL |
O destino de um backup é especificado da seguinte forma:
S3('<s3 endpoint>/<directory>', '<access key id>', '<secret access key>', '<extra_credentials>')Configuração
Crie o banco de dados e a tabela a seguir e insira alguns dados aleatórios nela:
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 1000Crie um backup de base
Backups incrementais exigem um backup de base como ponto de partida. O primeiro parâmetro do
destino S3 é o endpoint do S3, seguido pelo diretório dentro do bucket
que será usado para este backup. Neste exemplo, o diretório se chama my_backup.
Execute o seguinte comando para criar o backup de base:
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 │
└──────────────────────────────────────┴────────────────┘Adicione mais dados
Os backups incrementais contêm apenas a diferença entre o backup base e o conteúdo atual da tabela da qual está sendo feito o backup. Adicione mais dados antes de fazer o backup incremental:
INSERT INTO test_db.test_table SELECT *
FROM generateRandom('key Int, value String, array Array(String)')
LIMIT 100Fazer um backup incremental
Este comando de backup é semelhante ao backup de base, mas adiciona SETTINGS base_backup e o local do backup de base. Observe que o destino do backup incremental não é o mesmo diretório do backup de base, mas sim o mesmo endpoint com um diretório de destino diferente dentro do bucket. O backup de base está em my_backup, e o incremental será gravado em 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 │
└──────────────────────────────────────┴────────────────┘Restaurar a partir do backup incremental
Este comando restaura o backup incremental para uma nova tabela, test_table_restored.
Observe que, quando um backup incremental é restaurado, o backup base também é incluído.
Especifique apenas o backup incremental ao restaurar:
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 │
└──────────────────────────────────────┴──────────┘Verifique a contagem
Foram feitos dois inserts na tabela original data, um com 1.000 linhas e outro com 100 linhas, totalizando 1.100.
Verifique se a tabela restaurada tem 1.100 linhas:
SELECT count()
FROM test_db.test_table_restored┌─count()─┐
│ 1100 │
└─────────┘Verifique o conteúdo
Isso compara o conteúdo da tabela original, test_table, com o da tabela restaurada 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')