一、问题

  1. 如何做ClickHouse单表的备份和恢复
  2. 如何做ClickHouse全库的备份和恢复

二、方案

相同点:备份操作是在线进行的,不会阻塞正常的读写操作

方案一:内置的BACKUP和RESTORE

ClickHouse 在 22.3 版本中引入了 内置的 BACKUP 和 RESTORE

优点:

  1. 系统内置功能(从21开始),支持简单的全量库或者表的备份和恢复
  2. 官方支持,兼容性好一些,恢复快一些

缺点:

  1. 需要修改clickhouse config.xml文件中备份目录设置并重启clickhouse服务
  2. 备份数据格式是ClickHouse内部格式,不能直接读取或用于其他用途。

方案二:三方的clickhouse-backup

基于 ALTER TABLE … FREEZE 创建分区快照(shadow目录),然后复制到备份目录

优点:

  1. 支持灵活的备份策略(如增量备份、远程存储支持)

缺点:

  1. 需要安装三方工具;社区支持,非官方支持
  2. 仅支持 MergeTree 系列表引擎

三、操作步骤:备份和恢复

方案一

  • 备份目录需要预先在/etc/clickhouse-server/config.xml配置文件中定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<storage_configuration>
<disks>
<data1>
<keep_free_space_bytes>xxx</keep_free_space_bytes>
<path>/data1/clickhouse/</path>
</data1>
<data2>
<keep_free_space_bytes>xxx</keep_free_space_bytes>
<path>/data2/clickhouse/</path>
</data2>
<data3>
<keep_free_space_bytes>xxx</keep_free_space_bytes>
<path>/data3/clickhouse/</path>
</data3>
<backups>
<type>local</type>
<path>/var/lib/clickhouse/backups-202503/</path>
</backups>
</disks>

</storage_configuration>
<backups>
<allowed_disk>backups</allowed_disk>
<allowed_path>/var/lib/clickhouse/backups-202503/</allowed_path>
</backups>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 备份单个表
BACKUP TABLE 库名.表名 TO Disk('backups', '文件名');

-- 备份库
BACKUP DATABASE 库名 TO Disk('backups', '文件名');

-- 查看backup状态
SELECT id, name, status, start_time, end_time, error FROM system.backups;

-- 恢复库
RESTORE DATABASE 库名 FROM Disk('backups', '文件名');

-- 恢复表
RESTORE TABLE 库名.表名 FROM Disk('backups', '文件名');

-- 查看restore状态
SELECT id, name, base_backup_name, status, error, start_time, end_time FROM system.backups;

方案二

  1. 安装最新的clickhouse-backup-2.6.5-1.x86_64.rpm
  2. 更新/etc/clickhouse-backup/config.yml。注意需要配置成远程存储remote_storage: sftp才会对shadow数据文件打包;远程存储不开启时remote_storage: none时shadow文件分散在各个数据目录中,不会集中存储在/var/lib/clickhouse/backup/备份目录下。网上一些资料提到的--backup-path参数也不能生效,这个比较坑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

general:
remote_storage: sftp

clickhouse:
username: xxx
password: "xxx"
host: localhost
port: 9000
disk_mapping: {}
skip_tables:
- system.*
- INFORMATION_SCHEMA.*
- information_schema.*
- _temporary_and_external_tables.*
sftp:
address: "xxx"
port: 22
username: "xxx"
password: "xxx"
key: ""
path: "xxx"
object_disk_path: ""
compression_format: tar
compression_level: 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 单表备份并上传(注意只有上传才打包shadow数据到tar文件)
clickhouse-backup create -t 库名.表名 文件名
clickhouse-backup upload 文件名

-- 库备份
clickhouse-backup create 全量备份名
clickhouse-backup upload 全量备份名

-- 检查进度
clickhouse-backup list
select * from system.backup_list;


clickhouse-backup download 全量备份名

# 重复操作数据不会重复插入,因为恢复表以前会先DROP TABLE IF EXISTS
clickhouse-backup restore 全量备份名

四、结论

需要灵活的备份策略比如远程备份,建议采用clickhouse-backup;如果希望使用原生命令不安装三方工具的使用BACKUP/RESTORE。