Clickhouse MergeTree原理(二)—— 表和分区的维护

作者:俊达

引言

MergeTree是Clickhouse中最核心的存储引擎。上一篇文章中,我们介绍了MergeTree的基本结构。
1、MergeTree由分区(partiton)和part组成。
2、Part是MergeTree可操作的基本数据单元。

当插入数据时,会生成新的part。同时,可以对分区和part进行脱机和挂载操作,还可以对分区进行备份、恢复。此外,还可以移动分区,即将part从一个实例中脱机,然后在另一个实例中挂载,也可以将分区从一个表挂载到另外一个表。

本文将介绍clickhouse MergeTree表的基本运维操作。包括:

  • detach / attach
  • freeze
  • optimize

1 detach和attach

clickhouse中detach相关的命令有:

  • detach table / attach table

  • alter table detach partition / alter table attach partition

  • alter table detach part / alter table attach part

其中detach table和attach table对整个表生效。
detach patition / attach partiton 和 detach part / attach part分别对表的分区和part进行操作。

1.1 detach table / attach table

detach table后,无法从该表查询数据:

ck01 :) select count(*) from metrics;SELECT count(*)
FROM metricsQuery id: eb5f8146-3dfc-4fd5-a25f-e7b2d69a377f┌─count()─┐
│       3 │
└─────────┘1 row in set. Elapsed: 0.002 sec.ck01 :)
ck01 :)
ck01 :) detach table metrics;DETACH TABLE metricsQuery id: 39b42e6f-fb70-402f-81a4-248b8f677a9aOk.0 rows in set. Elapsed: 0.001 sec.## detach后,无法查询数据
ck01 :) select count(*) from metrics;SELECT count(*)
FROM metricsQuery id: 245b8032-b41a-442c-a265-150d7555ae990 rows in set. Elapsed: 0.001 sec.Received exception from server (version 22.6.3):
Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table local.metrics doesn't exist. (UNKNOWN_TABLE)

detach table后,数据文件还在原先的路径

detach table并不会删除数据文件和metadata文件。通过attach table命令可以恢复表

root@ck01:/data/clickhouse/clickhouse/data/local/metrics# ls -l
total 12
drwxr-x--- 2 root root 4096 Dec  6 03:07 20221129_8_8_2
drwxr-x--- 5 root root 4096 Dec  6 03:07 detached
-rw-r----- 1 root root    1 Nov 29 05:43 format_version.txt

可以通过attach table命令恢复表

ck01 :) attach table metrics;
ATTACH TABLE metricsQuery id: b7d80ed1-4588-4884-903b-999523c7bff6Ok.0 rows in set. Elapsed: 0.002 sec.ck01 :) select count(*) from metrics;SELECT count(*)
FROM metricsQuery id: 929c04dd-0474-47cd-a3d5-ea02eba0e910┌─count()─┐
│       3 │
└─────────┘1 row in set. Elapsed: 0.002 sec.

clickhouse重启时,会自动attach table

如果detach table时没有指定PERMANENTLY,则重启clickhouse时,会自动attach table。

DETACH TABLE table [PERMANENTLY]

1.2 alter table detach/attach partition

detach partition将某个分区脱机,分区脱机后,分区内的所有part都会被移动到detach目录下。可以通过attach parition命令将数据加载回来。

1.2.1 detach partition

测试数据

ck01 :) select partition, name, active,rows from system.parts where table='metrics';SELECTpartition,name,active,rows
FROM system.parts
WHERE table = 'metrics'Query id: 8c35e7ef-af1c-4248-bfae-3c02de5b6b78┌─partition─┬─name─────────────┬─active─┬─rows─┐
│ 20221129  │ 20221129_12_12_0 │      11 │
│ 20221130  │ 20221130_13_13_0 │      12 │
│ 20221130  │ 20221130_14_14_0 │      11 │
│ 20221130  │ 20221130_15_15_0 │      11 │
└───────────┴──────────────────┴────────┴──────┘

使用detach partiton命令将20221130分区detach:

ck01 :) alter table metrics detach partition 20221130;ALTER TABLE metricsDETACH PARTITION 20221130Query id: 88999a92-2e2c-4e4a-845d-487101f3af33Ok.0 rows in set. Elapsed: 0.002 sec.ck01 :) select partition, name, active,rows from system.parts where table='metrics';SELECTpartition,name,active,rows
FROM system.parts
WHERE table = 'metrics'Query id: ab66d880-6c7d-4312-99c7-3a00c256882f┌─partition─┬─name─────────────┬─active─┬─rows─┐
│ 20221129  │ 20221129_12_12_0 │      11 │
└───────────┴──────────────────┴────────┴──────┘

对应的part被移动到了detached目录:

