ClickHouse v23.12.2.59-stable 更新解析:clean_deleted_rows 弃用与 MergeTree 稳定性修复
2026/9/14 8:06:57 网站建设 项目流程

ClickHouse v23.12.2.59-stable 更新解析:clean_deleted_rows 弃用与 MergeTree 稳定性修复

【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse

本篇解读 ClickHouse v23.12.2.59-stable 相对 v23.12.1.1368-stable 的完整变更清单:一条向后不兼容的 MergeTree 行为调整(clean_deleted_rows弃用、OPTIMIZE ... CLEANUP收紧)与五项用户可见的 Bug 修复。读完本文,你将了解该版本每项变更的实际影响范围、涉及的源码位置,以及在升级 23.12 分支前需要做哪些配置与脚本层面的自查。

版本概览

依据 v23.12.2.59-stable 变更记录,本次发布基于提交17ab210e761,对比基线为 v23.12.1.1368-stable(a2faa65b080)。变更按 ClickHouse 官方 changelog 分类约定分为四类:

分类含义本版本条目数
Backward Incompatible Change向后不兼容变更,升级后行为变化1
Bug Fix用户可见的误行为修复(官方 stable 发布中出现的)5
NO CL ENTRY合入代码但不写入 changelog 的变更1
NOT FOR CHANGELOG / INSIGNIFICANT脚本、测试、维护性修改5

下面按分类逐项展开,并结合当前仓库源码验证关键实现。

向后不兼容变更:clean_deleted_rows弃用与 CLEANUP 合并收紧

