clickhouse delete后insert数据不可见问题

本文解决使用ClickHouse ReplicatedMergeTree引擎表,在进行类似Hive overwrite模式写数据时,出现insert后删除的数据不可见的问题。通过调整insert_deduplicate参数设置,确保数据正确更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

clickhouse delete后 insdert 相同数据不可见问题

场景:

使用ReplicatedMergeTree 引擎 创建的表 做类似于hive overwirte 模式的写数据 ,具体的操作步骤是:先使用delete 然后在insert 发现insert 删除前的相同的数据 select时不可见

解决方案:

  • session 级别 : set insert_deduplicate =0 ; 详细说明见:clickhouse官方文档
    在这里插入图片描述

具体操作

  • 第一步:创建一个Replicated表
CREATE TABLE test
(
  `id` Int32,
  `day` Int32
)
  ENGINE = ReplicatedMergeTree('/clickhouse/default/test/', 'replica')
  PARTITION BY day
ORDER BY (id, day)
SETTINGS index_granularity = 8192;
  • 第2步: 初始化 3条记录
insert into test (id, day) values(1 , 202010),(2 , 202010),(3 , 202010);
  • 第3步: 删除某一条记录
ALTER TABLE  test   DELETE WHERE id=1;
  • 第4步: 查询 得到只有 ID 为 2 和 3 的数据
    在这里插入图片描述
  • 第5步: 插入一条第3 步中删除的数据
insert into test (id, day) values(1 , 202010)
  • 第6步 : 查询结果 没什么变化
    在这里插入图片描述

  • 第7步: 设置insert_deduplicat =0

set insert_deduplicate=0  ;
  • 第8步 :再次查询
    在这里插入图片描述
<think>嗯,用户问的是ClickHouse删除数据的方法和语法。我需要先回忆一下ClickHouse数据删除机制。记得ClickHouse作为列式数据库,主要针对OLAP场景,设计上并是为了频繁的更新和删除操作。所以常规的DELETE语句可能适用,或者效率高。 根据之前学过的知识,ClickHouse的MergeTree引擎家族处理数据删除和更新是通过异步的mutation机制。用户执行ALTER TABLE ... DELETE语句后,数据会立即删除,而是标记为非激活状态,等到后台合并时才会物理删除。这点在引用[1]里提到过,block_numbers.number字段处理删除时标记active=0,合并时真正删除。 另外,引用[2]中的链接应该详细说明了更新和删除的实现方式,可能需要参考这些资料确认语法是否正确。比如,ALTER TABLE [db.]table DELETE WHERE condition是标准语法,对吗?同时,这些操作是异步的,需要检查系统表来查看状态。 还有,用户可能需要知道其他删除方法,比如使用DELETE FROM的实验性功能。但根据版本同,可能默认支持,需要开启allow_experimental_lightweight_delete设置。这点需要注意,可能在高版本中支持,但可能有性能影响,尤其是在大数据量情况下。 另外,分区删除也是一个方法,如果数据是按时间分区的,直接删除分区目录会更高效。比如ALTER TABLE ... DROP PARTITION partition_expr,这比逐行删除更快,但需要设计合适的分区键。 临时数据的话,可以通过创建新表、插入所需数据然后重命名的方法。这种方法适用于数据大或者需要完全清理的情况,但会带来一定的停机时间。 用户可能还关心删除后的确认方式,比如检查mutation状态,或者查询system.mutations表。这部分需要详细说明,因为用户执行后可能看到立即效果,需要知道如何跟踪进度。 还要注意权限问题,执行ALTER DELETE需要管理员权限,确保用户有足够的权限。同时,数据删除后的存储空间会立即释放,需要等待合并完成,这可能影响磁盘使用规划。 总结下来,回答需要涵盖标准删除语法、异步mutation机制、实验性DELETE方法、分区删除、临时数据迁移方法,以及注意事项和确认方式。同时引用提供的资料来支持每个步骤的正确性,确保回答的准确性。</think>在ClickHouse删除数据需要特别注意其列式存储引擎的特性,以下是具体方法和操作步骤: ### 一、标准删除方法(异步方式) 1. **ALTER TABLE + DELETE语法** 使用`ALTER TABLE ... DELETE`语句进行逻辑标记删除,实际物理删除发生在后台合并时 ```sql ALTER TABLE [db.]table DELETE WHERE condition ``` *示例:删除用户ID=100的记录* ```sql ALTER TABLE user_log DELETE WHERE user_id = 100 ``` 2. **操作特性说明** - 非实时删除:旧数据会被标记为`active=0`状态[^1] - 物理删除延迟:等待MergeTree引擎自动合并(通常几分钟到几小时) - 可通过`SYSTEM START MERGES`手动触发合并 ### 二、实验性删除方式(同步轻量级删除) 1. **启用实验性功能**(v22.8+) ```sql SET allow_experimental_lightweight_delete = 1 ``` 2. **使用DELETE FROM语法** ```sql DELETE FROM [db.]table WHERE condition ``` *注意事项:* - 需要`allow_experimental_lightweight_delete`配置 - 适合小批量删除(每次最多1万条) ### 三、分区级删除(最高效方式) ```sql ALTER TABLE [db.]table DROP PARTITION partition_expr ``` *示例:删除2020年日志* ```sql ALTER TABLE logs DROP PARTITION '2020-01' ``` ### 四、临时数据清除方法 1. **创建新表迁移数据** ```sql CREATE TABLE new_table AS old_table INSERT INTO new_table SELECT * FROM old_table WHERE ... DROP TABLE old_table RENAME TABLE new_table TO old_table ``` ### 五、操作验证与监控 1. **检查mutation状态** ```sql SELECT * FROM system.mutations WHERE table = 'table_name' ``` 2. **查看突变日志文件** ```bash cat /var/lib/clickhouse/store/xxx/mutation_6.txt ``` 文件内容示例: ``` format version: 1 create time: 2022-02-16 13:33:27 commands: DELETE WHERE ID = \'1\' [^4] ``` ### 六、注意事项 1. 删除操作需要`ALTER DELETE`权限 2. 批量删除时建议按分区操作 3. 数据恢复需通过备份实现 4. 删除后存储空间会立即释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值