ClickHouse v25.10.5.40-stable 版本更新深度解读:关键修复、内存治理与刷新物化视图备份策略
2026/9/17 16:49:21 网站建设 项目流程

ClickHouse v25.10.5.40-stable 版本更新深度解读:关键修复、内存治理与刷新物化视图备份策略

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

v25.10.5.40-stable 是 ClickHouse 25.10 分支的一个稳定补丁版本,在 CHANGELOG 中收录了 4 项功能改进、27 项用户可见缺陷修复、1 项构建/测试改进以及 8 项内部修复(NOT FOR CHANGELOG / INSIGNIFICANT)。本文以该版本更新日志为主体,结合仓库源码逐条剖析核心变更的底层原理,帮助运维与开发人员理解本次升级解决的关键问题、评估升级影响,并掌握新增的备份配置项的用法。

版本概览:25.10 分支的第 5 个稳定补丁

根据更新日志头部的元信息,本版本基线为93e6f3ffcbd,对比基准是 v25.10.4.104-stable(5051266d584),即这是 25.10 系列中的第 5 个 stable 补丁版本。整个更新日志按四类组织,这也是 ClickHouse 发布流程的标准分类方式:

  • Improvement:行为改进或新功能,本版本共 4 项;
  • Bug Fix (user-visible misbehavior in an official stable release):官方稳定版中用户可见的缺陷修复,本版本共 27 项,是本次发布的主体;
  • Build/Testing/Packaging Improvement:构建、测试、打包相关的改进,共 1 项;
  • NOT FOR CHANGELOG / INSIGNIFICANT:不进入对外变更说明、或影响极小的内部修复,共 8 项。

所有条目均通过"Backported in ..."标记了回溯合入(backport)的追踪号,说明这些修复来自后续开发分支并已回归到 25.10 稳定线。

一、功能改进(Improvement)

1. 修复启用用户态页缓存(userspace page cache)时的虚假内存超限

