跳到主要内容
跳到主要内容

使用 S3 端点进行备份 / 恢复

本文介绍如何通过 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 端点,然后再次从中恢复。

注意

有关完整备份与增量备份之间差异的说明,请参阅 "备份类型"

使用此方法需要以下信息:

参数示例
S3 端点https://backup-ch-docs.s3.us-east-1.amazonaws.com/backups/
访问密钥 IDBKIOZLE2VYN3VXXTP9RC
秘密访问密钥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
), 'BACKUP/RESTORE 之后数据不一致')