一、前言
与其他的数据存储引擎类似,clickhouse承载着大数据量级的数据存储,对于数据的备份与恢复也是必须考虑的,本文将通过操作演示下如何对clickhouse数据进行备份与恢复。
clickhouse可以通过手动进行数据恢复,也可以通过工具进行恢复;
二、clickhouse 数据手动备份与恢复演示
ClickHouse 允许使用 ALTER TABLE ... FREEZE PARTITION ... 查询以创建表分区的本地副本。
 这是利用硬链接(hardlink)到 /var/lib/clickhouse/shadow/ 文件夹中实现的,所以它通常不会因为旧数据而占用额外的磁盘空间。 创建的文件副本不由 ClickHouse 服务器处理,所以不需要任何额外的外部系统就有一个简单的备份。防止硬件问题,最好将它们远程复制到另一个位置,然后删除本地副本。
在正式操作之前,再温馨提示下,clickhouse使用rpm的方式安装时,几个安装后的数据文件目录位置:
bin/    /usr/bin
conf/   /etc/clickhouse-server
lib/    /var/lib/clickhouse
log/    /var/log/clickhouse
 
 
2.1 数据准备
在默认的数据库下,之前我们创建了下面这张表,并且有几条数据;

2.2 创建备份路径
2.3 执行备份命令
echo -n 'alter table t_order_mt freeze' | clickhouse-client 
 或者在客户端命令行执行
alter table t_order_mt freeze; 
 
注意:使用了冻结命令之后并不会锁表
执行完毕上面的命令之后,在shadow目录下会多出下面的几个目录和相关的文件

一路cd进去,可以发现里面其实就是存放了按照分区存放的数据;

2.4 将备份数据保存到其他路径
#创建备份存储路径
sudo mkdir -p /var/lib/clickhouse/backup/
#拷贝数据到备份路径
sudo cp -r /var/lib/clickhouse/shadow/ /var/lib/clickhouse/backup/my-backup-name
#为下次备份准备,删除 shadow 下的数据
sudo rm -rf /var/lib/clickhouse/shadow/* 
 执行过程
ClickHouse 是 使用文件系统硬链接来实现即时备份,而不会导致 ClickHouse 服务停机(或锁定)。这些硬链接可以进一步用于有效的备份存储。在支持硬链接的文件系统(例如本地文件系统或 NFS )上,将 cp 与 -l 标志一起使用(或将 rsync 与 –hard-links 和 –numeric-ids 标志 一起使用)以避免复制数据。 注意:仅拷贝分区目录,注意目录所属的用户要是 clickhouse
2.5 数据恢复
模拟删除备份过的表
 drop table t_order_mt; 
 
重新创建表
create table t_order_mt(
 id UInt32,
 sku_id String,
 total_amount Decimal(16,2),
 create_time Datetime
) engine =MergeTree
 partition by toYYYYMMDD(create_time)
 primary key (id)
 order by (id,sku_id); 

将备份复制到 detached 目录
执行下面的命令
sudo cp -rl /var/lib/clickhouse/backup/my-backup-name/1/store/ecc/ecce0769-b776-4d10-acce-0769b776ed10/* /var/lib/clickhouse/data/default/t_order_mt/detached/ 

执行 attach命令

执行时如果出现上面的报错,说明clickhouse这个用户无操作权限,需要做一下授权

然后再次执行上面的attach命令,这时就attach成功了

执行完成后,查询下当前这张表,发现数据就恢复回去了

三、使用 clickhouse-backup做数据备份与恢复
上面,我们演示了手动做clickhouse的数据备份与恢复的过程,过程还是有点麻烦的,其实我们可以使用 Clickhouse 的备份工具 clickhouse-backup 帮我们自动化实现,工具地址:
clickhouse-backup 工具下载地址
前置准备
1、上传安装包工具

2、使用rpm安装
sudo rpm -ivh clickhouse-backup-1.0.0-1.x86_64.rpm 

注意:安装完毕后,默认在 /etc/clickhouse-backup/ 目录下

3、配置相关文件
配置文件大概长下面这样,核心要配置的文件默认情况下主要是下面几个

常用操作命令与数据表的备份操作
1、查看可用命令
clickhouse-backup help 

2、显示要备份的表
 clickhouse-backup tables 

3、查看现有的本地备份
clickhouse-backup list 
执行这个命令,发现上面我们做手动备份时候创建的目录被识别到了

注意,为了不影响后面使用命令备份数据造成混淆,建议先把之前的该目录下文件删除掉
4、创建备份
 sudo clickhouse-backup create 

执行完成后,在 : /var/lib/clickhouse/backup 目录下就产生了新的备份数据;

通过这种方式备份出来的数据和文件,看起来包含的内容更加全面

数据恢复操作
1、模拟删除备份过的表
删除default数据库

2、从备份还原
执行下面的命令进行数据恢复
sudo clickhouse-backup restore 2022-12-18T09-50-43 
相关参数补充说明
--schema 参数:只还原表结构;--data 参数:只还原数据;--table 参数:备份(或还原)特定表。也可以使用一个正则表达式,例如,针对特定的数据库: --table=dbname.*
执行这个命令时,会将系统中所有备份过的数据表都执行一次,如果已经存在了,会跳过

3、数据检查
可以发现数库和数据表已经恢复回来了

其他补充说明
1、api文档链接
clickhouse-backup api文档地址
2、注意事项
切勿更改文件夹 /var/lib/clickhouse/backup 的权限,可能会导致数据损坏
3、关于远程备份说明
- 较新版本才支持,需要设置 config 里的 s3 相关配置;
 - 上传到远程存储:sudo clickhouse-backup upload xxxx;
 - 从远程存储下载:sudo clickhouse-backup download xxxx;
 - 保存周期: backups_to_keep_local,本地保存周期,单位天;backups_to_keep_remote,远程存储保存周期,单位天;0 均表示不删除;
 



















