侧边栏壁纸
博主头像
船长博主等级

专注于云原生运维,致敬每个爱学习的你

  • 累计撰写 35 篇文章
  • 累计创建 10 个标签
  • 累计收到 10 条评论

ClickHouse 备份与恢复

船长
2022-01-29 / 0 评论 / 0 点赞 / 742 阅读 / 5,834 字
温馨提示:
本文最后更新于 2022-04-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

手动实现备份与恢复

ClickHouse 允许使用 ALTER TABLE ... FREEZE PARTITION ... 查询以创建表分区的本地副本。 这是利用硬链接(hardlink)到 /var/lib/clickhouse/shadow/ 文件夹中实现的,所以它通常不会
因为旧数据而占用额外的磁盘空间。 创建的文件副本不由 ClickHouse 服务器处理,所以不需要任何额外的外部系统就有一个简单的备份。防止硬件问题,最好将它们远程复制到另一个位置,然后删除本地副本。

创建测试数据

clickhouse-1 :) 

CREATE TABLE IF NOT EXISTS user_local
(
    `id` Int32,
    `name` String
)
ENGINE = MergeTree
PARTITION BY id
PRIMARY KEY id
ORDER BY id

Query id: 7f911865-f883-46e2-8721-7ba4f62d6286

Ok.

0 rows in set. Elapsed: 0.007 sec. 

clickhouse-1 :) INSERT INTO user_local VALUES(1,'tom'),(2,'jack');

INSERT INTO user_local VALUES

Query id: f32e2378-7d76-4865-a65c-18398eff5bc6

Ok.

2 rows in set. Elapsed: 0.004 sec. 

clickhouse-1 :) select * from user_local;

SELECT *
FROM user_local

Query id: faafe57b-64fe-4ad3-b2c2-84293193a5dd

┌─id─┬─name─┐
│  2 │ jack │
└────┴──────┘
┌─id─┬─name─┐
│  1 │ tom  │
└────┴──────┘

2 rows in set. Elapsed: 0.004 sec. 

创建备份路径

创建用于存放备份数据的目录 shadow

$ mkdir -p /var/lib/clickhouse/shadow/
$ chown -R clickhouse.clickhouse /var/lib/clickhouse/shadow/

执行备份命令

$ echo -n 'alter table user_local freeze' | clickhouse-client -h clickhouse-1

将备份数据保存到其他路径

