ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ClickHouse v26.3.3.20-lts 缺陷修复详解:异步插入计数、备份路径安全与 12 项稳定性补丁

ClickHouse v26.3.3.20-lts 缺陷修复详解:异步插入计数、备份路径安全与 12 项稳定性补丁 ClickHouse v26.3.3.20-lts 缺陷修复详解异步插入计数、备份路径安全与 12 项稳定性补丁【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse导读本文基于当前仓库 docs/changelogs/v26.3.3.20-lts.md 展开逐条解析 ClickHouse v26.3.3.20-ltscommit 5342e88d453相对 v26.3.2.3-ltscommit a1a0cf365ce的 20 项变更。本版本属于 LTS 分支的缺陷修复Bug Fix迭代重点覆盖异步插入async insert统计口径、备份恢复RESTORE路径校验安全加固、session_timezone解析一致性、以及字典卸载与文本检索索引等多处崩溃场景。读完本文你将掌握每个修复的触发场景、修复思路、可复现的 SQL 形态以及对应源码位置便于自行验证与回归测试。一、版本概览与定位v26.3.3.20-lts 是一个典型的LTS 分支缺陷修复版本不引入新功能专注于修复官方稳定版中用户可见的错误行为user-visible misbehavior。变更清单可归为三类变更分类数量说明Bug Fix14官方稳定版中用户可见的错误行为修复NO CL CATEGORY1未归类缺少 changelog 分类标签的修复NOT FOR CHANGELOG / INSIGNIFICANT5内部修复或非显著变更不面向用户公告从修复分布看本版本的高频主题集中在三块异步插入async insert链路计数、时区解析、结果行数、备份/恢复Backup/RESTORE路径安全、以及服务器运行期崩溃字典卸载、ULID 解析、文本检索索引等。二、异步插入Async Insert链路的三项修复异步插入是 ClickHouse 为高吞吐小批量写入设计的机制客户端以async_insert1提交写入服务端先将数据缓冲再合并为较大批次落盘。本版本针对该链路修复了三处一致性问题。2.1 修复 query_log 与客户端输出中的零统计变更修复异步插入在query_log与客户端输出中上报written_rows、read_rows、result_rows全为 0 的问题PR #99879。影响面所有使用async_insert1的写入用户。此前查询日志中的行数统计失真会干扰基于query_log的监控、审计与计费统计。源码印证异步插入的启用与回退逻辑集中在 src/Interpreters/executeQuery.cpp 的executeQuery路径中涉及async_insert、wait_for_async_insert、wait_for_async_insert_timeout三个设置的读取以及数据量过大时同步执行的降级判断LOG_DEBUG(logger, Setting async_insert1, but INSERT query will be executed synchronously...)。本次修复正是补全该链路上行数统计的传递。2.2 修复 HTTP 与 TCP 异步插入忽略 session_timezone变更修复session_timezone在异步插入TCP 协议以及所有 HTTP 协议插入场景中被忽略、导致DateTime值解析错误的问题PR #100647。影响面依赖session_timezone会话设置解析字符串时间戳的用户。此前同一 SQL 在同步 TCP 插入与异步/HTTP 插入下可能得到不同的时间存储值属于典型的一致性问题。修复思路确保解析DateTime时统一携带会话时区上下文而非退化为默认时区。2.3 修复结果行数重复计数变更修复结果行数result rows被重复计算的问题PR #101226与 2.1 同属统计口径修复均由异步插入路径的计数逻辑引起。三、备份恢复RESTORE路径校验安全加固变更在恢复过程中校验备份元数据中的文件条目路径拒绝路径穿越path traversal、绝对路径与空名称PR #100483。风险场景备份文件可能被篡改或损坏corrupted/tampered backup。若元数据中的文件路径未经校验直接用于写盘恶意或损坏的备份可在恢复时把文件写到预期目录之外构成写任意路径的漏洞。该问题由 Pablo Marcos 报告并修复。源码印证校验函数validateFileNameFromBackup实现在 src/Backups/BackupImpl.cpp校验规则完整覆盖文档所述三类攻击面绝对路径/根路径path.is_absolute() || path.has_root_name() || path.has_root_directory()任一成立即抛INSECURE_PATH路径穿越经path.lexically_normal()归一化后若首段为..即解析后逃出备份根目录则拒绝空名称/退化路径归一化后为空或.时抛BACKUP_DAMAGED附加校验要求路径本身已是归一化形式normalized.string() file_name避免a//b这类非归一化写法绕过前缀裁剪逻辑。该校验分别应用于备份条目主文件info.file_name与数据文件info.data_file_name覆盖了 src/Backups/BackupImpl.cpp 与 src/Backups/BackupImpl.cpp 两处入口。四、服务器运行期崩溃与逻辑错误修复4.1 字典加载与服务器关闭的并发竞态变更修复关闭服务器时加载字典触发的空指针解引用segfault。根因是字典线程并发调用Context::getUserDefinedSQLObjectsStorage解引用user_defined_sql_objects_storage而主线程的Context::shutdown会将该字段置空PR #100839。修复思路在Context::shutdown之前先禁用字典加载器的后续更新、终止正在运行的字典查询并 join 字典加载线程——即与普通查询的关闭流程对齐保证共享上下文在卸载前不再被并发访问。4.2 ULIDStringToDateTime 对非 ASCII 输入的缓冲区溢出变更修复ULIDStringToDateTime在输入包含非 ASCII 字节时的缓冲区溢出PR #100843。源码印证该函数位于 src/Functions/ULIDStringToDateTime.cpp接受String或FixedString(26)输入并返回毫秒精度的DateTime64(3)。其解码函数decode现在先在 src/Functions/ULIDStringToDateTime.cpp 中对 26 字节逐一校验校验所有字节均为 ASCII 后再调用ulid_decode因为ulid_decode以字符值作为数组下标——带符号 char 值 ≥ 128 会产生负下标导致越界读取。任何非 ASCII 字符data[i] 128都会抛出BAD_ARGUMENTS例如SELECT ULIDStringToDateTime(01GNB2S2FGN2P93QPXDNB4EN2R); -- 正常解析 -- 非法字符输入将得到Cannot parse ULID: non-ASCII character at position N该函数自 v23.3 引入IntroducedIn {23, 3}建议升级后对包含脏数据、编码混用的 ULID 列做回归验证。4.3 文本检索索引与元组子查询 IN 的崩溃变更修复使用文本检索索引text search index时IN子句包含元组子查询导致的崩溃例如WHERE (id, str) IN (SELECT (id, str) FROM ...)以及子查询列数与左侧元组不匹配的场景PR #100959。影响面对带全文/文本索引的表执行复合键IN (SELECT ...)查询的用户。4.4 has() PREWHERE/WHERE 与 LowCardinality 元组键崩溃变更修复has()函数配合 PREWHERE/WHERE、作用于包含 LowCardinality 元素的元组键时导致的服务器崩溃PR #100760。4.5 intDiv / intDivOrZero 与 Nullable 元组数组异常变更修复intDiv/intDivOrZero作用于可空元组数组时的异常文档给出复现形态SELECT intDiv([divide((1, 2), ... AND NULL)], 2)PR #100895建议在升级后用含NULL的嵌套元组数组数据对该类函数做回归测试。4.6 缓存盘Having zero bytes逻辑错误变更修复缓存相关逻辑错误Having zero bytes, ...。根因是远端对象在list与read之间被覆盖导致读取到过期对象元数据PR #101219典型发生于共享存储 本地缓存盘场景。另有一项同主题修复PR #101230随本版本合入。五、聚合与优化器相关的兼容性修复5.1 sumCountOrDefault 旧序列化状态读取失败变更修复sumCountOrDefault聚合函数在含一个及以上Nullable参数时因Nullable(Tuple)类型的引入而无法读取旧版本序列化状态的问题PR #101021关闭 issue #100882。影响面升级前写入的、使用sumCountOrDefault的物化视图或AggregatingMergeTree分区数据。不修复会出现跨版本状态反序列化失败。源码印证该函数注册于 src/AggregateFunctions/registerAggregateFunctions.cpp实现位于 src/AggregateFunctions/AggregateFunctionSumCount.cpp。升级 LTS 后建议对存量聚合状态做一次读取冒烟测试。5.2 StorageAlias 引擎参数求值时机变更StorageAlias的引擎参数在保存表定义前先求值使currentDatabase()这类表达式在写入数据库前被解析为字面量PR #100902。此前若在非默认库中重建依赖该别名表的对象可能得到错误解析结果。5.3 optimizeLazyMaterialization 与投影 PREWHERE 异常变更修复optimizeLazyMaterialization在使用含 PREWHERE 的投影projection且带ORDER BY ... LIMIT时抛异常的问题PR #101115属于查询优化器在投影 惰性物化组合路径下的边界修复。六、NO CL CATEGORY 与内部修复6.1 NO CL CATEGORYPR #101241Anton Popov一项未附 changelog 分类标签的修复随本版本合入。6.2 NOT FOR CHANGELOG / INSIGNIFICANT内部修复该分类用于不面向用户公告、但对系统健壮性有实际意义的内部变更变更内容说明PR #99741修复缓存盘cache disk启动逻辑此前启动时跳过了访问检查access check存在权限语义偏差PR #100064修复 issue #99996内部行为修正PR #100522removeObjectsIfExist由顺序删除改为批量删除涉及对象存储清理路径的 I/O 优化PR #100907配置重载后正确重新计算位置locations修复热更新配置后缓存位置未同步的问题PR #101226修复结果行数重复计数与 2.3 同一修复此分类下重复列出七、升级与验证建议统计口径回归异步插入用户应检查query_log中written_rows/read_rows/result_rows是否恢复正常可通过system.query_log对比同步与异步插入的统计差异。备份安全建议在升级后执行一次包含相对路径、嵌套目录的BACKUP/RESTORE往返测试确认 src/Backups/BackupImpl.cpp 中的路径校验不影响正常备份同时可利用validateFileNameFromBackup的报错信息INSECURE_PATH/BACKUP_DAMAGED识别异常备份。时区一致性设置session_timezone后分别通过 HTTP 与 TCP、同步与异步方式插入同一DateTime字符串比对存储结果是否一致。崩溃类回归覆盖has() LowCardinality 元组键 PREWHERE、文本检索索引 元组子查询IN、ULIDStringToDateTime非 ASCII 输入、intDiv Nullable 元组数组四类场景确认不再抛异常或崩溃。聚合状态兼容对存量sumCountOrDefault(Nullable)状态执行读取验证确认新版本可正常反序列化旧状态。结语v26.3.3.20-lts 虽是一个纯修复版本但其价值集中在三类高风险面上异步插入的统计与时区一致性、RESTORE 的路径安全边界以及多个并发/越界崩溃点。对生产环境而言上述第 3.2备份路径校验与 4.2ULID 溢出两项具备安全属性建议优先评估升级统计口径类修复则适合作为监控告警基线校正的依据。所有修复均可对照本文给出的源码路径在 docs/changelogs/v26.3.3.20-lts.md 的原始条目中找到对应 PR 号进行二次核验。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表