
ClickHouse v25.8.11.66-lts 版本变更深度解读备份恢复、对象存储与 Keeper 的 LTS 分支演进【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文围绕 ClickHouse v25.8.11.66-lts提交 fa393206741这一长期支持LTS版本的全部变更展开覆盖其 6 项功能改进Improvement与 19 项用户可见缺陷修复Bug Fix并结合当前仓库源码逐一剖析关键改动的落地位置包括备份专属 S3 客户端配置、Keeper 删除节点时的 ACL 校验、Azure 原生复制回退逻辑、reverseUTF8的四字节码点修复、countMatches的二次复杂度消除等。读完本文你可以掌握该 LTS 版本每个变更的技术含义、涉及的配置项与源码实现位置判断其对自身生产环境的升级价值。版本概览v25.8.11.66-lts 是 ClickHouse 25.8 LTS 分支上的一个点版本变更日志文件为 docs/changelogs/v25.8.11.66-lts.md。其相对基线版本为v25.8.10.7-lts提交 02ec3a1ea1e本版本fa393206741中所有条目均标注了 “Backported in #……”即这些改动先在主线master上以主 PR 合入再被回合backport到 25.8 LTS 分支——这是 LTS 分支保障稳定性与功能同步的典型机制。变更按类别组织Improvement6 条包括备份 S3 设置、Iceberg SELECT 性能跟踪、Azure SDK 升级、新增 Keeper ACL 校验配置、GLOBAL IN内存泄漏修复、keeper 安装包开机自启Bug Fix19 条涉及日期类型推断、url()表函数、CTE 插入、Variant 列、Azure 复制、session_timezone分区裁剪、URI 授权校验、DDL worker、LowCardinality 列、负载workload设置、对象存储关联子查询、system系统表访问、countMatches复杂度、备份恢复、PREWHERE 并发、Replicated 库恢复卡死、loop表函数鉴权、异步日志异常处理、reverseUTF8以及 SQL SECURITY DEFINER 视图授权NOT FOR CHANGELOG / INSIGNIFICANT4 条不影响用户行为的内部修复如 parquet 布尔解码、插入线程数、ColumnBLOB转换、merge 销毁时的 profiling 日志。下面按类别展开并对有源码可印证的关键条目给出实现细节。改进一备份使用专属的 S3 客户端设置Backported in #88492Use S3 storage client with backup-specific settings (for example, backup_slow_all_threads_after_retryable_s3_error) for server-side (native) copy to a backup destination. Make s3_slow_all_threads_after_retryable_error obsolete.PR #87660Julia Kartseva这条改动让服务端native复制数据到备份目的地时S3 客户端使用备份专属的设置例如backup_slow_all_threads_after_retryable_s3_error同时宣告旧的s3_slow_all_threads_after_retryable_error设置作废。在源码中可以清楚看到这个设置的消费路径。src/Backups/BackupIO_S3.cpp 中有两处关键代码备份磁盘客户端工厂约 L97–L114工厂从local_settings读取backup_restore_s3_retry_attempts、backup_restore_s3_retry_initial_backoff_ms、backup_restore_s3_retry_max_backoff_ms、backup_restore_s3_retry_jitter_factor构造RetryStrategy并读取backup_slow_all_threads_after_retryable_s3_error随后通过cloneWithConfigurationOverride(config)生成带备份专属配置的 S3 客户端克隆。也就是说备份任务不再复用普通查询路径的 S3 客户端配置而是拥有独立的“重试退避 慢线程”策略直接对象存储备份客户端约 L208–L228同样传入backup_slow_all_threads_after_retryable_s3_error并且针对备份场景做了专门调优——连接超时固定为 10 秒请求超时设为 1 小时client_configuration.requestTimeoutMs 60 * 60 * 1000注释明确写道 “Requests in backups can be extremely long”备份请求可能非常长。对使用者的影响做大规模备份时你可以通过backup_*前缀设置单独调节备份链路的 S3 重试与退避行为而不会波及常规 S3 读写旧设置s3_slow_all_threads_after_retryable_error已标记作废新部署配置中应改用备份专属设置。相关设置项声明在 src/Core/Settings.cpp 中。改进二Iceberg SELECT 增加性能跟踪信息Backported in #88537Add more information for performance tracking in Iceberg SELECTs.PR #87903Daniil Ivanik对查询 Iceberg 表Data Lake 集成时日志/系统表中会暴露更丰富的性能跟踪信息。这便于在SELECT走对象存储读取 Iceberg 元数据与数据文件时定位慢查询发生在哪个阶段。这是 Data Lake 可观测性的持续增强无需额外配置。改进三Azure SDK 升级修复 Content-Length 问题Backported in #88300Update azure sdk to include Content-Length fix that is seen with copy and create container functionalities.PR #88278Smita Kulkarni升级了 vendored 的 Azure SDK修复在 copy复制与 create container创建容器功能中出现的Content-Length头异常。该问题主要影响使用 Azure Blob Storage 作为对象存储后端、且需要跨容器复制对象或创建新容器的场景。改进四新增 Keeper 配置keeper_server.coordination_settings.check_node_acl_on_removeBackported in #88742Add configkeeper_server.coordination_settings.check_node_acl_on_remove. If enabled, before each delete of a node, ACLs of both the node itself and parent node will be verified. Otherwise, only the ACL of the parent node will be verified.PR #88513Antonio Andelic这是 ClickHouse Keeper内置协调服务兼容 ZooKeeper 协议新增的一个协调设置。默认行为是删除节点时只校验父节点的 ACL启用该设置后删除前会同时校验节点自身与其父节点的 ACL从而收紧权限模型防止“父节点可写、子节点独立设限”的语义被绕过。源码层面的实现非常清晰设置声明在 src/Coordination/CoordinationSettings.cppDECLARE(Bool, check_node_acl_on_remove, false, When trying to remove a node, check ACLs from both the node itself and the parent node. If disabled, default behaviour will be used where only ACL from the parent node is checked, 0)可以看到默认值为false且标记位为0非热加载修改后需要重启 Keeper 生效使用点在 src/Coordination/KeeperStorageImpl.cpp 的删除路径中if (check_acl !is_internal_gc_remove storage.keeper_context-getCoordinationSettings()[CoordinationSetting::check_node_acl_on_remove] !storage.checkACL(node-stats.acl_id, Coordination::ACL::Delete, session_id, /*committed*/ false)) return Coordination::Error::ZNOAUTH;即当外部要求做 ACL 校验、且该设置开启、且节点自身的acl_id没有 Delete 权限时返回ZNOAUTH拒绝删除。注意!is_internal_gc_remove这一条件——内部 GC 触发的清理不受此约束。配置方式该设置属于keeper_server.coordination_settings层级在keeper.xml或 ClickHouse 服务内嵌 Keeper 配置中按 coordination settings 的方式配置键名为check_node_acl_on_remove。适合对 ACL 语义要求严格的部署例如多团队共用一个 Keeper 集群并依赖节点级 ACL 隔离。改进五修复GLOBAL IN内存泄漏Backported in #88781Fixes memory leak due toGLOBAL IN关联 issue #88615PR #88617pranavmehta94修复了GLOBAL IN子句导致的内存泄漏。GLOBAL IN常用于将本地表与cluster()/分布式表连接时的子查询物化场景如果查询频繁使用GLOBAL IN泄漏会随查询次数累积这条修复对长期运行的 server 进程有直接内存收益。改进六clickhouse-keeper 安装包支持开机自启Backported in #88764Add a step to postinstall script forclickhouse-keeperwhich enables starting on boot.PR #88746YenchangChanclickhouse-keeper软件包的 postinstall 脚本新增一步检测 systemd 可用后自动systemctl enable clickhouse-keeper。对应源码为 packages/clickhouse-keeper.postinstallif [ -x /bin/systemctl ] [ -f /lib/systemd/system/clickhouse-keeper.service ] [ -d /run/systemd/system ]; then ... /bin/systemctl daemon-reload /bin/systemctl enable clickhouse-keeper fi脚本内还附有注释提示如果降级到 1.1.54336 之前的旧版本需手动执行systemctl disable clickhouse-keeper。配合 packages/clickhouse-keeper.service 与 packages/clickhouse-keeper.yaml现在通过 RPM/DEB 包安装独立 Keeper 节点即可默认随系统启动简化了协调服务的高可用部署。缺陷修复数据正确性与查询语义超出范围日期的 Date/DateTime 推断Backported in #88848Fix inferring Date/DateTime/DateTime64 on dates that are out of supported range.PR #86184Pavel Kruglov修复了对超出类型支持范围如 Date 的 1925–2105 之外的日期字面量/表达式进行类型推断时的错误行为。涉及依赖隐式类型推断的 INSERT/SELECT 场景升级后可避免误判或崩溃。url()表函数在并行副本下解析表结构失败Backported in #88594Fix resolving table schema withurl()table function whenparallel_replicas_for_cluster_functionssetting is set to 1.PR #87029Konstantin Bogdanov当parallel_replicas_for_cluster_functions1时url()表函数解析远端表 schema 的逻辑存在缺陷本修复保证该组合可用。使用url()拉取 TSV/CSV 远端数据并启用了集群函数并行副本的部署应升级。CTE INSERT SELECT 的未知表错误Backported in #88843Fix unknown table error in insert select query with CTEissue #85368PR #87789Guang Zhao修复了“CTEWITH 子句 INSERT SELECT”组合查询偶发的 unknown table 错误这是数据装载管道中常见的写法修复后此类 ETL 语句的可靠性提升。Variant 中不可 Nullable 类型的 map 子列Backported in #88509Fix reading null map subcolumn from Variants that cannot be inside Nullable.PR #87798Pavel KruglovVariant 类型的部分变体variant不允许嵌套 Nullable读取这类 Variant 列中的 map 子列 null 值此前存在问题本修复保证读取正确。session_timezone下的 datetime 分区/数据块裁剪错误Backported in #88436Fix for incorrect granules/partitions elimination for datetime-based keys, when usingsession_timezonesetting in queries.PR #87987Eduard Karacharov这是一个查询正确性级别的重要修复基于 datetime 主键/分区键的表在查询设置session_timezone后数据块granule与分区裁剪partitions elimination可能算错导致查询结果漏行或多算扫描。跨时区查询例如报表系统按会话时区切分的用户应重点升级该版本。LowCardinality 列is_shared标志传播错误导致 group by 结果错误Backported in #88284Fixed propagation ofis_sharedflag inColumnLowCardinality. It may lead to a wrong group-by result if a new value is inserted in a column after hash values are already pre-calculated and cached in theReverseIndex.PR #88213Nikita TaranovLowCardinality 列的is_shared标志传播不当当ReverseIndex中已缓存预计算哈希值之后又插入新值时可能导致 GROUP BY 结果错误。从源码结构看src/Columns/ColumnLowCardinality.h 中create()工厂方法显式接收is_shared参数create(column_unique, indexes, is_shared)本修复保证该标志在列拷贝/共享路径上被正确传递。使用 LowCardinality 做高基数去重/聚合的表建议升级。loop表函数 SELECT 访问校验缺陷Backported in #88890Fixes access validation on select forlooptable function.PR #88802pufit修复了loop表函数在 SELECT 上的授权access校验属于访问控制正确性修复。SQL SECURITY DEFINER 视图不再要求SET DEFINER权限Backported in #88976Do not check accessSET DEFINER current_user:definerwhen creating a view with SQL SECURITY DEFINER.PR #88968pufit创建带SQL SECURITY DEFINER的视图时此前会错误地要求创建者拥有SET DEFINER自身定义者的权限导致合法的视图创建被拒绝。本修复去除了该多余检查使 SQL SECURITY DEFINER 的授权语义符合预期。字符串函数reverseUTF8四字节码点修复Backported in #88940Fix bug in the functionreverseUTF8. In previous versions, it mistakenly reversed the bytes of UTF-8 code points of length 4.PR #88914Alexey Milovidov此前版本在处理 4 字节 UTF-8 码点如 emojiU10000 及以上时错误地翻转了单个码点内部的字节而不是把整个码点作为一个单元参与反转。当前仓库中的实现src/Functions/reverseUTF8.cpp展示了修复后的逻辑根据首字节判断码点长度1/2/3/4 字节多字节码点整体通过memcpy倒置位置if (data[j] 0xC0) char_len 1; else if (data[j] 0xE0) char_len 2; else if (data[j] 0xF0) char_len 3; else char_len 4; ... if (char_len 1) res_data[...] data[j]; else memcpy(res_data[offsets[i] prev_offset - j - char_len], data[j], char_len);此外源码注释L90–L95还说明了该函数被标记为非单射not injective残留多字节序列头会被当作单字节反转例如reverseUTF8(a\xC2)与reverseUTF8(\xC2a)结果相同若错误声明为单射optimize_injective_functions_in_group_by与optimize_injective_functions_inside_uniq优化就会按参数而非结果值分组返回错误的分组数。对存储 emoji/四字节字符并做reverseUTF8反转的查询升级该版本后结果才正确。countMatches的二次复杂度消除Backported in #88430Fix quadratic complexity in thecountMatchesfunction.issue #88400PR #88401Alexey MilovidovcountMatches及其变体countMatchesCaseInsensitive此前在特定输入上呈二次复杂度长文本 多匹配模式时会明显变慢甚至超时。当前实现src/Functions/countMatches.cpp为整个调用维护一个统一的CancellationBudget每次匹配推进时按实际推进的字符数budget.charge(...)记账既用于取消cancellation判断也保证了复杂度与输入规模线性相关。对日志全文检索、正则计数类工作负载是实打实的性能修复。缺陷修复对象存储与备份恢复Azure优先原生复制Unauthorized 时回退读写Backported in #88390In AzureBlobStorage, updated to try native copy first and go to read write on Unauthroized error (In AzureBlobStorage, if storage accounts are different for source destination we get Unauthorized error). And fix applying use_native_copy when endpoint is defined in configuration.PR #87826Smita KulkarniAzure Blob Storage 的复制策略改为先尝试原生复制native copy当源与目标存储账号不同导致Unauthorized错误时自动回退为“读出再写入”同时修复了配置中显式定义 endpoint 时use_native_copy未生效的问题。源码印证在 src/Disks/DiskObjectStorage/ObjectStorages/AzureBlobStorage/AzureBlobStorageCommon.cppgetRequestSettingsForBackup(...)依据 endpoint 配置回填settings-use_native_copy若调用方显式传入use_native_copyfalse则强制关闭L705–L706配置读取处L716从config_prefix .use_native_copy取值默认false。跨账号对象迁移、跨容器数据搬迁的 Azure 部署升级后行为更健壮。大集群备份恢复的 num_hosts 冲突修复Backported in #88649Big clusters with node numbers 10 have a high probability of failing the restore with error[941] ... RestoreCoordinationOnCluster The version of node /clickhouse/backups/restore-.../stage/num_hosts changed (attempt #9), will try again. Thenum_hostsnode is overwritten by many hosts at the same time. The fix makes the setting to control attempts dynamic.issue #87721PR #88484Mikhail f. Shiryaev节点数超过 10 的大集群执行备份恢复时多个 host 并发覆写协调服务中/clickhouse/backups/.../stage/num_hosts节点乐观锁版本号反复冲突恢复高概率失败。本修复将控制重试次数的设置改为动态设置让运维可在不重启的情况下调大重试次数以度过并发写窗口。节点规模较大且依赖 BACKUP/RESTORE 命令恢复协调服务元数据的集群升级时应知晓该动态设置的存在。对象存储上的关联子查询Backported in #88336Now correlated subqueries will work with object storages.PR #88290alesapin此前针对 S3/HDFS 等对象存储表的关联子查询correlated subquery无法工作本版本修复后可以直接对 object storage 上的表写关联子查询简化了去重/过滤类 SQL 写法。访问 Data Lake 系统表不再强制初始化Backported in #88356Avoid trying to initialize DataLake databases while accessingsystem.projections与system.data_skipping_indices.PR #88330Azat Khuzhin在查询system.projections、system.data_skipping_indices等系统表时不再尝试初始化 Data Lake 数据库Iceberg 等。此前如果 Data Lake 依赖不可用这些与本场景无关的系统表查询会被拖累甚至报错修复后系统表访问与 Data Lake 初始化解耦可用性提升。授权检查前的 URI 归一化Backported in #88420Applies URI normalization before evaluation for the grants check introduced by PR #84503.PR #88089pufit此前版本引入的“基于 URI 的 grants 校验”未做 URI 归一化等价写法大小写、路径形式差异可能导致授权判断不一致。本修复在授权求值前先归一化 URI属于访问控制一致性修复。PREWHERE 常量列并发突变导致的潜在崩溃Backported in #88716Fix potential crash caused by concurrent mutation of underlying const PREWHERE columns.PR #88605Azat KhuzhinPREWHERE 优化路径下常量列在并发查询间被同时突变mutation可能引发崩溃。这是一条稳定性修复对高并发点查负载典型如按主键过滤、PREWHERE 生效的场景降低了偶发 crash 风险。缺陷修复集群协调与可运维性DDL worker 清理过期副本Backported in #88656Now DDL worker cleanup outdated hosts from replicas set. It will reduce amount of stored metadata in ZooKeeper.PR #88154alesapinDDL worker 现在会从 replicas 集合中清理已下线的过期主机。随着集群节点更替ZooKeeper/Keeper 中积累的 DDL 元数据每个副本的进度节点会越来越少降低了协调服务的存储与遍历开销。长期运行、节点频繁扩缩的集群升级后可观察 Keeper 中 DDL 队列路径的体积变化。Replicated 库恢复后长时间卡死的修复Backported in #88906After recovering, a Replicated database replica might get stuck for a long time printing messages likeFailed to marked query-0004647339 as finished (finishedNo node, syncedNo node), its fixed.PR #88671Alexander TokmakovReplicated 数据库在故障恢复后可能长时间卡死持续打印Failed to marked query-... as finished (finishedNo node, syncedNo node)日志。本修复解决该卡死使REPLICATED数据库副本在协调服务恢复后能正常标记查询完成状态。使用 Replicated 数据库例如多副本间同步 DDL 的状态存储的用户应重点验证该场景。负载设置max_cpu_share可独立生效Backported in #88459Fixes a workload settingmax_cpu_share. Now it can be used withoutmax_cpusworkload setting being set.PR #88217Neeravworkload负载控制体系中的max_cpu_share设置此前必须搭配max_cpus才生效本版本修复后可单独使用。使用 workload 做租户级 CPU 配额的部署可以更精细地只约束 CPU 份额而不绑定核心数上限。异步日志异常捕获避免程序中止Backported in #88835Catch exceptions when async logging fails to prevent program aborts.PR #88814Raúl Marín异步日志async logging路径上的异常现在会被捕获而不是导致整个 server 进程 abort。日志后端磁盘满、句柄异常等故障时的进程健壮性提升。其他内部修复NOT FOR CHANGELOG / INSIGNIFICANT变更日志最后列出 4 条对用户行为无直接影响的内部修复一并完整保留如下Backported in #87948Fix bool decoding in parquet reader v3.PR #87442Michael Kolupaev——parquet 新版 reader 中布尔值解码修复Backported in #88451fix threads count for inserts.PR #88339Sema Checherinda——插入线程数计算修复Backported in #88581FixColumnBLOB should be converted to a regular column before usagefromCREATE AS SELECT.PR #88544Nikita Taranov——CREATE TABLE ... AS SELECT涉及 BLOB 列的转换修复Backported in #88961Add profiling and logging on merge destruction.PR #88672Yarik Briukhovetskyi——merge 销毁阶段增加 profiling 与日志便于后续排查合并相关问题。另有一条未填写描述的 backport 记录Backported in #88952PR #88828scanhex12在 changelog 中归入 “NO CL CATEGORY”此处如实保留记录而不作推测。升级与验证建议确认版本升级后在客户端执行SELECT version()或通过clickhouse-client --query SELECT version()核对是否为25.8.11.66版本字符串与提交 hashfa393206741可在发行说明中对齐。重点关注正确性修复如果你在生产中命中以下任一场景——跨时区查询 datetime 主键表session_timezone、LowCardinality 列高频插入后聚合、含 emoji 的reverseUTF8查询、大集群 RESTORE 恢复协调服务、Replicated 库故障恢复——升级该版本后应针对原问题查询做回归验证。Keeper ACL 收紧是显式开启的check_node_acl_on_remove默认false行为不变只有你主动在keeper_server.coordination_settings中启用删除节点的校验才会扩展到节点自身 ACL。备份链路设置切换新的备份专属 S3 设置如backup_slow_all_threads_after_retryable_s3_error生效后旧的s3_slow_all_threads_after_retryable_error视为作废相关运维文档与备份任务配置应同步更新。Azure 部署若你的备份/复制任务跨越不同 Azure 存储账号升级后原生复制失败会透明回退到读写方式通常无需改动配置即可恢复成功仍建议保留 copy 操作日志用于观察回退频率。本版本整体延续了 LTS 分支“把主线关键修复稳定回合”的节奏既有查询正确性与性能类修复分区裁剪、LowCardinality、countMatches、reverseUTF8也有备份恢复、对象存储、Keeper 权限与集群元数据治理等运维侧改进。对 25.8 LTS 用户而言这是一个值得纳入例行升级窗口的点版本各项改动均可在当前仓库源码路径中追溯验证。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考