Clickhouse:delete 提交成功,数据还在
数据仓库通常对数据更新和删除的支持都不太好。clickhouse 作为数据仓库,提供了 update 和 delete 的功能,在 clickhouse 中这种操作称为 mutation 操作。mutation 操作一个很大的特点是异步执行。异步执行会带来一些奇怪的问题
问题:delete 语句提交成功,数据没删除
假设有一个名为 test 的库。先准备数据:
复制代码
接下来把张三的年龄改为 15 岁。但是却把他的 ID 写错了,漏掉了单引号
复制代码
上面的 SQL 并没有报错。但是,查一下结果,张三的年龄还是 12:
分析
为什么会这样呢?原因就是 mutation 操作是异步的,上面的 SQL 提交成功了,但并没有执行成功。用下面的 SQL 查一下:
复制代码
system.mutations 存放 mutation 操作的信息。clickhouse 后台任务会扫描这个系统表,执行其中的 mutation 操作。可以看到,update 操作失败了。
这时候,如果我再更新李四的年龄,这次 SQL 是正确的
复制代码
查下结果:
虽然 SQL 正确,但是李四的年龄仍然没更新。再查下 system.mutations:
可以看到,SQL 失败了,是由修改张三年龄的 SQL 失败导致的。
解决
解决办法是杀掉失败的 mutations。
粗力度的办法,是把 test 库的 mutations 都 kill 掉
复制代码
细粒度的办法,是精准杀有问题的 mutation
复制代码
杀完 mutations,问题就解决了。
版权声明: 本文为 InfoQ 作者【一农】的原创文章。
原文链接:【http://xie.infoq.cn/article/88ba5cc5ed88eef314a6a2b08】。文章转载请联系作者。
评论