近期 TiDB 8.5.8 上线,本次更新共带来 6 项改进提升与 75 项错误修复。
其中,TiCDC 作为本次版本更新的关键组件,含 5 项改进、32 项修复;与此同时,TiDB 在优化器选索引、内存与连接管理、安全防护等方向上的多项修复同样值得关注。
TiDB 8.5.8 Release Notes:https://pingkai.cn/docs/tidb/stable/release-8.5.8
TiCDC:37 项变更,一场针对稳定性的集中加固
作为 TiDB 增量数据同步工具,TiCDC 是本次更新的重点。在改进提升方面:
- 追赶更快:优化
Changefeed在忽略删除事件时的扫描性能,减少包含大量删除操作的工作负载在追赶历史数据期间不必要的DML解码。 - 同步更稳:引入自适应扫描窗口算法,提升 Event Service 在内存压力下的稳定性和吞吐量,减少 DDL 或同步点场景中的 Dispatcher 饥饿和重置事件。
- 校验更轻:优化 Kafka Sink 校验流程,避免在校验期间执行仅在启动阶段需要的操作,对已有
Topic也会检查Schema Registry等编码器依赖,仅在需要创建Topic时才校验replication-factor。 - 开销更省:启用
Claim-Check时,同一 Sink 中的所有Encoder共享一个ClaimCheck实例,显著减少外部存储客户端和连接的开销。 - 排障更易:简化并统一 Kafka Sink 错误处理,配置错误、
Admin API错误和Producer错误采用一致的分类和封装,重试判断和问题排查都更加容易。
在错误修复方面,32 项修复覆盖了故障切换、数据一致性、内存占用等多个维度:
- 故障切换更安全:修复 TiCDC Capture 丢失 etcd 会话后仍可能继续向下游写入的问题,降低故障切换期间出现重复写入或不安全下游写入的风险。
- 灾备场景更稳:修复 DR Auto-Sync 场景发生网络分区时,TiCDC 可能触发 TiKV panic 的问题,提升跨可用区故障及网络恢复场景下的稳定性。
- Redo 恢复更可控:修复多次执行 Redo Apply 时 TiCDC 可能发生 OOM 的问题。修复后,事件收集器可同时按照事件数量和总字节数分批处理,降低恢复任务带来的内存压力。
此外,还修复了 Kafka Controller 故障后上下游数据可能不一致、Checkpoint 推进后 Consumer 可能忽略乱序重放 DML 事件等问题。对于生产环境重度依赖 TiCDC 做数据同步的用户来说,这一轮的优化含金量十足。
TiKV:性能与一致性并进
- 修复仅启用后台任务资源管控时,TiKV 不必要地将事务调度器切换为优先级调度,导致写密集型工作负载出现 5%~10% 性能下降的问题。
- 修复对快速处理完成的 Raftstore 消息批次执行不必要慢日志格式化带来的额外 CPU 开销。
- 修复 Coprocessor 下推 LIKE 表达式在格式错误的 UTF-8 输入、BIT 值或特定排序规则下可能导致 panic 的问题。
- 修复外部 SST Ingest 与前台写入并发竞争时可能生成不一致 MVCC 状态的问题,以及 Ingest 期间写入延迟增加的问题。
- 此外还修复了
FIPS环境下构建失败、store-not-found错误导致 Raft 连接永久阻塞等问题。
查询链路:估算更准、执行更稳、索引更可靠
在查询的估算、执行与索引一致性三个环节,各有关键改进:
- 估算更准:优化包含虚拟列的复合索引的行数估算——当列统计信息不可用时,回退使用索引统计信息,帮助 TiDB 更准确地选择索引。对于依赖优化器选对执行计划的场景,这是一个直接的查询性能提升。
- SQL 执行更稳:修复复杂查询将
IN子查询作为嵌套NOT IN表达式操作数时,可能触发 TiDB panic 并终止用户会话的问题,降低特殊 SQL 影响会话可用性的风险。 - 索引一致性更可靠:修复执行
ALTER TABLE ... REORGANIZE PARTITION时,全局索引可能遗漏部分索引项,造成索引查询漏行,并可能允许写入重复索引值的问题。
连接与内存:减少资源泄漏
内存与连接管理是本次 TiDB 修复的重点方向之一:
- 修复预处理语句收到重复
COM_STMT_SEND_LONG_DATA请求且语句一直未执行或重置时,连接内存可能无限增长的问题;TiDB 现在使用会话级max_allowed_packet限制单条预处理语句可累积的参数数据大小,超限即返回数据包过大错误。 - 修复
UNCOMPRESS()处理特制压缩输入时可能消耗大量未跟踪内存并超出查询内存配额的问题。 - 修复
Join、UPDATE、DELETE语句为初始 Chunk 分配过多内存的问题,在高并发或处理宽行场景下尤为明显。 - 优化 OOM 诊断的代价:内存使用频繁超过告警阈值时,记录 OOM 诊断 Goroutine Profile 不再显著延长 Stop-the-World 暂停、增加查询延迟。
潜在安全隐患持续解决
- 修复 PD
/metric/query与/metric/query_range接口可能被用于发起 SSRF 攻击或泄露上游响应详细信息的问题。 - 修复无权限用户可通过
INFORMATION_SCHEMA.USER_ATTRIBUTES读取其他用户属性的问题。 - 修复 PD
GlobalConfiggRPC API 可能访问预期命名空间之外etcd Key、以及pd-forwarded-host可能建立任意出站 gRPC 连接的问题。 - TiCDC 还修复了
Sink URI校验失败时可能在 OpenAPI 错误信息和日志中泄露敏感Sink URI信息的问题。
恢复与导入更可靠
- BR 修复了时间点恢复(
PITR)日志恢复阶段未执行配置限速、AUTO_ID_CACHE=1的表恢复后首次INSERT出现重复键错误、停止日志备份任务后残留过期GC Safepoint等问题。 - TiDB Lightning 修复了
IMPORT INTO在临时冲突删除提交错误后仍可能报告成功但索引不一致、以及重复的字典编码 ParquetDECIMAL值可能被静默写入错误数据的问题。 - 修复在
tidb模式下使用 TiDB Lightning 导入数据时,TiKV 可能崩溃的问题,降低大批量数据导入过程中的异常中断风险。
其他值得关注的变更
- 修复对分区表添加索引时,重组过程进度可能倒退的问题。
- 修复
ADMIN ALTER DDL JOBS无法动态调整正在运行的事务模式回填任务线程数或批次大小的问题。 - 修复含
JSON_EXTRACT()的查询无法利用执行计划缓存的问题。 - 修复解析包含过深嵌套括号的
SQL语句或Hint时 TiDB 可能崩溃的问题。 - PD 还修复了资源组
RU Token分配不均、新 TiDB 实例加入时可能被分配到 0 RU 导致短暂延迟尖峰等问题。