原理
在对应的分区目录shard下创建一个linux 硬链接,不影响源表的读写,不占用额外的磁盘空间,也正因为如此切记不要修改文件权限,否则会破clickhouse的原始数据。
操作演示
1,冻结表
--冻结表之前建议OPTIMIZE下,合并一些分区,方便文件拷贝
OPTIMIZE TABLE demo_db.demo_table FINAL
--冻结表
echo -n 'alter table demo_db.demo_table freeze' | clickhouse-client -h xxxx --port 29000 -u default --password xxxxx
注意:生产环境一般都是使用多磁盘存储策略,硬链接不是默认的/var/lib/clickhouse/shard/路径,是集群配置的多磁盘存储路径与store文件夹平级的路径,如我这边就是 /data*/clickhouse 路径。
1.png
2,查看表分区磁盘分布
--查看part在磁盘中的分布
SELECT name, table,disk_name, path FROM system.parts WHERE (table = 'demo_table')
2.png
注意:生产环境会有多个路径,都需要拷贝备份,注意记住path路径中的md5值。
3,备份文件到其他的目录(最好将路径也拷贝了,方便记住md5值)
cp -r /data4/clickhouse/shadow/1/store/ed5/ed52238e-30bf-4090-bc95-9207927d186c/20210510_0_1_2/ /data10/ck_backup
4,清空表数据(未破坏表元数据信息)
TRUNCATE TABLE demo_db.demo_table ON CLUSTER demo0100allp_v1
注意:当前操作的前提是没有破坏表的元数据,如果元数据破坏,需要拷贝到clickhouse的指定目录下,我这边是在 /ssd2/clickhouse/metadata。
5,restore表数据
--拷贝到detached目录
cp -r /data10/ck_backup/* /data1/clickhouse/store/ed5/ed52238e-30bf-4090-bc95-9207927d186c/detached/
--授权
chown clickhouse:clickhouse -R /data1/clickhouse/store/ed5/ed52238e-30bf-4090-bc95-9207927d186c/detached/*
--attach 数据
echo -n "alter table demo_db.demo_table attach PART '20210510_0_1_2'" | clickhouse-client -h xxxx --port 29000 -u default --password xxxx
注意:PART 和 PARTITION的区别。拷贝备份的数据到store路径下,切记md5路径要和之前的一样,但是磁盘可以随机选一个。查询数据,可以发现数据已经恢复。
6,删除shard目录下的文件。
Tips
alter table xxxx freeze 基本上没啥人会这样玩,而且要操作集群,机器一多就。。。比较麻烦 !!!一般是那种自动化的运维工具,这个功能还是可以用用。
网友评论