clickhouse删除表的问题

前言

在日常使用clickhouse的时候,肯定会遇到删除表的操作,删除表的命令:DROP TABLE IF EXISTS test.test。有时候删除后表又想马上重建表,这时候你会发现相同表结构的表创建不了,以下就来测试一下。

测试

  1. 本地表
    建表语句:

    create table test.test(id Int64 comment 'id',user_id Int64 comment '用户ID')ENGINE = MergeTree() order by id SETTINGS index_granularity = 8192
    

    删除表:DROP TABLE IF EXISTS test.test
    马上重建表,成功。
    在这里插入图片描述

  2. 复制表
    复制表的引擎是ReplicatedMergeTree引擎族,在使用他们到时候需要两个参数:

    1.ZK中该表相关数据的存储路径,ClickHouse官方建议规范化/clickhouse/tables/{shard}/[database_name]/[table_name]
    2.副本名称,一般用{replica}即可。
    

    建表语句:

    create table test.test(id Int64 comment 'id',user_id Int64 comment '用户ID')ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/{shard}','{replica}') order by id SETTINGS index_granularity = 8192
    

    删除表:DROP TABLE IF EXISTS test.test
    马上重建表,失败。失败提示如下:
    在这里插入图片描述

  3. 分布式表
    ClickHouse分布式表的本质并不是一张表,而是一些本地物理表(分片)的分布式视图,本身并不存储数据。

    建表语句:

    create table test.test_all as test.test ENGINE = Distributed(yk_ck_cluster, test, test, rand())
    

    删除表:DROP TABLE IF EXISTS test.test_all
    马上重建表,成功。

解决办法

在我们删除本地表和分布式表后,立即重建是没有问题的。唯一有问题的就是复制表,因为复制表需要在zookeeper上建立一个路径,存放相关数据。clickhouse默认的库引擎是原子数据库引擎,删除Atomic数据库中的表后,它不会立即删除,而是会在480秒后删除。由下面这个参数控制:

config.xml
<database_atomic_delay_before_drop_table_sec>480</database_atomic_delay_before_drop_table_sec>

我们可以使用一下办法来解决这个问题:

  • 使用普通数据库而不是原子数据库。 create database … Engine=Ordinary.
  • 使用uniq ZK路径。{uuid}/clickhouse/tables/{layer}-{shard}-{uuid}/
  • 减少database_atomic_delay_before_drop_table_sec = 0 & drop table … sync
  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值