写点什么

Clickhouse:delete 提交成功,数据还在

作者:Ken
  • 2022-10-15
    北京
  • 本文字数:756 字

    阅读完需:约 1 分钟

数据仓库通常对数据更新和删除的支持都不太好。clickhouse 作为数据仓库,提供了 update 和 delete 的功能,在 clickhouse 中这种操作称为 mutation 操作。mutation 操作一个很大的特点是异步执行。异步执行会带来一些奇怪的问题


问题:delete 语句提交成功,数据没删除

假设有一个名为 test 的库。先准备数据:

CREATE TABLE person_detail  (id String, gender String,name String,age UInt8) ENGINE = MergeTree ()  PRIMARY KEY id ORDER BY id;

INSERT INTO person_detail(id, gender, name, age) VALUES('id1', '女', '张三', 12); INSERT INTO person_detail(id, gender, name, age) VALUES('id2', '男', '李四', 13);
复制代码


接下来把张三的年龄改为 15 岁。但是却把他的 ID 写错了,漏掉了单引号

alter table person_detail update age = 15 where id in(id1) ;
复制代码

上面的 SQL 并没有报错。但是,查一下结果,张三的年龄还是 12:



分析

为什么会这样呢?原因就是 mutation 操作是异步的,上面的 SQL 提交成功了,但并没有执行成功。用下面的 SQL 查一下:

select * from system.mutations where is_done = 0;
复制代码



system.mutations 存放 mutation 操作的信息。clickhouse 后台任务会扫描这个系统表,执行其中的 mutation 操作。可以看到,update 操作失败了。


这时候,如果我再更新李四的年龄,这次 SQL 是正确的

alter table person_detail update age = 16 where id in('id2') ;
复制代码

查下结果:



虽然 SQL 正确,但是李四的年龄仍然没更新。再查下 system.mutations:



可以看到,SQL 失败了,是由修改张三年龄的 SQL 失败导致的。


解决

解决办法是杀掉失败的 mutations。

粗力度的办法,是把 test 库的 mutations 都 kill 掉

KILL MUTATION where database = 'test'; 
复制代码

细粒度的办法,是精准杀有问题的 mutation

KILL MUTATION where mutation_id = 'mutation_12.txt';
复制代码

杀完 mutations,问题就解决了。

发布于: 刚刚阅读数: 3
用户头像

Ken

关注

各位网友好,我是一农 2018-11-08 加入

半农+半农=1农

评论

发布
暂无评论
Clickhouse:delete提交成功,数据还在_Clickhouse_一农_InfoQ写作社区