
ClickHouse v25.3.3.42 LTS 补丁版本解读BFloat16 类型转换修复、副本恢复加固与复制链路稳定性提升【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本篇文章围绕 ClickHouse 官方 LTS 分支的补丁版本 v25.3.3.42-lts基于 v25.3.2.39-lts 的增量发布展开逐条解读本次发布包含的 2 项改进、14 项面向用户的 Bug 修复以及若干内部/CI 优化覆盖IN子句的BFloat16类型推导、recoverLostReplica副本恢复、跳数索引skip index分析器行为、Replicated 数据库与可刷新物化视图、Azure 凭据脱敏、cgroup v2 探测、Keeper 会话等关键话题。读完本文你将清楚知道每个修复对应的现象、触发场景与底层原理并能结合当前仓库源码定位到具体实现位置为 LTS 升级评估与问题排查提供依据。版本总览一次面向稳定性的 LTS 补丁迭代v25.3.3.42-lts 是 ClickHouse 25.3 LTS 分支上的第三个补丁版本c4bfe68b052对比对象为前一个补丁版本 v25.3.2.39-lts3ec1fd3f690。从变更集合看本次发布没有新增功能特性全部精力集中在三类工作上改进Improvement2 项涉及BFloat16在IN子句中的类型强制转换以及recoverLostReplica过程中对查询设置的处理Bug 修复Bug Fix14 项均为“官方稳定版本中用户可见的错误行为”的修复横跨复制协议、存储读取、查询分析器、安全脱敏、Keeper 等多个子系统内部/CI 杂项NOT FOR CHANGELOG4 项包括 Kafka 表日志、HTTP 日志、CI 认证迁移、system库表数量上限等非用户可见行为调整。整体上这是一个“小而密”的稳定性补丁包适合所有 25.3 LTS 用户规划升级。改进Improvement1. 修复BFloat16在IN子句中的类型强制转换本次修复直接解决了一个具体查询错误SELECT toBFloat16(1) IN [1, 2, 3]; -- 修复前结果不正确类型强制转换失败 -- 修复后返回 1该问题对应 issue #78754通过 PR #78839 合入。修复前BFloat16作为左操作数与右侧数组/集合做IN匹配时类型强制转换type coercion无法正确建立BFloat16 → 数值的映射导致匹配失败修复后左右两侧能够在同一数值域内正确比较。从当前仓库源码看BFloat16定义于 base/base/BFloat16.h它是一个 16 位浮点类型与Float32拥有相同数量8 位的指数位并且“取Float32表示的高 16 位即为对应的BFloat16”因此可以无损地双向映射到Float32类内大量运算符都经由Float32中转实现。转换函数toBFloat16注册于 src/Functions/FunctionsConversion_reg.cpp实现位于 src/Functions/FunctionsConversion.h。在IN子句的场景下关键逻辑位于 src/Functions/FunctionsConversion.h 中castToType相关分支约 L4228–L4235当目标类型是BFloat16或Float32、Float64时会根据待转换列的内部类型isBFloat16()、isInt8()、isUInt8()等走相应的无损转换路径。本次修复正是补齐了BFloat16这一分支在IN集合匹配场景下与数值字面量之间的强制转换关系使toBFloat16(...) IN [...]能按数值语义正确求值。迁移影响此修复改变了部分IN查询的结果属于“从错误结果纠正为正确结果”的语义变更依赖旧行为的查询需要重新校验期望值。2.recoverLostReplica期间移除查询设置第二个改进延续了此前 PR #78637 的治理方向在副本丢失恢复流程recoverLostReplica期间移除用户级查询设置settings避免恢复过程携带与恢复目标无关的会话配置从而保证恢复动作在“干净”的设置环境下执行。对应的合并请求为 PR #79113。在复制表体系里恢复丢失副本与ATTACH是两条非常接近的路径——本次发布同时包含了对ATTACH移除查询设置的 Bug 修复见下文二者共同构成“恢复/挂载类操作不携带查询设置”的完整修复链。从源码看恢复副本对应的系统查询是SYSTEM RESTORE REPLICA在 src/Interpreters/InterpreterSystemQuery.cpp 中通过RESTORE_REPLICA类型约 L1081分发执行并受AccessType::SYSTEM_RESTORE_REPLICA权限保护约 L1376当副本因损坏无法恢复时src/Storages/StorageReplicatedMergeTree.cpp 会提示用户考虑使用SYSTEM DROP REPLICA与SYSTEM RESTORE REPLICA约 L4157。Bug 修复复制与分布式一致性1. Replicated 数据库中新增副本上可刷新物化视图失效现象在 Replicated 数据库Replicateddatabase engine下可刷新物化视图refreshable materialized viewREFRESHABLE MV在新加入的副本上无法正常工作。修复PR #77774 修复了该问题。此前新副本上的刷新任务编排存在缺口导致视图在部分副本上得不到刷新修复后刷新任务会正确地在新增副本上注册与执行。关联修复与之配套的还有 PR #78277——当副本的disable_insertion_and_mutation为真时不再调度 RefreshMV 任务。因为刷新任务本质上是一种插入insertion一旦disable_insertion_and_mutation开启任务必然失败提前跳过调度可以避免无谓的失败与日志噪声。2. RENAME 紧随 ALTER 之后导致 Database Replicated 元数据被覆盖现象在Replicated数据库中紧跟在ALTER查询之后立即执行RENAME可能发生元数据覆盖metadata override造成表元数据损坏或丢失。修复PR #78107 修复了该竞态。根因在于 ALTER 与 RENAME 之间的元数据交换缺少必要的顺序/版本保护修复后两者之间的操作顺序得到保证元数据不会被错误覆盖。3.Distributed引擎表的FINAL修饰符可能丢失现象对Distributed引擎表执行带FINAL修饰符的查询时FINAL可能在查询改写/分发过程中被丢弃导致查询退化为非去重合并语义返回结果与预期不符。修复PR #78428 修复了该问题。FINAL修饰符在分布式查询规划阶段的传播路径被补全确保下游分片查询同样携带FINAL。4.Merge引擎底层表访问权限校验缺失现象Merge引擎表会聚合读取多个底层表此前对底层表的访问权限校验存在缺口用户可能借由Merge表读取本无权访问的底层表数据。修复PR #78339 补上了对Merge引擎底层表的访问权限校验access validation权限模型更加完整。Bug 修复查询分析器与索引1. 跳数索引在“带字面量表达式”下失效现象当跳数索引skip index的表达式包含字面量literals时在 analyzer 模式下索引无法生效同时索引分析阶段可能残留冗余的平凡类型转换trivial casts干扰索引匹配。修复PR #77229 修复了该问题并在索引分析过程中移除平凡转换trivial casts。修复后类似INDEX ... toLowCardinality(...) TYPE ...或表达式中夹带常量字面量的场景能够正确命中跳数索引查询裁剪pruning恢复正常。2. 回滚preserve_most属性的部分应用现象此前的 PR 将preserve_most属性应用于代码中若干位置但在某些路径上可能引发崩溃crash。修复PR #78449 决定回滚该变更Revert以稳定性优先。这类回滚说明编译器/内建属性如preserve_most调用约定的激进应用需要更充分的回归验证官方选择保守策略。3.max_streams_to_max_threads_ratio压缩流数至 0现象应用max_streams_to_max_threads_ratio设置后若规划出的读取流streams数量被压缩为 0读取将无法进行。修复PR #78505 保证在计算后至少保留一个读取流set at least one stream for reading避免零流导致的读取失败或挂起。Bug 修复存储读取与 I/O1. Wide part 中带前缀子流的预取失效现象在 Wide 数据 part 中对带有前缀prefixes的子流substreams执行预取prefetch时存在缺陷可能导致预取失效或读取错误。修复PR #78205 修复了预取逻辑确保带前缀子流能正确进入预取路径改善大宽表场景的读取效率与正确性。2.ATTACH期间移除查询设置现象执行ATTACH挂载表时如果会话携带了与挂载无关的查询设置可能影响挂载行为或产生非预期副作用。修复PR #78637 在ATTACH过程中移除查询设置与recoverLostReplica的改进PR #79113形成统一策略挂载/恢复类操作在干净设置环境下执行。3. ObjectStorage 集群表函数 表级设置失败现象ObjectStorage对象存储如 S3/Azure Blob 等相关的集群表函数cluster table functions在配合表级设置table level-settings使用时执行失败。修复PR #78587 修复了该组合场景表级设置不再阻断对象存储集群表函数的正常执行。Bug 修复安全与凭据处理1. Azure 访问签名脱敏现象Azure 存储的访问签名access signature即 SAS token此前可能暴露给用户或在日志中明文出现构成凭据泄露风险。修复PR #78189 对 Azure access signature 进行脱敏mask确保签名不会在查询结果、错误信息或日志中明文可见。这属于安全加固类修复升级后应检查依赖日志中 SAS token 的既有运维脚本是否需要适配。2. 错误消息中的 HTTP 版本串现象当 HTTP 请求携带非法的 HTTP 版本字符串时此前日志可能缺少该版本串不利于定位畸形请求来源。修复PR #78264 在日志中记录非法的 HTTP 版本字符串属于 NOT FOR CHANGELOG 类别的配套调整提升可观测性。Bug 修复系统兼容性与资源探测1. 同时启用 cgroup v1 与 v2 时无法识别 v2现象在同时启用 cgroups v1 和 v2的主机上ClickHouse 此前无法正确识别其所在的 cgroup v2 层级导致容器内存/CPU 限制的读取不准确。修复PR #78566 修复了探测逻辑。从仓库源码看cgroup 探测实现在 base/base/cgroupsv2.cppcgroupsV2Enabled()通过检查默认挂载点下的cgroup.controllers文件是否存在来判断 cgroups v2 是否可用该文件仅在主机启用 cgroup v2 时存在cgroupV2PathOfProcess()进一步定位当前进程所属的 v2 路径。修复后混合 cgroup 环境中优先正确识别 v2 层级资源限制读取getMemoryAmount、getAvailableMemoryAmount等上层调用恢复准确。2. Keeper失败的 multi 请求不再触发 watches现象KeeperClickHouse 内置协调服务中失败的 multi 请求如multi中某个操作失败导致整体回滚此前仍可能触发 watcher 通知导致客户端收到与事实不符的事件。修复PR #79247 修复了该行为——失败的 multi 请求不再触发 watches避免客户端基于错误事件做无效或错误的缓存失效/重连逻辑。NO CL CATEGORY 与内部杂项1. NO CL CATEGORY本次发布包含一项未分类的变更PR #78097经 #78326 回溯涉及分析器相关代码调整官方未给出面向用户的可见行为描述属于内部整理。2. 内部与 CI 杂项NOT FOR CHANGELOG / INSIGNIFICANTPR #76720在 Kafka 表相关日志中加入数据库前缀Database Prefix当多个数据库存在同名 Kafka 表时日志归属更准确便于排障PR #78264如上文所述日志记录非法的 HTTP 版本字符串PR #78396CI 迁移到pyjwt认证属于持续集成内部适配PR #78653system数据库中的表不参与表数量上限limit of tables的统计与检查——既然计数时不计入system库检查上限时同样应跳过修复了这一不对称行为。升级与验证建议综合以上变更针对 v25.3.3.42-lts 给出如下验证清单便于在升级后快速回归类型转换语义重点回归BFloat16/浮点类型出现在IN子句、JOIN等涉及类型强制转换的查询确认结果符合数值语义复制与恢复在 Replicated 数据库/复制表环境中验证SYSTEM RESTORE REPLICA、SYSTEM DROP REPLICA流程确认恢复过程不受会话设置干扰新增副本上的可刷新物化视图能正常刷新查询计划检查带字面量的跳数索引查询是否恢复索引裁剪带FINAL的Distributed表查询结果是否去重正确权限与安全验证Merge引擎底层表权限校验、Azure 存储访问签名的脱敏效果系统环境在混合 cgroup v1/v2 的容器环境中确认资源限制读取正常Keeper 集群回归失败 multi 请求的场景确认无多余 watcher 触发表数量上限若配置了表数量限制确认system库表不再计入上限检查。由于本版本全部变更均为修复与内部调整升级风险整体可控但涉及类型转换语义与权限校验的修复建议在测试环境先行回归再推广至生产。关于复制表恢复、权限模型、cgroup 探测与BFloat16类型的具体实现可分别深入 src/Storages/StorageReplicatedMergeTree.cpp、src/Interpreters/InterpreterSystemQuery.cpp、base/base/cgroupsv2.cpp 与 base/base/BFloat16.h 进一步研读。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考