本次发布唯一一条向后不兼容变更(内部关联 issue #58389,修复 PR #58316)包含两层含义:

  1. MergeTree 表设置clean_deleted_rows被标记为废弃,不再产生任何效果
  2. OPTIMIZE语句的CLEANUP关键字默认不再允许使用,除非显式启用allow_experimental_replacing_merge_with_cleanup

这条变更在语义上宣告了 ReplacingMergeTree 早期“在合并时物理清理删除行”实验路径的收尾。在 MergeTreeSettings.cpp 中可以看到clean_deleted_rows已被移入 OBSOLETE(废弃)设置列表,默认值固定为CleanDeletedRows::Never

MAKE_OBSOLETE_MERGE_TREE_SETTING(M, CleanDeletedRows, clean_deleted_rows, CleanDeletedRows::Never) \

被弃用的路径由新的实验性开关接替。在 MergeTreeSettings.cpp#L2307-L2327 中,allow_experimental_replacing_merge_with_cleanup的说明明确给出了替代方案的行为边界:

DECLARE(Bool, allow_experimental_replacing_merge_with_cleanup, false, R"( Allow experimental CLEANUP merges for ReplacingMergeTree with `is_deleted` column. When enabled, allows using `OPTIMIZE ... FINAL CLEANUP` to manually merge all parts in a partition down to a single part and removing any deleted rows. Also allows enabling such merges to happen automatically in the background with settings `min_age_to_force_merge_seconds`, `min_age_to_force_merge_on_partition_only` and `enable_replacing_merge_with_cleanup_for_min_age_to_force_merge`. )", EXPERIMENTAL)

从这段设置文档可以看出:

  • 启用后,OPTIMIZE ... FINAL CLEANUP才允许对带is_deleted列的 ReplacingMergeTree 分区执行“合并到单 part 并物理删除已标记删除行”的合并;
  • 除手动触发外,还可与min_age_to_force_merge_secondsmin_age_to_force_merge_on_partition_onlyenable_replacing_merge_with_cleanup_for_min_age_to_force_merge组合,让后台合并按策略自动执行 CLEANUP 合并;
  • 该开关带有EXPERIMENTAL标志,默认值为false

CLEANUP关键字本身仍存在于语法层面。从 ParserOptimizeQuery.cpp#L37 可以看到解析器中仍注册了ParserKeyword s_cleanup(Keyword::CLEANUP),查询语法帮助中也保留了OPTIMIZE TABLE [db.]name DRY RUN PARTS 'part_name1', 'part_name2' [, ...] [DEDUPLICATE [BY expression]] [CLEANUP]的形式(见 ParserOptimizeQuery.cpp#L187)。也就是说,语法上CLEANUP依旧可被解析,但执行是否放行取决于上述实验性设置的开关状态。

升级自查建议:如果你的建表语句或users.xml/ 配置文件中仍保留clean_deleted_rows,在升级到本版本后该参数将静默失效(不再报错但也不再生效);依赖OPTIMIZE ... CLEANUP收缩已删除行占用的自动化脚本,需要改为依赖 ReplacingMergeTree 自身的去重合并语义,或显式评估是否启用实验性 CLEANUP 合并路径。

Bug Fix:五项用户可见问题修复

1.flatten_nested只展平真正的 Nested 类型,不再误伤所有Array(Tuple)(PR #56132)

修复前,当flatten_nested = 1时,除真正的Nested类型外,普通Array(Tuple)列也会被错误地展平。flatten_nested是一个会话级设置,在 Settings.cpp#L5780 中声明,默认值为true

DECLARE(Bool, flatten_nested, true, R"(...)

设置文档中的示例表明其设计意图是:对含Nested列的表,默认以SET flatten_nested = 1;Nested列展开为顶层的Array别名,方便直接查询;而SET flatten_nested = 0;则保留原有嵌套访问方式。本次修复把展平行为限定在“真正的Nested类型”上,避免了该默认开启的设置对普通Array(Tuple)列产生副作用。

2. StreamingFormatExecutor 读取缓冲区工作异常修复(PR #57438)

修复了流式格式执行器(StreamingFormatExecutor)在处理读取缓冲区时的错误行为。该执行器负责文件/流读取场景下的逐行解码管线,本次修复属于读取路径的正确性问题,影响面为依赖流式读取的格式处理链路。

3. 删除含损坏 detached part 的副本后 blob 丢失修复(PR #58333)

修复了副本删除(drop replica)路径上的资源泄漏:当副本中存在损坏的 detached part 时,删除副本后相关数据 blob(S3 等对象存储上的数据文件)未被正确清理回收。该修复使“删除副本”这一运维操作在存在损坏 part 的边界条件下也能完成存储侧的清理闭环,避免出现对象存储中残留无人引用的数据文件。

4. Graphite 表缺少聚合函数时的段错误修复(PR #58453)

Graphite 数据导入依赖表结构中的聚合函数;此前当 Graphite 表未配置聚合函数时会触发段错误(segfault)。本次修复消除了这一崩溃路径,使非法表结构场景下能够以错误提示而非进程崩溃的方式暴露问题。

5. 纯 LIMIT 查询禁用 MergeTreePrefetchedReadPool(PR #58505)

针对“只带 LIMIT 的查询”这类轻量查询,禁用了MergeTreePrefetchedReadPool(带预取能力的读取池)。在 ReadFromMergeTree.cpp#L745 中可以看到对应的启用条件:

bool use_prefetched_read_pool = query_info.trivial_limit == 0 && (allow_prefetched_remote || allow_prefetched_local);

即只有当trivial_limit为 0(不是单纯 limit 查询)且满足本地/远程文件系统预取条件时,才会构造MergeTreePrefetchedReadPool。这一改动避免了轻量 limit 查询无谓地进入预取读取池的开销路径。

NO CL ENTRY:回滚 Refreshable 物化视图接管方案(PR #58296)

本版本包含一次不进入 changelog 的代码回滚:撤销了 “Refreshable materialized views (takeover)” 的引入。从条目内容看,这是针对 Refreshable 物化视图接管(takeover)机制的一次回退,意味着本 stable 版本不包含该新机制的行为。对于关注物化视图能力的用户,以本版本实际发布代码为准。

维护性变更(NOT FOR CHANGELOG / INSIGNIFICANT)

以下条目不影响功能行为,属于发布工程与测试维护,此处按原文完整列出以保证变更清单的完整性:

  • 修复发布脚本错误——此前该脚本不允许发布 23.12 分支(PR #58288);
  • 在 v23.12.1.1368-stable 发布后更新version_date.tsv与各 changelog(PR #58290);
  • 修复test_storage_s3_queue/test.py::test_drop_table测试用例(PR #58293);
  • 处理 Keeper 预处理(preprocessing)的另一种场景(PR #58308);
  • 修复test_user_valid_until测试用例(PR #58409)。

小结:升级该版本需要关注什么

  1. clean_deleted_rows已废弃:出现在建表参数或配置中的该设置不再起作用,可在配置清理中移除;
  2. OPTIMIZE ... CLEANUP默认不可用:依赖 CLEANUP 合并的脚本需要评估是否启用allow_experimental_replacing_merge_with_cleanup,或改用 ReplacingMergeTree 常规去重合并;
  3. 五项 Bug 修复分别覆盖flatten_nested展平边界、流式读取、副本删除的资源回收、Graphite 导入崩溃与轻量查询的读取池启用逻辑,若你的环境命中上述任一场景,本次升级可直接消除对应故障;
  4. Refreshable MV takeover 被回滚:本版本不包含该实验机制。

如需核对完整原始条目,可查阅 v23.12.2.59-stable 变更记录;相关实现的源头集中在 MergeTree 设置定义、MergeTree 读取计划 与 OPTIMIZE 查询解析器 等文件中。

【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询