
ClickHouse v24.8.6.70-lts 版本发布详解LTS 分支的关键修复与稳定性保障【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse导读本文基于 ClickHouse 官方变更日志 docs/changelogs/v24.8.6.70-lts.md对 2024 年 LTS 分支的补丁版本 v24.8.6.70-lts 进行深入解读。该版本在 v24.8.5.115-lts 的基础上通过 1 个向后不兼容变更、3 项性能优化改进、22 项用户可见 Bug 修复和若干内部修复持续夯实了 24.8 LTS 主干在对象存储磁盘、JSON 子列、聚合函数、JOIN 优化等关键路径上的稳定性。读完本文你将掌握该版本的完整变更清单、每个修复对应的底层实现原理与仓库源码位置并能够据此评估升级风险、排查相关异常。版本概览版本与基线信息根据变更日志头部信息版本号v24.8.6.70-lts构建哈希ddb8c219771对比基线v24.8.5.115-lts构建哈希8c4cb00a384发布类型LTSLong Term Support长期支持分支变更来源本版本全部变更均为从主线向后移植Backport的补丁通过对应的 PR 与跟踪 Issue 管理本版本所有条目均遵循 ClickHouse 的 backport 流程每个修复都关联一个 tracking issue形式为Backported in [#xxxxx]与原始 PR形式为[#xxxxx]这种双编号机制便于用户回溯修复的完整上下文也体现了 LTS 分支严格的变更准入与质量控制。变更分类统计本版本变更可分为四类类别数量含义Backward Incompatible Change1可能影响既有行为的变更Improvement3性能或行为改进Bug Fix用户可见22修复官方稳定版中的用户可见错误NOT FOR CHANGELOG / INSIGNIFICANT5内部修复或 CI 调整不写入面向用户的主变更日志其中 Bug Fix 占比最高是本次发布的核心内容覆盖聚合函数、JOIN 优化、对象存储、JSON 子列、物化视图、窗口函数、异步插入等多个子系统。Backward Incompatible ChangeJSON 子列文件名转义修复本版本唯一的向后不兼容变更来自 PR #71182由 Pavel KruglovAvogar提交修复由于 JSON 子列文件中特殊符号未转义导致的No such file or directory错误。问题本质当表包含JSON类型列时ClickHouse 会将 JSON 的每个子对象、子数组subcolumn存储为独立的文件或独立的数据子列。如果 JSON 键名中包含特殊符号例如路径分隔符、通配符等在生成对应文件名时若未进行转义就会导致文件系统解析出错表现为读取时抛出No such file or directory。实现佐证JSON 子列的完整处理逻辑集中在 src/DataTypes/DataTypeJSON.cpp 与相关列实现中其中SerializationJSON负责子列的序列化与文件路径生成。修复前特殊符号直接拼入文件名修复后所有特殊符号在文件名生成阶段被正确转义。升级影响该变更可能改变含特殊符号键名的 JSON 子列在磁盘上的物理文件名对于已经用旧版本写入、文件名未转义的数据升级后读取时可能出现路径不匹配建议升级前对相关表执行ALTER TABLE ... FREEZE或CHECK TABLE以验证数据可读性新版写入的数据将使用转义后的文件名新旧数据混存时需注意。Improvement对象存储成本与效率优化本版本包含三项改进全部聚焦对象存储S3 等场景核心目标是降低 API 调用成本、减少网络往返。1. Keeper 同步 user_directories 时跳过校验PR #70644内容从 KeeperClickHouse Keeper / ZooKeeper同步user_directories时不再执行校验。意义减少分布式环境下用户目录同步时的额外开销与潜在失败点。该改动不影响本地配置读取仅在 Keeper 同步路径生效。2. 目录列表不再调用对象存储 APIPR #70823内容列出目录时不再调用对象存储 API如 S3 ListObjects而是将文件名列表缓存在内存中。权衡以更长的首次加载时间和更多内存占用为代价换取更低的 API 调用成本。对于按请求计费的对象存储尤其是云厂商按 LIST/HEAD 次数收费的场景该优化能显著降低成本。适用对象主要影响使用对象存储元数据如plain_rewritable磁盘等场景的目录枚举操作。3. 减少 plain_rewritable 磁盘的 HEAD 请求PR #70915内容减少plain_rewritable磁盘中对象存储 HEAD API 请求的数量。背景plain_rewritable磁盘在操作对象读取元数据、校验存在性时经常需要发起 HEAD 请求获取对象元数据。本修复通过复用已有请求结果、减少重复查询降低了 API 调用频次。实现佐证对象存储 HEAD 元数据获取的核心接口为IObjectStorage::getObjectMetadata()例如 Azure 实现见 src/Disks/DiskObjectStorage/ObjectStorages/AzureBlobStorage/AzureObjectStorage.cppS3 实现位于 src/Disks/DiskObjectStorage/ObjectStorages/S3/S3ObjectStorage.cppplain_rewritable磁盘元数据操作封装在 src/Disks/DiskObjectStorage/MetadataStorages/PlainRewritable/ 目录下。成本提示使用 S3/Azure Blob 等按请求计费存储的用户建议关注system.disks与对象存储账单中 LIST/HEAD 请求量的变化以验证本版本优化效果。Bug Fix 详解22 项查询正确性类JOIN ON 条件IS NULL优化错误PR #68049问题当JOIN ... ON条件中IS NULL检查位于任意其他函数如NOT之内时原有的 ON 条件优化会错误改写导致错误查询结果关联 Issue #67915。影响所有使用复杂 ON 表达式含NOT IS NULL、IS NULL与其他函数嵌套的 JOIN 查询。建议使用EXPLAIN检查 JOIN 优化前后的计划差异升级后建议对关键 JOIN 查询补充结果校验。空元组传入数组时的异常PR #68848问题向数组传入空元组empty tuple时抛出非预期异常关联 Issue #68618。示例类似SELECT [tuple()]或相关空元组场景。tuple 函数在命名元组间复用列PR #70103问题计算tuple函数时不同命名元组named tuples之间错误复用了列对象导致结果错误关联 Issue #70022。说明命名列named columns特性在函数调用中被不当复用。修复后每个命名元组独立计算。默认关闭enable_named_columns_in_function_tuplePR #70833问题tuple函数中的命名列行为存在正确性隐患。处理默认将设置enable_named_columns_in_function_tuple关闭false。该设置在 src/Core/Settings.h 中定义。若业务依赖 tuple 命名列行为需显式开启并验证结果。两级哈希表负零导致逻辑错误PR #70979问题两级哈希表two-level hash table中**负零negative zero, -0.0**作为键时产生逻辑错误关联 Issue #70973。原理-0.0与0.0在浮点比较中相等但位模式不同导致哈希表在分区两级结构时出现键定位不一致。修复统一处理负零。崩溃类Crash / Segfault物化视图 INTERSECT 触发段错误PR #70264问题创建包含两个 SELECT 且使用INTERSECT的物化视图时服务端段错误例如CREATE MATERIALIZED VIEW v0 AS (SELECT 1) INTERSECT (SELECT 1);影响DDL 执行即崩溃属于严重稳定性问题。GROUP BY JSON 子对象子列崩溃PR #70374问题对 JSON 子对象子列JSON sub-object subcolumn执行 GROUP BY 时崩溃。关联与 JSON 子列路径解析相关参见 src/DataTypes/DataTypeJSON.cpp。WHERE 中使用 lambda 函数崩溃PR #70464问题WHERE条件中使用 lambda 函数时崩溃。建议升级前排查是否存在WHERE arrayExists(x - ..., arr)类查询。有状态窗口函数在未对齐内存上创建PR #70631问题在未对齐misaligned内存上创建有状态stateful窗口函数可能触发未定义行为或崩溃。影响依赖状态如runningAccumulate类的窗口函数。反序列化时Field析构崩溃PR #70820问题groupArraySorted聚合函数的GroupArraySortedData内部使用PODArray存储非 POD 元素但存在两处忘记调用析构函数、一处元素未初始化的问题反序列化异常时会在析构阶段对未初始化元素调用析构函数而崩溃。源码佐证实现在 src/AggregateFunctions/AggregateFunctionGroupArraySorted.cpp对于通用类型T Field使用VectorWithMemoryTrackingField其余类型使用PODArrayT, 32, AllocatorAllocator为MixedAlignedArenaAllocatoralignof(T), 4096并在serialize/deserialize中手动管理生命周期见 src/AggregateFunctions/AggregateFunctionGroupArraySorted.cpp。修复在反序列化异常时正确销毁已构造元素、避免对未初始化内存调用析构。场景典型触发路径为MergeTree合并MergeTask读取含groupArraySorted中间状态的数据 part因此常表现为后台合并线程崩溃。数据 part 析构函数 terminatePR #71364问题数据 part 析构函数中未捕获异常导致进程terminate。处理为 part 析构增加try/catch将析构期间的异常安全吞掉避免进程级终止。存储与对象存储类垂直合并对无行 part 预取PR #70452问题垂直合并vertical merge对没有行0 rows的 part 进行了不必要的预取prefetch。修复part 无行时跳过预取减少 I/O 与调度开销。Replicated 库 表函数建表失败PR #70511问题在Replicated数据库上执行CREATE ... AS table_function()且表函数源在从副本不可用时建表失败。修复从副本上对不可用表函数源的建表操作进行兼容处理。system.remote_data_paths 遍历 shadow 目录PR #70590问题遍历 shadow 目录时未忽略frozen_metadata.txt导致system.remote_data_paths输出异常。修复遍历时跳过该文件保证系统表输出正确。Array 类型默认表达式新增列崩溃PR #70695问题ALTER TABLE ... ADD COLUMN添加带非空默认表达式的Array类型列后SELECT 与合并操作出现罕见崩溃。修复正确处理默认表达式生成的空数组列。CHECK 查询在事务中未清理文件缓存PR #69256内容启用事务时CHECK TABLE查询未正确清理文件缓存filesystem cache。属于内部修复NOT FOR CHANGELOG。协议与格式类s3Cluster 结构参数传播丢失PR #69147问题s3Cluster表函数向副本发送查询时列的DEFAULT表达式可能丢失结构参数传播问题。影响依赖s3Cluster(...)的分布式 S3 查询若目标列有DEFAULT表达式升级前建议核对结果一致性。Protobuf 格式模式缓存 DROP 的 use-after-freePR #70358问题执行SYSTEM DROP FORMAT SCHEMA CACHE FOR Protobuf时存在 use-after-free 风险。修复正确同步清理 Protobuf 格式模式缓存。proto 模式推断无限递归PR #70697问题启用跳过不支持字段skip unsupported fields时推断 proto schema 可能出现无限递归。修复为推断过程增加终止条件。异步与后台任务类异步插入忽略输出PR #70530问题wait_for_async_insert1时异步插入未忽略所有输出关联 Issue #62644。修复启用等待时屏蔽插入路径的多余输出避免客户端收到无关内容。命名会话未关闭挂起PR #70998问题特定情况下命名会话named sessions未关闭并永久挂起。修复正确释放命名会话资源避免连接泄漏。StorageS3Queue 持久节点逻辑错误PR #70984问题StorageS3Queue抛出逻辑错误Cannot create a persistent node in /processed since it already exists。背景StorageS3Queue是对象存储队列引擎S3Queue通过 ZooKeeper/Keeper 跟踪已处理文件。注册实现见 src/Storages/ObjectStorageQueue/registerQueueStorage.cpp支持ordered持久节点跟踪lexicographic 顺序与unordered仅内存跟踪两种模式见 src/Storages/ObjectStorageQueue/registerQueueStorage.cpp。影响ordered模式下多消费者竞争创建/processed持久节点时的冲突。其他修复getSubcolumn 与 LowCardinalityPR #69831内容getSubcolumn对LowCardinality列通过重写useDefaultImplementationForLowCardinalityColumns返回true修复行为。影响涉及子列提取与低基数列组合的场景。内部修复与 CI 调整NOT FOR CHANGELOGPR #70329CI 为 backport PR 启用集成测试提升补丁回归覆盖。PR #70453修正03249_dynamic_alter_consistency测试顺序保证 Dynamic 类型 ALTER 一致性测试可靠。PR #70508移除 Keeper 中缓慢的poll()日志减少噪音。PR #70643当PR Check状态被设置时视为合法的 RunConfig 任务失败。PR #71174默认不再启用 GWP-ASan可能是默认配置调整避免默认开启带来的开销。版本升级建议与验证清单升级前检查JSON 子列特殊符号若表存在含特殊符号键名的 JSON 列先执行CHECK TABLE验证现有数据可读JOIN 复杂条件排查JOIN ON中嵌套NOT/IS NULL的查询升级后对比结果s3Cluster 与 DEFAULT 表达式核对分布式 S3 查询结果一致性物化视图 INTERSECT确认不存在CREATE MATERIALIZED VIEW ... INTERSECT的存量 DDL 依赖。升级后验证运行代表性聚合查询尤其涉及groupArraySorted的查询验证聚合中间状态读写正常运行SYSTEM DROP FORMAT SCHEMA CACHE FOR Protobuf验证不再崩溃观察system.remote_data_paths与对象存储 LIST/HEAD 请求量确认优化生效对启用ordered模式的 S3Queue 表执行消费测试验证/processed节点逻辑正常。相关资源变更日志原文docs/changelogs/v24.8.6.70-lts.mdgroupArraySorted聚合实现src/AggregateFunctions/AggregateFunctionGroupArraySorted.cppStorageS3Queue注册与参数文档src/Storages/ObjectStorageQueue/registerQueueStorage.cppplain_rewritable 磁盘实现src/Disks/DiskObjectStorage/MetadataStorages/PlainRewritable/版本变更目录总览docs/changelogs/ 目录下其余版本日志【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考