Fixed spurious memory limit errors when userspace page cache is enabled. (PR #91361)

启用用户态页缓存后,内存统计口径容易把缓存页面计入查询内存,导致明明有充足内存却抛出MEMORY_LIMIT_EXCEEDED之类的虚假错误。该修复校正了内存限制计算与页缓存之间的统计关系,避免在缓存命中场景下误杀查询。对于在生产环境开启用户态页缓存、且频繁遇到偶发内存超限报错的集群,本次升级应能显著改善稳定性。

2. 新增backup_data_from_refreshable_materialized_view_targets备份设置

Introducedbackup_data_from_refreshable_materialized_view_targetsbackup setting to control whether to back up data of refreshable materialized views. Targets of RMVs with APPEND refresh strategy are always backed up. (PR #93658)

这是本版本最值得关注的新增功能:它控制了BACKUP命令是否备份"可刷新物化视图(Refreshable Materialized View,RMV)"的目标表数据。

从源码可以确认该配置的注册与默认值:

  • src/Backups/BackupSettings.h 中声明了字段bool backup_data_from_refreshable_materialized_view_targets = false;,即默认不备份RMV 目标表数据;
  • src/Backups/BackupSettings.cpp 通过M(Bool, backup_data_from_refreshable_materialized_view_targets)宏将其注册为可解析的备份设置项(因此可在BACKUP语句中作为SETTINGS传入)。

其判定逻辑位于 src/Backups/BackupEntriesCollector.cpp 的BackupEntriesCollector::shouldBackupTableData()中:

if (backup_settings.structure_only) return false; if (!backup_settings.backup_data_from_refreshable_materialized_view_targets && rmv_replace_target_ids.contains(StorageID{table_name.database, table_name.table})) { LOG_TRACE(log, "Skipping table data for {} (a target of a refreshable materialized view)", table_name.getFullName()); return false; } return true;

从源码结构可以推断其行为语义:

  • 当未开启该设置(默认)时,若某张表是 RMV 的替换目标(rmv_replace_target_ids命中),其数据将被跳过、不写入备份,仅备份结构;
  • 一个例外是:采用APPEND刷新策略的 RMV 目标表始终会被备份(无论该设置如何),因为 APPEND 策略下的目标表数据是增量累积的,无法仅凭结构重建;
  • 仅当structure_only打开时,所有表数据都会被跳过,优先级高于本设置。

实际使用方式(在BACKUP语句中显式开启):

BACKUP TABLE db.rmv_target TO Disk('backups', 'backup_rmv') SETTINGS backup_data_from_refreshable_materialized_view_targets = 1;

升级提示:该设置默认值为false,意味着升级到本版本后,默认的备份将不再包含 RMV 目标表的数据。如果你的备份策略依赖这些表的数据,需要在升级后显式开启此设置,或确认 RMV 采用 APPEND 策略。

3. 修复从表读取时部分场景不遵守内存限制

In some cases we've seen ClickHouse doesn't respect a memory limit when reading from a table. This behaviour is fixed. (PR #93715)

与第 1 项同为内存治理方向的修复。此前在某些读取路径下,查询内存追踪存在缺口,导致实际内存消耗突破配置的max_memory_usage。修复后读取表数据的路径会严格遵循内存限制,避免 OOM 与节点级连锁故障。

4. 检查请求(check request)字节大小计算的修正

Do proper byte size calculation of the check request with stats. (PR #93907)

修正了带统计信息的检查请求的字节大小计算,属于协议/度量层面的精度修复,避免因大小计算偏差导致的资源统计或限流异常。

二、缺陷修复(Bug Fix):27 项用户可见修复全解析

1. 列存储与稀疏列(Sparse Columns)相关修复

本版本围绕子列(subcolumn)与稀疏列修复了多项读取与反序列化缺陷,全部出自 Pavel Kruglov 之手,说明该模块在 25.10 版本处于活跃演进期:

  • 含点号的列名读取子列失败(PR #87205,对应 issue #81261、#82058、#88169):当列名本身包含.字符时,在某些情况下无法正确读取其子列,本次修复了列名解析与子列寻址的歧义;
  • 列别名中的动态子列解析(PR #92583,issue #91434):在 Analyzer 中,列别名里的动态子列此前会被包在getSubcolumn中,某些场景下完全无法解析,导致查询失败;
  • 反序列化时直接提取子列到稀疏列(PR #93512):修复了反序列化过程中向 Sparse 列直接写入子列数据时的错误;
  • 稀疏列场景下 TTL 更新失败(PR #93619,issue 报错Unexpected type of result TTL column):部分输入格式在向 Sparse 列直接反序列化并执行 TTL 更新时,会触发逻辑错误,本次修复了 TTL 列的类型处理。

这些修复共同指向一个主题:子列(如.*、JSON 动态子列)与稀疏列存储格式的组合路径在 25.10 中逐渐成熟,本次集中补齐了其中的边界缺陷

2. 聚合函数状态反序列化的安全加固

本版本针对groupConcat聚合状态反序列化做了两次加固,背景是恶意构造或损坏的聚合状态可能造成内存安全问题:

  • 越界偏移导致崩溃(PR #93028):反序列化畸形的groupConcat聚合状态时,偏移量越界会直接导致服务崩溃,本次修复为崩溃问题;
  • 整数溢出漏洞(PR #93426):groupConcat状态反序列化中的整数溢出可能引发内存安全问题,属于安全性修复,修复方式为对偏移量计算进行溢出保护与边界校验。

这两项修复提示:在从不可信来源加载聚合状态(如反序列化 MergeTree 数据、处理外部传入的 state)时,数据校验至关重要。同时本版本还对uniqTheta在并行聚合(max_threads > 1,默认开启)下使用 UInt8 聚合键时的准确性做了修复(PR #94095),保证并行路径与串行路径结果一致。

3. 关闭流程(Shutdown)相关的稳定性修复

本版本集中修复了多个导致关闭挂起或崩溃的问题,对滚动升级与日常维护意义重大:

  • 服务器干净关闭时因析构顺序错误崩溃(PR #90076,issue #82420):修复了 clean shutdown 过程中对象析构顺序不当导致的崩溃;
  • 后台调度池终止挂起(PR #93008):终止后台调度池(background schedule pool)时可能挂起,进而导致服务器关闭时 hang,本次修复该问题;
  • ZooKeeper 关闭时未完成 finalize(PR #93602):确保 ZooKeeper 在关闭时被正确 finalize,修复极少数情况下的关闭挂起;
  • SCOPE_EXIT与抛异常函数混用(PR #94100):socket.setBlocking(true)SCOPE_EXIT中抛异常导致服务异常。原因是SCOPE_EXIT创建作用域守卫对象并在其析构函数中执行代码,不能在会抛异常的函数中使用,应改用SCOPE_EXIT_SAFE。这是一条重要的工程实践:析构函数路径必须保证不抛出异常;
  • ZooKeeper 客户端连接时的隐蔽缺陷(PR #94320):修复了 ZooKeeper 客户端在连接过程中的一个隐蔽 bug,该 bug 会导致挂起(hung)与崩溃。

4. 解析器与函数引擎的崩溃修复

  • GenerateRandom 引擎非字面量参数崩溃(PR #88157):此前对非字面量参数会抛出LOGICAL_ERROR直接崩溃,本次改为返回带清晰消息的BAD_ARGUMENTS错误——这是从"内部错误"到"用户输入错误"的正确语义降级;
  • randomStringUTF8整数溢出崩溃(PR #90326):在超大长度参数下发生整数溢出导致崩溃。

关于后者,可以从 src/Functions/randomStringUTF8.cpp 看到修复后的防护逻辑:executeImpl在分配内存前会先遍历参数,统计总码点数并校验上限:

const size_t max_total_codepoints = 1ULL << 29; for (size_t row_num = 0; row_num < input_rows_count; ++row_num) { size_t codepoints = col_length.getUInt(row_num); if (codepoints > max_total_codepoints - total_codepoints) throw Exception(ErrorCodes::TOO_LARGE_STRING_SIZE, "Too large string size in function {}", getName()); total_codepoints += codepoints; }

即对"总码点数"(而非单行长度)做1ULL << 29的上限校验,累计超限即抛出TOO_LARGE_STRING_SIZE,从根源上避免后续total_codepoints * 4字节预留时的整数溢出。该函数只生成已分配(assigned)的 Unicode 平面码点(排除 4–13 平面),每个码点预期约 3.85 字节,因此按 4 倍预留不会造成明显浪费。

5. 查询正确性与 JOIN 修复

  • 标量相关子查询下未用列被错误移除(PR #93273):修复了存在标量相关子查询时子查询未用列的错误裁剪——此前若某列仅被相关子查询使用,可能被优化器移除,导致查询报NOT_FOUND_COLUMN_IN_BLOCK错误;
  • 嵌套 RIGHT JOIN 结果错误(PR #94339,issue #93891):开启enable_lazy_columns_replication时,嵌套 RIGHT JOIN 的复制列会错误地全部返回同一个值而非各自的值,本次修复保证列复制与 JOIN 语义正确。

6. 备份恢复与物化视图

  • ReplicatedMergeTree 恢复时去重竞争导致 LOGICAL_ERROR(PR #93612):恢复(restore)ReplicatedMergeTree 时存在去重竞争,可能触发LOGICAL_ERROR,本次修复;
  • 刷新物化视图内存泄漏(PR #94200):使用包含多个子查询的SELECT的刷新物化视图存在内存泄漏,本次修复;
  • 物化视图中表函数求值的数据竞争(PR #94171):修复了在物化视图中求值表函数时的数据竞争。

7. 权限与安全

  • merge表引擎绕过SHOW COLUMNS权限(PR #93695):此前用户可通过merge表引擎获取表列清单而无需SHOW COLUMNS权限,本次修复该权限绕过;
  • 忽略带 grant option 的数据库级全局授权不可能撤销(PR #94386):修复了对带GRANT OPTION的全局授权在数据库级别执行不可能撤销(revoke)时的处理逻辑。

8. 存储、缓存与 IO

  • 解压缓冲区大小校验(PR #93690):校验解压后缓冲区大小是否符合预期,防止解压路径上的异常数据造成越界或逻辑错误;
  • ReadWriteBufferFromHTTP未初始化值使用(PR #94058):修复 HTTP 读写缓冲区中使用未初始化值的问题(use-of-uninitialized-value);
  • DataPartStorageOnDiskBase::removesystem.parts的数据竞争(PR #94262,issue #49076):修复数据部分删除与system.parts系统表读取之间的数据竞争;
  • FilesystemCacheSizeLimit度量在 SLRU 策略下取值错误(PR #94363):当本地缓存策略配置为SLRU时,当前度量FilesystemCacheSizeLimit的数值不正确,本次修复。

9. 表函数与数据库引擎

  • PostgreSQL 数据库引擎空指针解引用(PR #94180,issue #92887):当查询不正确时,PostgreSQL数据库引擎可能发生空指针解引用(nullptr dereference),本次修复。

三、构建/测试/打包改进

本版本仅包含一项打包层面的改进:

  • 升级 c-ares 至 v1.34.6(PR #94129):c-ares 从 v1.34.5 升至 v1.34.6,以解决 c-ares 的CVE-2025-62408。更新日志特别注明该 CVE与 ClickHouse 无关("not relevant for ClickHouse"),属于防御性依赖升级,但依赖链的安全性因此得到改善。

四、内部修复(NOT FOR CHANGELOG / INSIGNIFICANT)

以下 8 项属于不进入对外变更说明或影响极小的内部修复,但仍有参考价值:

变更PR说明
修复 GCS 的 Bearer token 刷新#89183保证长生命周期备份/读取任务的令牌刷新正确
AggregateFunctionWindowFunnel更遵守内存限制#93035窗口漏斗聚合在内存限制下更受控
远端限流器休眠时间不再依赖本地 socket 超时,默认上限 20 秒#93410隔离限流等待与 socket 超时的耦合
JSON 列新增额外校验#93453加固 JSON 列的数据校验路径
消除test_projection_rebuild_uses_only_required_columns的偶发失败#93498测试稳定性改进
修复 Prometheus Remote Read 协议支持#93791保证 Prometheus 远程读协议的兼容性
修复异常消息#93915错误提示文案修正
修复merge表引擎相关权限问题#93695与上文权限修复同源

其中远端限流器(remote throttler)的改动值得注意:限流等待时长此前受本地 socket 超时影响,可能被意外拉长或缩短,现在独立计算并默认封顶 20 秒,这有助于分布式查询在限流场景下保持稳定的行为。

五、升级评估与落地建议

综合本次更新内容,v25.10.5.40-stable 的升级收益集中在以下四个方向:

  1. 内存治理:用户态页缓存虚假超限(#91361)、读表路径不遵守内存限制(#93715)、AggregateFunctionWindowFunnel内存限制(#93035)三项修复,显著降低内存误判与 OOM 风险;
  2. 关闭与高可用稳定性:析构顺序(#90076)、后台调度池挂起(#93008)、ZooKeeper finalize(#93602)、ZooKeeper 客户端连接(#94320)四项修复,让滚动升级和优雅停机更可靠;
  3. 数据安全加固groupConcat聚合状态反序列化的越界(#93028)与整数溢出(#93426)修复,建议关注任何从不可信来源加载聚合状态的场景;
  4. 备份行为变更:新增backup_data_from_refreshable_materialized_view_targets设置且默认关闭(见 src/Backups/BackupSettings.h),升级后 RMV 目标表数据默认不再进入备份,使用 RMV 且依赖数据备份的团队务必评估并显式开启。

此外,若你的查询大量使用子列(含.的列名、JSON 动态子列)、稀疏列存储或 TTL 更新,建议在升级后针对这些路径补充回归测试;若使用嵌套 RIGHT JOIN 且开启enable_lazy_columns_replication,也建议重点验证(#94339)。

完整的条目清单与追踪信息可在 v25.10.5.40-stable 更新日志 中查阅,各修复对应的底层实现可进一步参考 BackupEntriesCollector.cpp、BackupSettings.cpp 与 randomStringUTF8.cpp 等源码文件。

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

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

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

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

立即咨询