root@ck01:/data/clickhouse/clickhouse/data/local/metrics# ls -l detached/
total 12
drwxr-x--- 2 root root 4096 Dec  6 05:39 20221130_13_13_0
drwxr-x--- 2 root root 4096 Dec  6 05:39 20221130_14_14_0
drwxr-x--- 2 root root 4096 Dec  6 05:39 20221130_15_15_0
1.2.2 attach partition

使用attach partition命令将20221130分区attach回来。可以观察到part的名称发生了变化。

ck01 :) alter table metrics attach partition 20221130;ALTER TABLE metricsATTACH PARTITION 20221130Query id: 24a4784f-653c-4874-8dea-60cb4981abe0Ok.0 rows in set. Elapsed: 0.002 sec.ck01 :) select partition, name, active,rows from system.parts where table='metrics';SELECTpartition,name,active,rows
FROM system.parts
WHERE table = 'metrics'Query id: d64868c0-513f-4e36-be57-65abe3cf6065┌─partition─┬─name─────────────┬─active─┬─rows─┐
│ 20221129  │ 20221129_12_12_0 │      11 │
│ 20221130  │ 20221130_16_16_0 │      11 │
│ 20221130  │ 20221130_17_17_0 │      11 │
│ 20221130  │ 20221130_18_18_0 │      12 │
└───────────┴──────────────────┴────────┴──────┘4 rows in set. Elapsed: 0.002 sec.

1.3 alter table detach/attach part

detach part和attach part的操作对象是分区中的某一个具体的part,操作粒度比分区更细。

1.3.1使用detach part命令detach某一个具体的part:
ck01 :) alter table metrics detach part '20221130_17_17_0';ALTER TABLE metricsDETACH PART '20221130_17_17_0'Query id: 51fcc860-b8b1-4410-8e89-ffcbd845b085Ok.0 rows in set. Elapsed: 0.002 sec.ck01 :) select partition, name, active,rows from system.parts where table='metrics';SELECTpartition,name,active,rows
FROM system.parts
WHERE table = 'metrics'Query id: cec0db47-2c43-460a-b121-f2d2329b1e62┌─partition─┬─name─────────────┬─active─┬─rows─┐
│ 20221129  │ 20221129_12_12_0 │      11 │
│ 20221130  │ 20221130_16_16_0 │      11 │
│ 20221130  │ 20221130_17_17_0 │      01 │
│ 20221130  │ 20221130_18_18_0 │      12 │
└───────────┴──────────────────┴────────┴──────┘4 rows in set. Elapsed: 0.003 sec.

detach的part被移动到detached目录

root@ck01:/data/clickhouse/clickhouse/data/local/metrics# ls -l detached/
total 4
drwxr-x--- 2 root root 4096 Dec  6 05:52 20221130_17_17_0
1.3.2使用attach part命令attach某一个part:
ck01 :) alter table metrics attach part '20221130_17_17_0';ALTER TABLE metricsATTACH PART '20221130_17_17_0'Query id: a1dfdda0-bc1e-4abe-b14f-aaa7b306a0f4Ok.0 rows in set. Elapsed: 0.001 sec.ck01 :) select partition, name, active,rows from system.parts where table='metrics';SELECTpartition,name,active,rows
FROM system.parts
WHERE table = 'metrics'Query id: 5baad864-3700-4993-9a09-2f52a9477459┌─partition─┬─name─────────────┬─active─┬─rows─┐
│ 20221129  │ 20221129_12_12_0 │      11 │
│ 20221130  │ 20221130_16_16_0 │      11 │
│ 20221130  │ 20221130_18_18_0 │      12 │
│ 20221130  │ 20221130_19_19_0 │      11 │
└───────────┴──────────────────┴────────┴──────┘

由于part数据一旦写入之后就不会变化,我们可以使用detach part/attach part命令来移动数据。

2 freeze和unfreeze

ALTER TABLE table_name [ON CLUSTER cluster] FREEZE [PARTITION partition_expr] [WITH NAME 'backup_name']

使用alter table freeze命令给表创建一个备份。如不不指定分区,则会对整个表的所有分区进行备份。

freeze命令通过创建硬连接的方式备份数据,所以不会占用额外的空间。

ck01 :) alter table metrics freeze with name 'backup20221206';ALTER TABLE metricsFREEZE WITH NAME 'backup20221206'Query id: 48279b8e-4e2a-41ed-b0e2-f2a8e2db4652Ok.0 rows in set. Elapsed: 0.010 sec.

执行freeze命令之后,可以在clickhouse数据目录的shadow目录下看到对应的文件:

root@ck01:/data/clickhouse/clickhouse/shadow# ls -l
total 12
drwxr-x--- 3 root root 4096 Dec  6 06:20 469
drwxr-x--- 3 root root 4096 Dec  6 06:21 backup20221206
-rw-r----- 1 root root    4 Dec  6 06:21 increment.txtroot@ck01:/data/clickhouse/clickhouse/shadow# tree backup20221206
backup20221206
└── store└── def└── def88518-fd7b-418d-a7dd-6564e38bba39├── 20221129_12_12_0│   ├── checksums.txt│   ├── columns.txt│   ├── count.txt│   ├── data.bin│   ├── data.mrk3│   ├── default_compression_codec.txt│   ├── minmax_tt.idx│   ├── partition.dat│   └── primary.idx├── 20221130_16_16_0│   ├── checksums.txt│   ├── columns.txt│   ├── count.txt│   ├── data.bin│   ├── data.mrk3│   ├── default_compression_codec.txt│   ├── minmax_tt.idx│   ├── partition.dat│   └── primary.idx
......

使用unfreeze命令删除备份

ck01 :) alter table metrics unfreeze with name '469';ALTER TABLE metricsUNFREEZE WITH NAME '469'Query id: bba89afe-54f7-457b-ab3d-3db76bf3f2f3Ok.0 rows in set. Elapsed: 0.001 sec.

由于clickhouse的part文件一旦生成之后就不会修改。可以使用freeze生成的备份文件来恢复数据。

3 optimize

使用optimize命令发起表的分区合并操作。

ck01 :) select partition, name, active,rows from system.parts where table='metrics';SELECTpartition,name,active,rows
FROM system.parts
WHERE table = 'metrics'Query id: 2917d850-fd9d-4e2c-b02e-9fd129565dc7┌─partition─┬─name─────────────┬─active─┬─rows─┐
│ 20221129  │ 20221129_12_12_0 │      11 │
│ 20221130  │ 20221130_16_16_0 │      11 │
│ 20221130  │ 20221130_18_18_0 │      12 │
│ 20221130  │ 20221130_19_19_0 │      11 │
└───────────┴──────────────────┴────────┴──────┘4 rows in set. Elapsed: 0.002 sec.ck01 :) optimize table metrics;OPTIMIZE TABLE metricsQuery id: 4f53e875-21bc-4c00-85b3-88c3ef156b1bOk.0 rows in set. Elapsed: 0.002 sec.ck01 :) select partition, name, active,rows from system.parts where table='metrics';SELECTpartition,name,active,rows
FROM system.parts
WHERE table = 'metrics'Query id: 3a32a138-26f5-4b43-874b-af2e58d18419┌─partition─┬─name─────────────┬─active─┬─rows─┐
│ 20221129  │ 20221129_12_12_0 │      11 │
│ 20221130  │ 20221130_16_16_0 │      01 │
│ 20221130  │ 20221130_16_19_1 │      14 │
│ 20221130  │ 20221130_18_18_0 │      02 │
│ 20221130  │ 20221130_19_19_0 │      01 │
└───────────┴──────────────────┴────────┴──────┘5 rows in set. Elapsed: 0.002 sec.

optimize后,创建了新的part 20221130_16_19_1,同时被合并的part active状态设置为0。inactive的part会在一定时间后被自动清理。

更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 中的“两阶段提交”机制

在MySQL数据库中,为了确保redo log(重做日志)和binlog(二进制日志)之间的数据安全性和一致性,引入了“两阶段提交”这一重要概念。MySQL将redo log的写入过程细分为“prepare”和“commit”两个步骤&#x…

【LeetCode热题100】146. LRU 缓存(链表)

一.题目要求 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值&#xff0c…

Jenkins插件Parameterized Scheduler用法

Jenkins定时触发构建的同时设定参数。可以根据不同的定时构建器设置不同参数或环境变量的值。可以设置多个参数。并结合when控制stage流程的执行。结合when和triggeredBy区分定时构建的stage和手动执行的stage。 目录 什么是Parameterized Scheduler?如何配置实现呢…

代码随想录训练营Day24:● 理论基础 ● 77. 组合

理论基础 回溯算法解决的问题 回溯法,一般可以解决如下几种问题: 组合问题:N个数里面按一定规则找出k个数的集合 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 排列…

yolo项目中如何训练自己的数据集