#创建备份存储路径
$ mkdir -p /var/lib/clickhouse/backup/ #拷贝数据到备份路径
$ cp -r /var/lib/clickhouse/shadow/ /var/lib/clickhouse/backup/`date +%F`
#为下次备份准备,删除 shadow 下的数据
$ rm -rf /var/lib/clickhouse/shadow/*
$ chown -R clickhouse.clickhouse /var/lib/clickhouse/backup/`date +%F`
$ ll /var/lib/clickhouse/backup/
total 0
drwxr-xr-x 3 clickhouse clickhouse 36 Oct 27 17:06 2021-10-27

恢复数据

# 模拟删除备份过的表
$ echo 'drop table user_local' | clickhouse-client -h clickhouse-1

# 创建恢复表结构

CREATE TABLE IF NOT EXISTS user_local
(
    `id` Int32,
    `name` String
)
ENGINE = MergeTree
PARTITION BY id
PRIMARY KEY id
ORDER BY id

Query id: 9c527b4c-edc7-4a20-9541-1778a2cc08d2

Ok.


# 将备份复制到 detached 目录
$ cp -rl /var/lib/clickhouse/backup/2021-10-27/1/store/631/631ffb48-6e2b-4db0-a31f-fb486e2badb0/* /var/lib/clickhouse/data/default/user_local/detached/

# 查看partition
clickhouse-1 :) Select partition,name, database, table,path from system.parts where table = 'user_local';

Query id: f6e7ea0f-3ec7-40de-90b7-6f5204790de0

┌─partition─┬─name────┬─database─┬─table──────┬─path────────────────────────────────────────────────────────────────────────┐
│ 1         │ 1_1_1_0 │ default  │ user_local │ /var/lib/clickhouse/store/fc2/fc2510ad-fe9e-4718-bc25-10adfe9e2718/1_1_1_0/ │
│ 2         │ 2_2_2_0 │ default  │ user_local │ /var/lib/clickhouse/store/fc2/fc2510ad-fe9e-4718-bc25-10adfe9e2718/2_2_2_0/ │
└───────────┴─────────┴──────────┴────────────┴─────────────────────────────────────────────────────────────────────────────┘

2 rows in set. Elapsed: 0.004 sec. 


# 执行 attach
clickhouse-1 :) alter table user_local attach partition 1;
clickhouse-1 :) alter table user_local attach partition 2;

# 查看数据

clickhouse-1 :) select * from user_local;
Query id: 7d64a272-c89b-4fd7-a327-a1f257815d9a

┌─id─┬─name─┐
│  2 │ jack │
└────┴──────┘
┌─id─┬─name─┐
│  1 │ tom  │
└────┴──────┘

2 rows in set. Elapsed: 0.003 sec. 

ClickHouse 使用文件系统硬链接来实现即时备份,而不会导致 ClickHouse 服务停机(或

锁定)。这些硬链接可以进一步用于有效的备份存储。在支持硬链接的文件系统(例如本地

文件系统或 NFS)上,将 cp 与-l 标志一起使用(或将 rsync 与–hard-links 和–numeric-ids 标志

一起使用)以避免复制数据

**clickhouse-backup **备份工具

使用 Clickhouse 的备份工具 clickhouse-backup 帮我们自动化实现。

工具地址:https://github.com/AlexAkulov/clickhouse-backup/

安装

[root@clickhouse-1 ~]# wget https://github.com/AlexAkulov/clickhouse-backup/releases/download/1.2.0/clickhouse-backup-1.2.0-1.x86_64.rpm
[root@clickhouse-1 ~]# rpm -ivh clickhouse-backup-1.2.0-1.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:clickhouse-backup-1.2.0-1        ################################# [100%]

创建备份

# 查看可用命令
[root@clickhouse-1 ~]# clickhouse-backup help
NAME:
   clickhouse-backup - Tool for easy backup of ClickHouse with cloud support

USAGE:
   clickhouse-backup <command> [-t, --tables=<db>.<table>] <backup_name>

VERSION:
   1.2.0

DESCRIPTION:
   Run as 'root' or 'clickhouse' user

COMMANDS:
   tables          Print list of tables
   create          Create new backup
   create_remote   Create and upload
   upload          Upload backup to remote storage
   list            Print list of backups
   download        Download backup from remote storage
   restore         Create schema and restore data from backup
   restore_remote  Download and restore
   delete          Delete specific backup
   default-config  Print default config
   server          Run API server
   help, h         Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --config FILE, -c FILE  Config FILE name. (default: "/etc/clickhouse-backup/config.yml") [$CLICKHOUSE_BACKUP_CONFIG]
   --help, -h              show help
   --version, -v           print the version
   
# 显示要备份的表
[root@clickhouse-1 ~]# clickhouse-backup tables
default.st_order_mt       293B  default  
default.st_order_mt_all2  0B    default  
default.user_local        323B  default  

# 创建备份
[root@clickhouse-1 ~]# sudo clickhouse-backup create
2021/10/27 17:47:15  info done                      backup=2021-10-27T09-47-15 operation=create table=default.st_order_mt
2021/10/27 17:47:15  info done                      backup=2021-10-27T09-47-15 operation=create table=default.st_order_mt_all2
2021/10/27 17:47:15  info done                      backup=2021-10-27T09-47-15 operation=create table=default.user_local
2021/10/27 17:47:15  info done                      backup=2021-10-27T09-47-15 duration=90ms operation=create

# 查看现有的本地备份
[root@clickhouse-1 ~]# clickhouse-backup list
2021-10-27                 ???       27/10/2021 17:06:32   local      
help                       1.96KiB   27/10/2021 09:46:46   local      
table=default.user_local   1.96KiB   27/10/2021 09:47:03   local      
2021-10-27T09-47-15        1.96KiB   27/10/2021 09:47:15   local  

备份存储在中/var/lib/clickhouse/backup/BACKUPNAME。备份名称默认为时间戳,但是 可以选择使用–name 标志指定备份名称。备份包含两个目录:一个“metadata”目录,其中包 含重新创建架构所需的 DDL SQL 语句;以及一个“shadow”目录,其中包含作为 ALTER TABLE ... FREEZE 操作结果的数据

从备份恢复数据

# 模拟删除备份过的表
[root@clickhouse-1 ~]# echo 'drop table user_local' | clickhouse-client -h clickhouse-1

# 从备份还原
[root@clickhouse-1 ~]# clickhouse-backup restore 2021-10-27T09-47-15 --table default.user_local;

--schema 参数:只还原表结构。
--data 参数:只还原数据。
--table 参数:备份(或还原)特定表。也可以使用一个正则表达式,例如,针对特定的数据库:--table=dbname.*。

# 确认数据是否恢复

clickhouse-1 :) select * from user_local;

SELECT *
FROM user_local

Query id: f4fa929c-4a85-48a5-b540-7278a1ef0e3f

┌─id─┬─name─┐
│  2 │ jack │
└────┴──────┘
┌─id─┬─name─┐
│  1 │ tom  │
└────┴──────┘

2 rows in set. Elapsed: 0.004 sec. 

补充

  • API 文档:https : //github.com/AlexAkulov/clickhouse-backup#api

  • 注意事项:切勿更改文件夹/var/lib/clickhouse/backup 的权限,可能会导致数据损坏。

  • 远程备份

1)较新版本才支持,需要设置 config 里的 s3 相关配置

2)上传到远程存储:sudo clickhouse-backup upload xxxx

3)从远程存储下载:sudo clickhouse-backup download xxxx

4)保存周期: backups_to_keep_local,本地保存周期,单位天

​ backups_to_keep_remote,远程存储保存周期,单位天

​ 0 均表示不删除

0

评论区