# 正确删除并理解ClickHouse表和分区

news/2024/10/11 16:54:49/

ClickHouse表有一组数据块组成,称为分区和部分,分区是逻辑概念,对应磁盘上的目录,部分对应磁盘上的实际文件。

我们可以从表中分离(detach) 分区(partition)或部分(parts),并没有实际删除数据,意味着数据从表中删除,并没有从磁盘上删除,我们可以在未来某个时刻重新附着分区或部分。

硬删除表数据

当删除原子数据库引擎表时,数据和表本身没有立刻从磁盘删除。只有当表不再被并发查询使用并且从收到查询已过去8分钟(old_parts_lifetime参数设置)时才会被真正删除。

例如,在某些情况下在删除并重新创建表时,可能会导致Zookeeper出现问题。因为表元数据仍然存在,等待异步删除,但此时试图再次创建它。例如:删除已复制的表并立即重新创建它将导致Zookeeper错误。

production-01 :) drop table test.myTable;DROP TABLE test.myTableQuery id: 5a1e5daa-567e-49fb-aa11-c08c31fcde40Ok.0 rows in set. Elapsed: 0.005 sec. production-01 :) CREATE TABLE test.myTable(`timestamp` DateTime,`event_type` String)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/test.myTable', '{replica}')PARTITION BY toYear(timestamp)ORDER BY (timestamp)CREATE TABLE test.myTable
(`timestamp` DateTime,`event_type` String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/test.myTable', '{replica}')
PARTITION BY toYear(timestamp)
ORDER BY timestampQuery id: 26669a72-ba6f-4c99-860c-67f75272f3c20 rows in set. Elapsed: 0.030 sec. Received exception from server (version 22.10.1):
Code: 253. DB::Exception: Received from clickhouse-01:49000. DB::Exception: Replica /clickhouse/tables/01-01/test.myTable/replicas/clickhouse-01 already exists. (REPLICA_IS_ALREADY_EXIST)

为了避免这种错误,可以增加sync修饰符,它会同步删除数据和表元数据,直到所有数据都被清除后才返回。这时重新创建表不会产生错误:

production-01 :) CREATE TABLE test.myTable2(`timestamp` DateTime,`event_type` String)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/test.myTable2', '{replica}')PARTITION BY toYear(timestamp)ORDER BY (timestamp)CREATE TABLE test.myTable2
(`timestamp` DateTime,`event_type` String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/test.myTable2', '{replica}')
PARTITION BY toYear(timestamp)
ORDER BY timestampQuery id: 55afb63f-c4aa-46cb-b00b-c33bc7750c16Ok.0 rows in set. Elapsed: 0.045 sec. production-01 :) DROP TABLE test.myTable2 SYNC;DROP TABLE test.myTable2 SYNCQuery id: 645e3e7b-17ea-4857-a405-d789378bdb2cOk.0 rows in set. Elapsed: 0.046 sec. production-01 :) CREATE TABLE test.myTable2(`timestamp` DateTime,`event_type` String)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/test.myTable2', '{replica}')PARTITION BY toYear(timestamp)ORDER BY (timestamp)CREATE TABLE test.myTable2
(`timestamp` DateTime,`event_type` String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/test.myTable2', '{replica}')
PARTITION BY toYear(timestamp)
ORDER BY timestampQuery id: 4dc22cdb-7e39-415c-8813-63a76c9ba3deOk.0 rows in set. Elapsed: 0.039 sec.

注意,SYNC也在删除数据库时也可使用:

DROP DATABASE test SYNC;

实际应用中会遇到一些表的分区或部分数据不能正确加载,通过查看系统表可以看到这些分区或部分的状态,下面一节我们分析造成这些状态的原因,以及如何查询定位,方便后续手动修复。

分离分区或部分的原因

有以下几种原因导致有分离状态的分区或部分:

  • 执行手动命令产生的分离状态分区或部分:[ALTER TABLE DETACH PART|PARTITION](https://clickhouse.com/docs/en/sql-reference/statements/alter/partition/#detach-partitionpart)

  • 在本地存在的part,在Zookeeper元数据中却没有,其状态会被设置未:“unexpected” 或 “ignored”

  • 在本地和Zookeeper元数据中都存在的part,但状态不匹配。part将被设置未 “broken” ,并从另外服务器从新下载

  • 法定数量未达到的part。将设置为 “noquorum”

还有其他原因,但上述几个是最常见的。大多数情况下是由于不正当关闭ClickHouse造成的。当ClickHouse服务启动时开始执行正常检查,通过分离受影响的部分,ClickHouse可以继续启动(而不是崩溃),并允许您修复问题。

查询分离的表分区和部分

通过查询system.detached_parts表,你能发现ClickHouse服务器所有已分离的部分。

    SELECT *FROM system.detached_partsQuery id: fbc3d2b7-94c1-4ba4-8197-d3781efea792┌─database─┬─table──────────────────────────────┬─partition_id─┬─name──────────────────────────────┬─disk────┬─reason──┬─min_block_number─┬─max_block_number─┬─level─┐│ database │ t_957657bace18444a80fc9b465269e132 │ 202203       │ broken_202203_4554988_4554988_0   │ default │ broken  │          455498845549880 ││ database │ t_957657bace18444a80fc9b465269e132 │ 202201       │ ignored_202201_6774780_6774868_20 │ default │ ignored │          6774780677486820 ││ database │ t_7777dbf2efff4253b7d0802112ae4061 │ 202103202103_764230_1414635_14_984413   │ default │         │           764230141463514 ││ database │ t_7777dbf2efff4253b7d0802112ae4061 │ 202103202103_1414636_1448800_9          │ default │         │          141463614488009 ││ database │ t_7777dbf2efff4253b7d0802112ae4061 │ 202103202103_730438_764229_9            │ default │         │           7304387642299 ││ database │ t_7777dbf2efff4253b7d0802112ae4061 │ 202103202103_0_730437_45                │ default │         │                073043745 ││ database │ t_ab2e566af7e74637977f07ba42339f1e │ 202103202103_192019_400537_14_717974    │ default │         │           19201940053714 ││ database │ t_ab2e566af7e74637977f07ba42339f1e │ 202103202103_95413_192018_13_717974     │ default │         │            9541319201813 │└──────────┴────────────────────────────────────┴──────────────┴───────────────────────────────────┴─────────┴─────────┴──────────────────┴──────────────────┴───────┘

http://www.ppmy.cn/news/438548.html

相关文章

macappstore登不上去_Mac系统打不开appstore如何解决

appstore是应用商店,相信大家也都熟悉了,下载应用程序都可以在里面操作。好多小伙伴说在Mac系统打不开appstore应用商店,这样就没办法下载应用程序了,怎么办?出现这种问题的时候不要盲目的使劲去点,大家可以…

app store 打不开

主要是添加DNS可以改善这一情况 在 http://www.v2ex.com 里 最下方点击dns 可以找到最快的链接节点

“XXX.app 已损坏,打不开。您应该将它移到废纸篓”,Mac应用程序无法打开或文件损坏的处理方法(2)

1. 检查状态 在sip系统完整性关闭前,我们先检查是否启用了SIP系统完整性保护。打开终端输入以下命令【csrutil status】并回车: 你会看到以下信息中的一个,用来指示SIP状态。已关闭 disabled: System Integrity Protection status: disabl…

iphone文件app里无法连接服务器,苹果商店怎么打不开 无法连接到app store解决方法...

类型:ios办公学习大小:46.5M语言:中文 评分:10.0 标签: 立即下载 苹果商店是苹果商店下载app的唯一途径,由于服务器在国外,用户有时会碰到打不开的情况,今天很多小伙伴进入苹果商店显…

苹果app无法打开显示无法连接服务器,无法连接到app store是什么原因?苹果应用商店打不开的解决方法...

无法连接到app store是什么原因?苹果应用商店打不开的解决方法 使用iPhone的小伙伴一定都碰到过这种情况,有时候我们打开苹果应用商店,会提示“无法连接到app store”。这可让急于下载app的小伙伴着急了,难得要下载个东西,结果还不让下载了? 在这一点上,安卓用户就比iOS…

Mac下安装的软件打不开

问题:app已损坏,打不开。你应该将它移到废纸篓。 原因: 并非你安装的软件已损坏,而是Mac系统的安全设置问题,因为这些应用都是破解或者汉化的,那么解决方法就是临时改变Mac系统安全设置。 解决方法: 方案一…

Android没有报错,运行模拟器,提示停止运行,App根本打不开,下面是日志,烦请大佬们看看呐

2020-12-07 11:36:36.206 2122-2176/? D/WifiNative-HAL: Failing getSupportedFeatureset because HAL isn’t started 2020-12-07 11:36:36.206 2122-2140/? E/BatteryStatsService: no controller energy info supplied 2020-12-07 11:36:36.206 2122-2140/? E/BatterySt…

Android 微信小程序打不开app方案解决

之前一直困扰着app跳转小程序之后,小程序中无法唤起APP了,而且的响应信息也没有,终于结合多方案解决这个问题。 1,manifest中一定要这么写 2,WXEntryActivity必须要放指定路径,而且位于包名下,…