ClickHouse BACKUP/RESTORE备份功能初体验

2021-11-04 14:53:49 浏览数 (2)

ClickHouse 虽然提供了一些 备份&还原 的方法(我在书里都有介绍),但目前总体来看,都不算 “自动化”。

在ClickHouse 的 2021 Roadmap 中,有一项关于备份和还原的议题,期望通过添加 BACKUP 和 RESTORE 命令,来实现一键备份和还原。

该议题涵盖的内容很多,目前的进展是,在21.10 release 版本中已经能够使用到 BACKUP/RESTORE 关键字,但是该功能还处于非常初级的阶段,远不能在生产环境中使用。

即便如此,还是阻止不了我一探究竟的好奇心,接下来就让我们体验一下这项新功能吧。

新建一张表,并写入数据:

代码语言:javascript复制
CREATE TABLE backup_test
(
    id UInt64,
    value String,
    date DateTime
)
ENGINE = MergeTree()
ORDER BY id
PARTITION BY toYYYYMM(date)

INSERT INTO backup_test(id, value,date) VALUES (1, 'nauu1','2021-09-01'),(2, 'nauu2','2021-09-01'),(3, 'bob','2021-10-01');

执行 BACKUP 备份命令:

代码语言:javascript复制
BACKUP TABLE backup_test TO 'backup_test_1'

Query id: ce089687-c7ae-4432-8a04-cbe68a79ca4f

Ok.

0 rows in set. Elapsed: 0.026 sec.

至此,表的备份就算完成了,是不是比以前简单多了。

BACKUP 命令到底做了什么呢? 进入到元数据目录,会发现相比之前,多了一个backups 目录:

代码语言:javascript复制
# % pwd
# /clickhouse/ch9-data/data/backups
backups % ls -l
total 0
drwxr-xr-x  5 nauu  staff  160 10 27 20:52 backup_test_1

在执行 BACKUP 之后,在 backups 目录下,将原表的元数据以及数据,都复制了一份:

代码语言:javascript复制
backup_test_1 % ls -l
total 0
drwxr-xr-x  3 nauu  staff  96 10 27 20:52 data
drwxr-xr-x  3 nauu  staff  96 10 27 20:52 metadata

数据的备份:

元数据的备份:

.sql 文件保存了原表的 DDL 语句:

代码语言:javascript复制
default % cat backup_test.sql
CREATE TABLE default.backup_test (`id` UInt64, `value` String, `date` DateTime) ENGINE = MergeTree PARTITION BY toYYYYMM(date) ORDER BY id SETTINGS storage_policy = 'default_local', index_granularity = 8192%

现在执行 RESTORE 还原命令:

代码语言:javascript复制
RESTORE TABLE backup_test FROM 'backup_test_1'

Query id: 7626aa03-f886-4d44-b34c-97ecc617e602

Ok.

0 rows in set. Elapsed: 0.022 sec.

查询原表,发现之前的数据被还原再次写入了一次:

代码语言:javascript复制
SELECT *
FROM backup_test

Query id: b6b19837-959e-44b8-a372-14e46c21fb7d

┌─id─┬─value─┬────────────────date─┐
│  1 │ nauu1 │ 2021-09-01 00:00:00 │
│  1 │ nauu1 │ 2021-09-01 00:00:00 │
│  2 │ nauu2 │ 2021-09-01 00:00:00 │
│  2 │ nauu2 │ 2021-09-01 00:00:00 │
└────┴───────┴─────────────────────┘
┌─id─┬─value─┬────────────────date─┐
│  3 │ bob   │ 2021-10-01 00:00:00 │
│  3 │ bob   │ 2021-10-01 00:00:00 │
└────┴───────┴─────────────────────┘

6 rows in set. Elapsed: 0.005 sec.

把原表删除,然后再还原:

代码语言:javascript复制
DROP TABLE backup_test

RESTORE TABLE backup_test FROM 'backup_test_1'

再次查询原表,表的元数据和数据都恢复了:

代码语言:javascript复制
SELECT *
FROM backup_test

Query id: ed6f2390-1d6e-45a5-a494-7f9e9d3403b9

┌─id─┬─value─┬────────────────date─┐
│  3 │ bob   │ 2021-10-01 00:00:00 │
└────┴───────┴─────────────────────┘
┌─id─┬─value─┬────────────────date─┐
│  1 │ nauu1 │ 2021-09-01 00:00:00 │
│  2 │ nauu2 │ 2021-09-01 00:00:00 │
└────┴───────┴─────────────────────┘

3 rows in set. Elapsed: 0.004 sec.

还可以还原成另外的表名:

代码语言:javascript复制
RESTORE TABLE backup_test INTO backup_test_9 FROM 'backup_test_1'

Query id: 729e8cef-f798-41c6-93ce-4d99f3be7ffa

Ok.

0 rows in set. Elapsed: 0.023 sec.

如果这个功能加以完善,那备份和还原就方便多啦。

不过,随着进一步测试,会发现这项功能确实还处于初级阶段,比如: 目前不支持对 Distributed 分布式表:

代码语言:javascript复制
BACKUP TABLE backup_test_all TO 'backup_test_all_backup'

Query id: a50e8a4a-7182-44f3-875d-d45d56212cdb


0 rows in set. Elapsed: 0.002 sec. 

Received exception from server (version 21.10.1):
Code: 60. DB::Exception: Received from ch9.nauu.com:9000. DB::Exception: Table default.backup_test_all doesn't exist. (UNKNOWN_TABLE)

对于复制表,支持 BACKUP,但不支持 RESTORE

(-_-||) :

代码语言:javascript复制
#支持
BACKUP TABLE backup_test_replicated TO 'backup_test_replicated_backup'

执行 RESTORE 会报错:

代码语言:javascript复制
RESTORE TABLE backup_test_replicated FROM 'backup_test_replicated_backup'

Query id: 0c64517e-7979-41c1-a665-c4fe5dab2fc4


0 rows in set. Elapsed: 0.002 sec. 

Received exception from server (version 21.10.1):
Code: 48. DB::Exception: Received from ch10.nauu.com:9000. DB::Exception: Table engine ReplicatedMergeTree doesn't support restoring. (NOT_IMPLEMENTED)

这项功能的提案地址如下,我会持续关注,有新的进展再拿来和大家分享:

https://github.com/ClickHouse/ClickHouse/issues/8841

0 人点赞