Clickhouse备份与恢复
一、安装clickhouse-backup
1、下载安装包
cd /server/tools/
wget https://github.com/Altinity/clickhouse-backup/releases/download/v2.4.33/clickhouse-backup-linux-amd64.tar.gz
2、创建存放clickhouse-backup的目录,并解压
mkdir -pv /data/clickhouse-backup
tar xvf clickhouse-backup-linux-amd64.tar.gz -C /data/clickhouse-backup/
3、创建软连接
ln -sv /data/clickhouse-backup/build/linux/amd64/clickhouse-backup /usr/local/bin
4、测试clickhouse-backup命令
clickhouse-backup -v
5、创建配置文件
注意:下面的配置文件是按本地标准来的,配置文件中默认data_path:"/var/lib/clickhouse",如果clickhouse-server存储数据的路径变了,这个地方也需要加上data_path。下面举个例子:
然后编辑clickhouse-backup的config文件
mkdir -p /etc/clickhouse-backup/
cd /etc/clickhouse-backup/
vim config.yml
输入下面的内容:
general:
remote_storage: none
backups_to_keep_local: 7 # 本地备份保留个数,默认0表示不自动做备份清理
backups_to_keep_remote: 31 # 远程备份保留个数
clickhouse:
username: default
password: "XXXXXX"
host: localhost
port: 9000 # 这个与jdbc链接里的端口没关系,就是9000
data_path: "/data/iflytek/public/clickhouseData" #clickhouse的数据的实际存储位置
二、自动备份数据
1、查看可备份的表
clickhouse-backup tables
例如:
2、单表备份
语法:
clickhouse-backup create [-t, --tables=<db>.<table>] <backup_name>
备份default库中的hot_question_data表,备份名称默认为时间戳,可手动指定备份名称。例如:
clickhouse-backup create -t default.hot_question_data hot_question_data_bak_20240829
备份存储在中 $data_path/backup 下(默认在/var/lib/clickhouse/backup)
备份包含两个目录:
- metadata目录: 包含重新创建所需的DDL SQL
- shadow目录: 包含作为ALTER TABLE … FREEZE操作结果的数据。
3、备份多表
备份test库中的t_order表和t_new表(两个表用","隔开)
clickhouse-backup create -t default.hot_question_data_bak20240723,default.hot_question_data_bak20240725 hot_question_data_bak20240723_0725_bak20240829
4、全库备份
clickhouse-backup create ch_bk_20240308
5、查看备份文件
clickhouse-backup list
6、删除备份文件
注意:删除时要考虑一下
clickhouse-backup delete local hot_question_data_bak_20240829
7、删除shadow下的临时备份文件
注意:删除时要考虑一下
clickhouse-backup clean
三、(自动备份数据)数据恢复
1、语法:
clickhouse-backup restore 备份名
重要选项
- –table 只恢复特定表,可以用正则(如还原指定数据库:–table=dbname.*)
- –schema 只还原表结构
- –data 只还原数据
例如:
clickhouse-backup create -t default.hot_question_data_bak20240722 hot_question_data_bak20240722_20240829
查看备份是否生成
将 default.hot_question_data_bak20240722 这张表备份一份,将这张表删除
刷新确认是否删除成功
然后进行恢复
clickhouse-backup restore hot_question_data_bak20240722_20240829
此时报错:
2024/08/29 20:38:00.929372 error can't create table `default`.`hot_question_data_bak20240722`: code: 57, message: Directory for table data store/e8c/e8c3a343-758d-4e9a-a8c3-a343758dce9a/ already exists after 1 times, please check your schema dependencies
解决方法 :
data_path/backup/hot_question_data_bak20240722_20240829/metadata/default/hot_question_data_bak20240722.json中的UUID 'e8c3a343-758d-4e9a-a8c3-a343758dce9a’,这一整个删除掉,重新执行clickhouse-backup restore 备份名。
删除之前:
删除之后:
重新执行恢复命令,发现表又复原回来了。
2、全库恢复
参考单表恢复,执行命令即可:
clickhouse-backup restore /var/lib/clickhouse/backup/备份名 #需要保证原来的库完全被删除,否则可能会报错,默认会去/var/lib/clickhouse/backup路径下去找备份文件夹
如果遇到报错,Directory for table data store/e8c/e8c3a343-758d-4e9a-a8c3-a343758dce9a/ already exists after 1 times,参考单表恢复的解决方案即可。
3、只恢复表结构
#使用 --schema 恢复表的表结构
clickhouse-backup restore 备份名 --table 库名.表名 --schema
4、只恢复数据
注意:由于是ATTACH PARTITION操作,如果执行2次的话,数据会翻倍
#用 --data 恢复表中数据(注意:由于是ATTACH PARTITION操作,如果执行2次的话,数据会翻倍)
clickhouse-backup restore 备份名 --table 库名.表名 --data
5、还原测试数据(可参考)
#创建库
create database if not exists test;
#创建表
create table if not exists test.t_order
(
id Int64 COMMENT '订单id',
datetime DateTime COMMENT '订单日期',
name String COMMENT '手办名称',
price Decimal32(2) COMMENT '手办价格',
user_id Int64 COMMENT '用户id'
) engine = MergeTree
partition by toYYYYMM(datetime)
order by id ;
#插入数据
insert into t_order values (1, '2022-03-08 12:40:00', '欧阳锋', 999.99, 202203080001)
insert into t_order values (2, '2023-03-08 12:44:00', '梅超风', 1111, 202303080002)
insert into t_order values (3, '2022-03-08 12:45:00', '黄蓉', 8989, 202203080001)
#用全库备份先预留一份,再进行下面操作:
#删除数据
alter table t_order delete where id = 2;
#清空表
truncate table t_order;
#删除表
drop table t_order;
#删除库
drop database test;
四、编写shell脚本设置定时任务
1、自动备份脚本
#创建存放脚本的目录
mkdir -pv /data/clickhouse/script
#编写自动备份脚本
vim /data/clickhouse/script/ch_full_backup.sh
输入下面的内容:
#!/bin/bash
/usr/local/bin/clickhouse-backup create ch_full_backup_`date +%Y-%m-%dT%H-%M-%S`
2、设置定时任务
然后执行下面的命令
#每天凌晨1点进行备份
0 1 * * * sh /data/clickhouse/script/ch_full_backup.sh