为什么会出现
发生此错误时,表会显示为只读,错误信息中会提示存在相交的 parts。
你可以在日志中看到该错误,或者通过
SELECT *
FROM system.replicas
WHERE is_readonly = 1错误信息如下:
Code: 49. DB::Exception: Part XXXXX intersects previous part YYYYY. It is a bug or a result of manual intervention in the ZooKeeper data. (LOGICAL_ERROR) (version 21.12.4.1 (official build))错误原因
此错误可能是由 mergeSelectingTask 与队列重新初始化之间发生的竞态条件导致的。
解决方案
在所有副本上执行以下查询:
DETACH TABLE table_name; -- DROP REPLICA 的前置操作
SYSTEM DROP REPLICA 'replica_name' FROM ZKPATH '/table_path_in_zk/'; -- 将删除 /table_path_in_zk 下的所有内容
ATTACH TABLE table_name; -- 表将进入只读模式,因为 ZK 中尚无元数据然后在所有副本上执行以下命令:
SYSTEM RESTORE REPLICA table_name; -- 将分离所有分区,在 ZK 中重新创建元数据(如同新建空表),然后重新挂载所有分区
SYSTEM SYNC REPLICA table_name; -- 等待副本同步 parts。建议在恢复完成后检查所有副本上的 `system.detached_parts`。更多资源
相关 PR 和 GitHub issue:
- ClickHouse/ClickHouse#34096
- ClickHouse/ClickHouse#30651
- ClickHouse/ClickHouse#31060
- ClickHouse/ClickHouse#35863
受影响的版本:
ClickHouse v 22.12 及之前版本