1.收集自己需要标注的图片 2.打开网站在线标注网站 2.1 点击右下角Get Start 2.2点击这里上传自己的图片 上传成功后有英文的显示 点击左边的Object Detection,表示用于目标检测 2.3选择新建标签还是从本地加载标签 如果是本地加载标签(左边&#…

基本常用函数help()

Python内置函数 help()函数:查看对象的帮助信息 print()函数:用于打印输出 input()函数:根据输入内容返回所输入的字符串类型 format()函数:格式化显示 len()函数:返回对象的长度或项目个数 slice()函数&#xf…

26-Java访问者模式 ( Visitor Pattern )

Java访问者模式 摘要实现范例 访问者模式(Visitor Pattern)使用了一个访问者类,它改变了元素类的执行算法,通过这种方式,元素的执行算法可以随着访问者改变而改变访问者模式中,元素对象已接受访问者对象&a…

TouchGFX之MVP

TouchGFX用户接口遵循Model-View-Presenter(MVP)架构模式,它是Model-View-Controller(MVC)模式的派生模式。 两者都广泛用于构建用户接口应用。 MVP模式的主要优势是: 关注点分离:将代码分成不…

mysql 排序底层原理解析

前言 本章详细讲下排序,排序在我们业务开发非常常见,有对时间进行排序,又对城市进行排序的。不合适的排序,将对系统是灾难性的,这个不是危言耸听。可能有些人会想,对于排序mysql 是怎么实现的,…

Android 地图SDK 绘制点 删除 指定

问题 Android 地图SDK 删除指定绘制点 详细问题 笔者进行Android 项目开发&#xff0c;对于已标记的绘制点&#xff0c;提供撤回按钮&#xff0c;即删除绘制点&#xff0c;如何实现。 解决方案 新增绘制点 private List<Marker> markerList new ArrayList<>…

Oracle数据库:使用 bash脚本 + 定时任务 自动备份数据

Oracle数据库&#xff1a;使用 bash脚本 定时任务 自动备份数据 1、前言2、为什么需要自动化备份&#xff1f;3、编写备份脚本4、备份脚本授权5、添加定时任务6、重启 crond / 检查 crond 服务状态7、备份文件检查 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

解决:InheritableThreadLocal与线程池共用的问题

回顾一下上篇文章&#xff1a;InheritableThreadLocal和ThreadLocal的区别和使用场景 上篇文章介绍道&#xff0c;InheritableThreadLocal 是 ThreadLocal 的一个子类&#xff0c;它不但继承了ThreadLocal的所有特性&#xff0c;父线程中的 InheritableThreadLocal 变量的值可以…

AI赋能写作:AI大模型高效写作一本通

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

Java学习笔记(15)

JDK7前时间相关类 Date时间类 Simpledateformat Format 格式化 Parse 解析 默认格式 指定格式 EE&#xff1a;表示周几 Parse&#xff1a;把字符串时间转成date对象 注意&#xff1a;创建对象的格式要和字符串的格式一样 Calendar日历类 不能创建对象 Getinstance 获取当…

深度学习pytorch——索引与切片

indexing import torch a torch.rand(4,3,28,28) # 表示4张28*28的rgb图 print(a[0].shape) # a[0]获得第一张图片 print(a[0,0].shape) # a[0,0]获得第一张图片的r图 print(a[0,0,2,4]) # 获得第一张图片第一个通道的一个像素点&#xf…

【C#】【SAP2000】读取SAP2000中所有Frame对象在指定工况的温度荷载值到Grasshopper中

if (build true) {// 连接到正在运行的 SAP2000// 使用 COM 接口获取 SAP2000 的 API 对象cOAPI mySapObject (cOAPI)System.Runtime.InteropServices.Marshal.GetActiveObject("CSI.SAP2000.API.SapObject");// 获取 SAP2000 模型对象cSapModel mySapModel mySap…

4262. 空调(acwing)

文章目录 4262. 空调题目描述贪心差分难点解析差分数组的更新计算最小命令数量更新差分数组反向差分计算计算最小指令数量 4262. 空调 题目描述 Farmer John 的 N头奶牛对他们牛棚的室温非常挑剔。 有些奶牛喜欢温度低一些&#xff0c;而有些奶牛则喜欢温度高一些。 Farmer…

MySQL数据库操作学习(1)

文章目录 一_初识MySQL数据库1、数据库2、数据库分类1.关系型数据库2.非关系型数据库&#xff08;备用&#xff09; 3、数据库概念1.数据&#xff08;data&#xff09;2.数据库&#xff08;database&#xff09;3.数据管理系统&#xff08;DBMS&#xff09; 二、MySQL库操作了解…

315曝光黑灰产业链:主板机

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 315晚会曝光主板机黑灰产业链&#xff0c;主板机是什么呢?可能很多人还不知道。在这里松松给大家普及一下&#xff0c;也欢迎大家关注卢松松哟! 主板机是什么呢? 通过报废手机的主板&#xff0c;拆出来后组装成主…

【XR806开发板试用】xr806 RTC实验

一、例程编译、烧录确认 首先按照全志在线文档平台的点灯教程确保能正常编译、烧录和点灯&#xff1a;https://xr806.docs.aw-ol.com/… 确保例程没问题后&#xff0c;我们再改造例程&#xff0c;实现我们想要的功能 二、代码编写 我们将hello工程复制一份改文件夹名为rtc_demo…