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