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

这篇具有很好参考价值的文章主要介绍了# 正确删除并理解ClickHouse表和分区。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

硬删除表数据

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

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

production-01 :) drop table test.myTable;

DROP TABLE test.myTable

Query id: 5a1e5daa-567e-49fb-aa11-c08c31fcde40

Ok.

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 timestamp

Query id: 26669a72-ba6f-4c99-860c-67f75272f3c2


0 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 timestamp

Query id: 55afb63f-c4aa-46cb-b00b-c33bc7750c16

Ok.

0 rows in set. Elapsed: 0.045 sec. 

production-01 :) DROP TABLE test.myTable2 SYNC;

DROP TABLE test.myTable2 SYNC

Query id: 645e3e7b-17ea-4857-a405-d789378bdb2c

Ok.

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 timestamp

Query id: 4dc22cdb-7e39-415c-8813-63a76c9ba3de

Ok.

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服务器所有已分离的部分。文章来源地址https://www.toymoban.com/news/detail-499217.html

    SELECT *
    FROM system.detached_parts

    Query 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 │
    └──────────┴────────────────────────────────────┴──────────────┴───────────────────────────────────┴─────────┴─────────┴──────────────────┴──────────────────┴───────┘

到了这里,关于# 正确删除并理解ClickHouse表和分区的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Iceberg从入门到精通系列之五:Zeppelin集成iceberg,创建iceberg普通表和分区表,并插入数据

    Zeppelin支持Flink SQL Flink SQL支持iceberg Zeppelin集成Flink SQL后,就可以在Zeppelin上创建iceberg表了 下面演示下Zeppelin集成iceberg后,创建表,插入数据的方便性。

    2024年02月11日
    浏览(48)
  • MySQL分区表的正确使用方法,适用场景,建立分区的条件

    什么是MySQL分区? MySQL分区是将一张表分割成独立的子表的技术。每个子表被称为分区,它们有着相同的结构和字段,但存储着不同的数据。这项技术可以提高查询速度,减少日志文件和磁盘空间的使用。 建立分区的条件 要建立MySQL分区,需要满足以下几个条件: 1.所需的

    2024年02月07日
    浏览(44)
  • 硬盘分区,格式化分区,删除分区

    使用parted命令分区(fdisk命令最大支持2T,大于2T的硬盘需要使用parted来分区) 删除分区 1、利用fdisk命令获取需要删除的分区,语法为“fdisk /dev/sda1” 2、在“Command (m for help):”后输入“d”删除指定的分区; 3、输入“w”保存删除分区的修改即可。 格式化分区 sudo mkfs -t ext4 /

    2024年02月11日
    浏览(41)
  • clickhouse 删除操作

    OLAP 数据库设计的宗旨在于分析适合一次插入多次查询的业务场景,市面上成熟的 AP 数据库在更新和删除操作上支持的均不是很好,当然 clickhouse 也不例外。但是不友好不代表不支持,本文主要介绍在 clickhouse 中如何实现数据的删除,以及最新版本中 clickhouse 所做的一些技术

    2024年02月13日
    浏览(28)
  • ALTER TABLE 分区操作-动态增加一级,多级分区,动态删除分区

    alter 分区操作包括增加分区和删除分区操作,这种分区操作在Spark3.x之后被支持,spark2.4版本不支持,并且使用时,必须在spark配置中加入spark.sql.extensions属性,其值为:org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,在添加分区时还支持分区转换,语法如下: 添加分区语

    2024年02月16日
    浏览(40)
  • 二百二十四、Kettle——曲线实现从Hive插入更新到ClickHouse(分区字段是month或year)

    对于以month、year为分区字段的数据,不是像day字段分区那样每天增量插入更新即可,而是要以部分字段查询、部分字段更新,但是ClickHouse数据库并不适合更新操作,直接使用Kettle的插入更新控件会导致问题,必须曲线实现这个功能 对于这类表,每天执行任务时scene_name、dev

    2024年02月21日
    浏览(37)
  • Linux之硬盘的根目录扩容、新建分区、删除分区,挂载分区

    一、新建分区、删除分区、挂载分区: root权限下操作:  二、对根目录进行扩容 #虚拟机扩展硬盘后,系统本身无法识别这些多出来的空间,此时就需要对硬盘进行扩容。 root权限下操作:   开始扩容:   示例图:  

    2024年02月15日
    浏览(51)
  • hive删除分区部分数据

    hive表删除数据不能使用delete from table_name 的SQL语句, 一。删除分区部分数据 注意:select后面不能使用* 二、删除分区全部数据 三、删除多个分区数据

    2024年02月13日
    浏览(45)
  • linux硬盘分区与删除

    linux硬盘分区:MBR分区(2T以下)      GPT分区(2T以上)                             命令fdisk                            命令gdisk 1.先在虚拟机建立一个新的磁盘 2.在虚拟机查看磁盘分区  直接打命令lsblk 显示不出才创建的磁盘 需要进行刷新,才能显示出来,我们输

    2024年01月16日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包