
ClickHouse v24.9.3.128-stable 版本变更全解析认证过期、JSON 列修复与大量崩溃修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于 ClickHouse 官方变更日志 v24.9.3.128-stable对比基线为 v24.9.2.42-stable本版本提交9a816c73dd4基线提交de7c791a2ea完整梳理该 24.9 LTS 维护版本的全部变更一项破坏兼容性修复、一项新特性、三项改进、约四十项 Bug 修复以及构建、Docker 打包与 CI 相关的调整。读完后你将掌握该版本的升级风险点、每类修复对应的典型症状以及结合仓库源码验证关键修复clickhouse su支持UID:GID、DNS 解析频率调整、聚合状态反序列化崩溃等的方法。版本定位24.9 分支的 Backport 维护版v24.9.3.128-stable 是 24.9 分支上的一个回移植backport稳定版。变更日志中每条条目均以 “Backported in # ” 开头表示这些修复先在 master 分支完成、再回植到 24.9 分支。该版本共包含1 项向后不兼容变更Backward Incompatible Change1 项新特性New Feature3 项改进Improvement40 项用户可见的 Bug 修复Bug Fix1 项构建/测试/打包改进Build/Testing/Packaging Improvement1 条无变更日志条目的回植NO CL ENTRY14 条不影响用户的 CI/测试调整NOT FOR CHANGELOG / INSIGNIFICANT对线上 24.9 用户而言该版本的核心价值集中在JSON 列/子列的一系列崩溃与错误修复、认证过期新能力、clickhouse su可用数字 UID/GID、以及多个生产环境可能触发的 segfault 修复。向后不兼容变更JSON 子列特殊字符转义回植自 issue #71361PR #71182Pavel Kruglov修复 JSON 子列JSON subcolumns文件中因未转义的特殊字符可能导致的No such file or directory错误。这一条被归类为“向后不兼容”原因是修复方式改变了 JSON 子列在存储层shadow/物化文件落盘时特殊字符的转义规则。升级后新写入的 JSON 子列数据文件命名/路径与旧版本不同如果 JSON 子列名中带有特殊符号升级前后对同一子列文件的寻址行为会发生变化。升级 24.9.3 时建议关注含 JSON 列且子列名含特殊符号的表验证子列读写是否正常。新特性每种认证方式可独立设置过期时间回植自 issue #71318PR #70090Arthur Passos允许每一种认证方式authentication method拥有各自独立的过期时间expiration并把过期时间从用户实体user entity层面移除。在旧模型中password的过期时间挂在用户对象上对“同一用户多种认证方式并存”的场景表达能力不足。本版本将过期时间下沉到每种认证方式上例如一个用户同时配置password与ldap认证时可以分别控制各自的有效期。这一变更影响 访问控制实体 的序列化结构属于认证体系的功能性增强升级后旧的USER定义在读取时会被兼容迁移但新定义USER/ROLE时建议显式使用新的按认证方式指定过期时间的写法。三项改进Improvement1. 从 Keeper 同步 user_directories 时跳过校验回植自 issue #70681PR #70644Raúl Marín从 ClickHouse Keeper 同步user_directories时不再执行校验validation。该条目针对的是Replicated访问控制Replicated Access Control场景各副本间通过 Keeper 同步用户目录时全量校验会放大延迟与冲突风险。跳过同步阶段校验属于行为优化对应实现位于 ReplicatedAccessStorage 所在的访问控制模块。2.clickhouse su支持数字UID:GID回植自 issue #71668PR #71626Mikhail f. Shiryaev当用户/组以 ID 形式给出时clickhouse su会失败本补丁修复为同时接受UID:GID形式。这是面向 Docker 降权场景的实用修复。工具的实现位于 programs/su/su.cpp其设计动机在源码注释中写得很直白标准 Linuxsu会创建伪终端以避免输入劫持这与 Docker 自身的终端处理不兼容因此项目内置了一个只做两三个系统调用的轻量替代而非依赖 gosu、su-exec 等第三方工具。从源码看mainEntryClickHouseSU按:分隔参数得到 user 与 group 后调用setUserAndGroup后者用tryParse先尝试把参数解析为数字 UID/GID解析失败再走getpwnam_r/getgrnam_r按名字查库随后在真正setuid/setgid降权前先用initgroups重置补充组列表防止降权进程悄悄继承调用方通常是 root 的补充组。源码还处理了若干防御细节只对“确实解析为数字”的输入回退到getpwuid_r/getgrgid_r避免把拼写错误的组名静默解析成 0root 组非 root 调用方没有CAP_SETGID时跳过initgroups保证 Docker--user容器内“同身份 no-op”调用可用对 WASMEmscripten平台缺少initgroups的情况以ENOSYS失败关闭。用法为clickhouse su user:group ...user/group 可以是名字或数字 ID降权后execvp执行剩余参数。3.HostResolver在 history 周期内更新 3 次回植自 issue #71938PR #71863Sema ChecherindaHostResolver在一个history周期内更新 3 次。DNS 解析结果缓存位于 HostResolvePool。此前每个 history 周期只刷新一次若上游 DNS 记录在 TTL 边界附近漂移远端连接解析到的地址可能偏旧。改为周期内 3 次更新后解析结果对 DNS 变更的响应更及时对 S3、Remote、Kafka 等依赖域名解析的远端数据源场景有直接影响。Bug 修复用户可见以下 40 项修复均出自变更日志原文按主题分组以便定位自身系统受影响的模块。权限/用户工具与命名集合修复clickhouse su不接受 ID 形式的问题见上文改进第 2 条PR #71626。回植自 issue #71464PR #71308MikhailBurdukov命名集合named collections缺少转义unescaping处理未修复时clickhouse-server无法启动。JSON 列与 Dynamic/Variant 数据类型回植自 issue #70434PR #70172Pavel Kruglov修复 JSON 列中可能的崩溃。回植自 issue #70496PR #70374Pavel Kruglov修复按 JSON 子对象的子列subcolumn做 GROUP BY 时的崩溃。回植自 issue #70563PR #69831Miсhael Stetsyuk通过让useDefaultImplementationForLowCardinalityColumns返回true修复getSubcolumn在LowCardinality列上的行为。回植自 issue #70428PR #70328Pavel Kruglov修复 ALTER Dynamic 类型时减小max_types参数可能导致的服务器崩溃。回植自 issue #71353PR #71299Pavel Kruglov修复从 Dynamic 列反序列化 LowCardinality 字典时可能的Cannot read all data错误。回植自 issue #71749PR #71369Pavel Kruglov在 JSON 类型提示type hints中检查可疑与实验性类型。回植自 issue #71606PR #71388Pavel Kruglov修复 Variant 列引发的Invalid number of rows in Chunk错误。函数、优化器与查询执行回植自 issue #70936PR #68049Vladimir Cherkasov关闭 issue #67915修复 JOIN ON 子句中IS NULL检查位于其他函数如NOT之下时的错误优化该优化会导致错误查询结果——此类静默错误是本次版本中值得优先升级的理由之一。回植自 issue #70871PR #70103Amos Bird修复 issue #70022求值tuple函数时不再在不同命名元组named tuples之间复用列。回植自 issue #70309PR #70207Raúl Marín修复arrayMin/arrayMax的多个问题。回植自 issue #70558PR #70464Raúl Marín修复 WHERE 中使用 lambda 函数时的崩溃。回植自 issue #71823PR #71432Raúl Marín修复optimize_rewrite_array_exists_to_has优化引发的崩溃。回植自 issue #71519PR #71476Nikolai Kochetov修复旧分析器old analyzer在arrayJoin可能出现在 WHERE 条件时报Argument for function must be constant的回归#65414 引入。回植自 issue #71553PR #71494Raúl Marín防止旧分析器下 0 列 SortCursor 崩溃。回植自 issue #71568PR #71541Raúl Marín避免在约束constraint中使用 UDF 时崩溃。回植自 issue #71728PR #71580Pablo MarcosbitShift系列函数在越界时返回 0 或默认字符而不是抛错。回植自 issue #71739PR #71695Eduard KaracharovNOT IN 算子下不再对分区列谓词中的常量集合做变换。回植自 issue #71878PR #71679Amos Bird修复 issue #71647修复空元组empty tuple上执行 ALTER 时的 LOGICAL_ERROR。回植自 issue #70653PR #70631Raúl Marín修复在未对齐内存上创建有状态窗口函数的问题。回植自 issue #70996PR #70979Alexey Milovidov关闭 issue #70973修复两级哈希表two-level hash table中负零negative zeros导致的逻辑错误。回植自 issue #70373PR #70338Raúl Marín修复误用WITH FILL时的崩溃。回植自 issue #71668 相关之外回植自 issue #72004PR #71949Nikolay Degterinsky关闭 issue #71864修复 clickhouse-client 语法高亮中的崩溃。回植自 issue #70897PR #70833Raúl Marín默认关闭enable_named_columns_in_function_tuple设置作为配套的风险收敛措施。存储引擎、Merge/Mutation 与聚合状态回植自 issue #70625PR #70264Konstantin Bogdanov修复创建含两个 SELECT 且带INTERSECT的物化视图如CREATE MATERIALIZED VIEW v0 AS (SELECT 1) INTERSECT (SELECT 1);时服务器 segfault。回植自 issue #70759PR #70695Anton Popov修复新增带非空默认表达式的Array类型列后SELECT 与 merge 中的罕见崩溃。回植自 issue #70484PR #70452Antonio Andelicpart 无行时垂直 merge 不再预取prefetch该 part。回植自 issue #70690PR #70358Azat Khuzhin修复SYSTEM DROP FORMAT SCHEMA CACHE FOR Protobuf中可能的 use-after-free。回植自 issue #71120PR #70820Michael KolupaevGroupArraySortedData使用存放非 POD 元素的 PODArray 时手动管理构造/析构但有两处忘记调用析构、一处异常路径下元素未初始化最终析构函数作用到未初始化元素上导致 SIGSEGV。变更日志中附有完整崩溃现场发生在MergeTreeReaderCompact读取、MergeTask::execute合并流程中GroupArraySortedData的 destroy 调用Field::~Field()时对地址0x8f段错误。对应实现可参见 AggregateFunctionGroupArraySorted。回植自 issue #71377PR #71364alesapin为数据 part 析构函数增加 try/catch避免异常逃逸导致 terminate。回植自 issue #71155PR #71089Shichao Jin修复投影projection轻量删除的 rebuild 选项未考虑_row_exists列的缺陷。回植自 issue #71062PR #70590Aleksei Filatov遍历system.remote_data_paths的 shadow 目录时忽略frozen_metadata.txt。插入路径与异步插入async insert回植自 issue #70577PR #70530Konstantin Bogdanov关闭 issue #62644wait_for_async_insert1时忽略异步插入的全部输出。该设置的处理位于 TCPHandler 等原生协议处理路径。回植自 issue #71329PR #71312Anton Popov修复通过原生协议native protocol进行空块empty block异步插入的问题。回植自 issue #70347PR #70310Antonio Andelic启动脚本startup scripts不再修改全局设置——此前在启动脚本里改设置会改变全局设置本修复收紧了作用域。外部引擎与分布式/集群回植自 issue #70441PR #69584Pavel Kruglov修复向 PostgreSQL 引擎的FixedString列插入时的段错误。回植自 issue #70922PR #70511Kseniia Sumarokova修复在Replicated数据库中使用CREATE ... AS table_function()且次要副本上表函数源不可用时的建表问题。回植自 issue #71212PR #70984Kseniia Sumarokova修复StorageS3Queue逻辑错误Cannot create a persistent node in /processed since it already exists。回植自 issue #70496 之外回植自 issue #70764PR #70697Raúl Marín修复启用 skip unsupported fields 时推断 proto schema 的无限递归。回植自 issue #71249PR #70998Márcio Martins修复某些场景下有命名会话named sessions无法关闭、永久挂起的问题。回植自 issue #71449PR #71384Alexandre Snarskii修复 issue #71051在非 Linux 系统上也启动内存工作线程memory worker thread。其他回植自 issue #70996 之外回植自 issue #71353 已计入上文 JSON/Dynamic 分组此处补充回植自 issue #71464 已计入权限分组。构建、测试与打包改进回植自 issue #71691PR #71573Mikhail f. Shiryaev改进clickhouse-server的 Dockerfile.ubuntu弃用CLICKHOUSE_UID/CLICKHOUSE_GID环境变量移除CLICKHOUSE_DOCKER_RESTART_ON_EXIT的处理以满足合规要求统一clickhouse/clickhouse-server/clickhouse-keeper的启动方式避免一处直接执行、另一处走/usr/bin/clickhouse*的不一致。对 Docker 部署用户的影响旧镜像中依赖CLICKHOUSE_UID/CLICKHOUSE_GID配置降权的做法已弃用应改用容器运行时自身的用户机制或结合上文clickhouse su的UID:GID支持。CI 与测试调整对用户透明变更日志末尾的 NOT FOR CHANGELOG 分组包含 14 条不面向用户的回植集中在 CI 与测试稳定性例如从发布分支移除 await 特性PR #70294、为 backport PR 启用集成测试PR #70329、keeper 移除慢速 poll 日志PR #70508、修复 24.9 设置兼容性database_replicated_allow_explicit_uuidPR #70565、删除坏测试test_system_replicated_fetchesPR #71071、修复孤儿 backport 分支的 fake-master 事件问题PR #71782、将 docker-library 官方镜像的Dockerfile.ubuntu修改回植到各分支PR #71825等。这些条目反映 24.9 分支在维护期仍在持续加固发布流水线。升级建议优先升级场景使用 JSON 列/JSON 子列尤其子列名含特殊符号、按子列 GROUP BY、使用 Dynamic/Variant 列、使用arrayJoinWHERE、使用 S3Queue 存储、或遇到聚合 state 反序列化崩溃groupArraySorted类的生产集群以及依赖 JOIN ONIS NULL优化正确性的查询管道issue #67915 的错误结果修复。验证手段升级前可对 JSON 子列建小样本表回归读写与 GROUP BY用system.errors/system.part_log关注 merge 阶段段错误是否消失Docker 部署用户确认不再依赖已弃用的CLICKHOUSE_UID/CLICKHOUSE_GID变量。行为变化清单enable_named_columns_in_function_tuple默认值改为关闭bitShift越界从报错改为返回默认值启动脚本设置修改不再影响全局设置wait_for_async_insert1下异步插入输出被忽略。以上均可能影响依赖旧行为的脚本与告警。关键源码索引认证实体序列化见 src/Access/IAccessEntity.h 与 AccessEntityIOsu工具见 programs/su/su.cppDNS 解析池见 src/IO/HostResolvePool.h聚合状态见 src/AggregateFunctions/AggregateFunctionGroupArraySorted.cppDocker 镜像见 docker/server/Dockerfile.ubuntu。参考变更日志原文docs/changelogs/archive/v24.9.3.128-stable.md24.9 分支其他版本日志位于 docs/changelogs/archive可用于对比 v24.9.2.42-stable 与本版本之间的差异。本文所有条目描述均出自上述变更日志标注 PR/issue 编号如 PR #71182、issue #71361与变更日志原文一致未附外部链接。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考