本文介绍如何通过 S3 端点将备份保存到 S3 存储桶, 或从 S3 存储桶恢复备份。
语法
-- 核心命令
BACKUP | RESTORE
--- 备份/恢复的对象(或排除项)
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 ...]
[ASYNC]有关各命令的详细信息,请参见"命令摘要"。
使用示例
备份到 S3 端点的增量备份
在本示例中,我们将先把备份创建到 S3 端点,然后再从中恢复。
使用此方法时,你需要以下信息:
| 参数 | 示例 |
|---|---|
| S3 端点 | https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/ |
| 访问密钥 ID | BKIOZLE2VYN3VXXTP9RC |
| 私有访问密钥 | 40bwYnbqN7xU8bVePaUCh3+YEyGXu8UOMV9ANpwL |
备份的目标端指定如下:
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 端点,后面是 bucket 中
用于存放此次备份的目录。在这个示例中,该目录名为 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 和基准备份的位置。请注意,增量备份的目标端与基准备份不在同一目录中,而是位于同一端点下、bucket 内的另一个目标目录。基准备份位于 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')