TiDB 8.5.4 Release Notes
发版日期:2025 年 11 月 27 日
TiDB 版本:8.5.4
新功能
支持表级别数据打散功能(实验特性)#63260 @bufferflies
PD 会自动调度数据,将整个集群的数据尽可能均匀地分布到所有 TiKV 节点上。然而,这种自动调度是基于集群全局的。在某些场景下,尽管整个集群的数据分布是均衡的,但某张表在各个 TiKV 节点上的数据分布仍然可能不均匀。
从 v8.5.4 开始,你可以通过
SHOW TABLE DISTRIBUTION语句查看某张表在集群中所有 TiKV 节点上的数据分布情况。如果存在数据分布不均衡,可以通过DISTRIBUTE TABLE语句对该表进行数据打散(实验特性),以提升负载均衡性。表级数据打散功能属于一次性执行任务,并设有超时时间限制。如果到达超时时间后,打散任务还未完成,则会自动退出。
更多信息,请参考用户文档。
支持内嵌于 DDL 的 Analyze 特性 #57948 @terry1purcell @AilinKid
该特性适用于以下两类 DDL:
- 新建索引的 DDL:
ADD INDEX - 重组已有索引的 DDL:
MODIFY COLUMN和CHANGE COLUMN
开启该特性后,TiDB 会在新索引对用户可见前自动执行一次 Analyze(统计信息收集)。这样可以避免在新建或重组索引后,由于统计信息暂不可用而导致优化器估算不准确,从而引起执行计划变更的问题。
更多信息,请参考用户文档。
- 新建索引的 DDL:
支持对分区表的非唯一列创建全局索引 #58650 @Defined2014 @mjonss
从 v8.3.0 开始,TiDB 支持用户在分区表的唯一列上创建全局索引以提高查询性能,但不支持在非唯一列上创建全局索引。从 v8.5.4 起,TiDB 取消了这一限制,允许用户在分区表的非唯一列上创建全局索引,提升了全局索引的易用性。
更多信息,请参考用户文档。
TiFlash 支持优雅关闭 (graceful shutdown) #10266 @gengliqi
在关闭 TiFlash 服务器时,TiFlash 允许当前正在执行的 MPP 任务在指定的等待期内继续运行,但不再接收新的 MPP 任务请求。该等待期默认为 600 秒,可通过
flash.graceful_wait_shutdown_timeout配置项进行调整。- 如果所有正在运行的 MPP 任务都在该等待期到达前完成,TiFlash 将立即关闭。
- 如果到达该等待期后仍有 MPP 任务未完成,TiFlash 会强制关闭。
更多信息,请参考用户文档。
引入 TiCDC 新架构,显著提升性能、可扩展性和稳定性 #442 @CharlesCheung96
新架构在完全兼容 TiCDC 老架构的配置项、使用方式和 API 的基础上,对 TiCDC 核心组件与数据处理流程进行了重构与优化。
启用新架构后,TiCDC 的同步能力可实现接近线性的扩展,并能以更低的资源成本完成百万级表的同步任务。在高写入负载、频繁 DDL 操作以及集群扩缩容的场景下,Changefeed 的延迟更低且更加稳定。需要注意的是,该新架构目前存在一些使用限制。
如需启用新架构,可将 TiCDC 配置项
newarch设置为true。更多信息,请参考用户文档。
兼容性变更
系统变量
系统变量
tidb_mpp_store_fail_ttl默认值从60s修改为0s,意味着 TiDB 不再需要额外等待即可向新启动的 TiFlash 节点发送查询请求,无需再通过延迟来避免查询失败 #61826 @gengliqi系统变量
tidb_replica_read从 v8.5.4 开始仅对只读 SQL 语句生效,以提高数据读取的安全性并减少与其他功能的重叠 #62856 @you06新增以下系统变量:
tidb_opt_enable_no_decorrelate_in_select:控制是否对SELECT列表中的子查询进行解关联操作,默认值为OFF#51116 @terry1purcelltidb_opt_enable_semi_join_rewrite:控制是否改写EXISTS子查询,默认值为OFF#44850 @terry1purcelltidb_stats_update_during_ddl:控制是否开启内嵌于 DDL 的 Analyze 特性,默认值为OFF#57948 @terry1purcell @AilinKid
配置参数
废弃以下 TiKV 配置项,并由新的
gc.auto-compaction配置项替代,用于控制自动 compaction 行为 #18727 @v01dstar- 废弃配置项:
region-compact-check-interval、region-compact-check-step、region-compact-min-tombstones、region-compact-tombstones-percent、region-compact-min-redundant-rows和region-compact-redundant-rows-percent。 - 新增配置项:
gc.auto-compaction.check-interval、gc.auto-compaction.tombstone-num-threshold、gc.auto-compaction.tombstone-percent-threshold、gc.auto-compaction.redundant-rows-threshold、gc.auto-compaction.redundant-rows-percent-threshold和gc.auto-compaction.bottommost-level-force。
- 废弃配置项:
新增 TiFlash 配置项
flash.graceful_wait_shutdown_timeout,用于控制在关闭 TiFlash 服务器时的最长等待时间,默认值为600秒。在此期间,TiFlash 允许尚未完成的 MPP 任务继续执行,但不再接收新的 MPP 任务。如果所有正在运行的 MPP 任务都在此超时时间之前完成,TiFlash 将立即关闭;否则将在等待时间结束后强制关闭。 #10266 @gengliqi
MySQL 兼容性
从 v8.5.4 开始,当写入 DECIMAL 类型的数据时,TiDB 的行为和 MySQL 保持一致:如果小数位数超过字段定义的小数位数,无论超出多少,TiDB 都会自动截断多余的位数并成功插入。在之前的 TiDB 版本中,如果写入的 DECIMAL 类型数据的小数位数超过 72 位,写入会失败并报错。更多信息,请参考使用 JDBC 连接到 TiDB。
改进提升
TiDB
- 支持由
IN子查询而来的 Semi Join 使用semi_join_rewrite的 Hint #58829 @qw4990 - 优化系统变量
tidb_opt_ordering_index_selectivity_ratio生效时的估算策略 #62817 @terry1purcell - 调整优化器的选择逻辑,使新创建的索引在某些情况下更容易被选中 #57948 @terry1purcell
- 优化 NDV (number of distinct values) 较小的列的查询估算逻辑 #61792 @terry1purcell
- 优化 Index Join 查询中包含
LIMIT OFFSET时的估算策略 #45077 @qw4990 - 优化统计信息未及时收集时的越界估算策略 #58068 @terry1purcell
- 在 Grafana 上的 Performance Overview > SQL Execute Time Overview 面板中新增
backoff时间指标,便于调试 #61441 @dbsid - 在审计日志插件中新增语句 ID 信息 #63525 @YangKeao
- 支持由
TiKV
- 将 BR 模块中部分可自动恢复的错误日志级别从
ERROR调整为WARN,减少不必要的告警 #18493 @YuJuncen - 将 TiKV 的部分错误日志级别从
ERROR调整为WARN,减少不必要的告警 #18745 @exit-code-1 - 将 Raft 模块检查 GC 的流程拆分为两个阶段,以提升 Region 中冗余的 MVCC 版本 GC 的效率 #18695 @v01dstar
- 基于 GC safe point 和 RocksDB 的统计信息计算 MVCC 的冗余度,提升 Compaction 的效率和准确性 #18697 @v01dstar
- 将 Region MVCC 的 GC 处理逻辑更改为由 GC Worker 线程执行,从而统一 GC 的处理逻辑 #18727 @v01dstar
- 优化 gRPC 线程池线程数量默认值的计算方式,将原固定值调整为根据总的 CPU 配置动态计算,避免因 gRPC 线程数量过小导致的性能瓶颈 #18613 @LykxSassinator
- 优化在存在大量 SST 文件的环境中 async snapshot 和 write 的尾延迟 #18743 @Connor1996
- 将 BR 模块中部分可自动恢复的错误日志级别从
PD
- 减少非必要的错误日志 #9370 @bufferflies
- 将 Golang 版本从 1.23.0 升级至 1.23.12,并更新相关依赖项 #9788 @JmPotato
- 支持按表级别维度打散 Region 数量,以在
scatter-role和engine维度实现均衡分布 #8986 @bufferflies
TiFlash
- 跳过不必要数据读取,提升
TableScan读取性能 #9875 @gengliqi - 优化 TiFlash 在列多且稀疏(大量
NULL或空值)的宽表上执行TableScan的性能 #10361 @JaySon-Huang - 在集群存在大量表的场景中,降低添加向量索引时 TiFlash 的 CPU 开销 #10357 @Lloyd-Pottiger
- 减少处理无用 Raft 命令时产生的不必要日志输出,降低日志量 #10467 @JaySon-Huang
- 优化 TiFlash 在小数据量分区表上执行
TableScan的性能 #10487 @JaySon-Huang
- 跳过不必要数据读取,提升
Tools
TiDB Data Migration (DM)
- 获取上游
GTID_MODE时,支持兼容大小写 #12167 @OliverS929
- 获取上游
错误修复
TiDB
- 修复当
tidb_isolation_read_engines设置为tiflash时,use indexHint 无法生效的问题 #60869 @Lloyd-Pottiger - 修复
max_execution_time对SELECT FOR UPDATE语句不生效的问题 #62960 @ekexium - 修复估算跨月或跨年的行数时,结果可能过分偏大的问题 #50080 @terry1purcell
- 修复预处理语句中处理
Decimal的方式与 MySQL 不一致的问题 #62602 @ChangRui-Ryan - 修复
TRUNCATE()函数中短路径处理错误的问题 #57608 @xzhangxian1008 - 修复当触发
Out Of Quota For Local Temporary Space错误时,落盘文件可能未被全部删除的问题 #63216 @xzhangxian1008 - 修复使用正则表达式查询
INFORMATION_SCHEMA表时,结果不正确的问题 #62347 @River2000i - 修复从 PD 获取时间戳异常时,没有返回错误的问题 #58871 @joechenrh
- 修复在执行
MODIFY COLUMN操作时,owner TiDB 与非 owner TiDB 查询结果不一致的问题 #60264 @tangenta - 修复动态调参后,
ADMIN ALTER DDL JOBS显示参数不正确的问题 #63201 @fzzf678 - 修复通过事务加索引时,GC savepoint 不推进的问题 #62424 @wjhuang2016
- 修复过大的 SST 文件 Ingest 到 L0 中导致流控的问题 #63466 @CbcWestwolf
- 修复当 CPU 和内存比例为 1:2 时,阻塞全局排序的问题 #60951 @wjhuang2016
- 修复超过 16 个分布式执行框架 (Distributed eXecution Framework, DXF) 任务上限时,无法取消 Pending 任务的问题 #63896 @D3Hunter
- 修复取消 DXF 任务后,其他任务无法退出的问题 #63927 @D3Hunter
- 修复开启
Apply算子并发后 (tidb_enable_parallel_apply = on),由于缺少实现 Clone 导致计划生成失败的问题 #59863 @hawkingrei - 修复查询使用
ATAN2函数可能导致结果错误的问题 #60093 @guo-shaoge - 修复
select 1 from dual无法使用实例级别的计划缓存的问题 #63075 @time-and-fate - 修复 Join Order 变更顺序后可能导致无法规划的问题 #61715 @hawkingrei
- 修复
set_varHint 使用 Binding 导致无法恢复为原始变量设置的问题 #59822 @wddevries - 修复
ONLY_FULL_GROUP_BY取值为负数时导致检查失败的问题 #62617 @AilinKid - 修复
ONLY_FULL_GROUP_BY检查大小写不敏感的问题 #62672 @AilinKid - 修复 DP Join Order 算法可能产生错误 Plan 的问题 #63353 @winoros
- 修复 Outer Join 改写为 Inner Join 可能出错的问题 #61327 @hawkingrei
- 修复执行查询可能导致内部 panic 的问题 #58600 @Defined2014
- 修复全局索引在某些
ALTER PARTITION操作期间可能读取错误数据的问题 #64084 @mjonss - 修复全局索引在某些情况下返回错误结果的问题 #61083 @Defined2014
- 修复
character_set_results在遇到错误字符时进行截断而非替换的问题 #61085 @xhebox - 修复
ADD COLUMN与UPDATE并发执行时出错的问题 #60047 @L-maple - 修复 Merge Join 在计算成本时可能遗漏过滤条件的问题 #62917 @qw4990
- 修复当
PD
- 修复 PD Client 重试策略未正确初始化的问题 #9013 @rleungx
- 修复 TSO HTTP API
/config和/members的错误输出 #9797 @lhy1024 - 修复 TSO Follower Proxy 的错误处理逻辑 #9188 @Tema
- 修复在关闭 bucket 上报功能后,split bucket 依然生效的问题 #9726 @bufferflies
- 修复 Resource Manager 错误分配 token 导致查询卡住的问题 #9455 @JmPotato
- 修复 PD leader 切换后,Placement Rule 未生效问题 #9602 @okJiang
- 修复 PD 在解析以科学计数法表示的大数值时可能失败,从而导致部分 TTL 相关的配置不生效的问题 #9343 @lhy1024
TiFlash
- 修复当查询的列存储大量
NULL值时,可能导致查询失败的问题 #10340 @Lloyd-Pottiger - 修复 TiFlash 消耗 RU 的统计数据偏高的问题 #10380 @JinheLin
- 修复在存算分离架构下,当存在慢查询时 TiFlash 容易发生 OOM 的问题 #10278 @JaySon-Huang
- 修复在存算分离架构下,TiFlash 遇到与 S3 的网络分区时可能无限重试的问题 #10424 @JaySon-Huang
- 修复当参数为
DECIMAL类型时,FLOOR()和CEIL()函数结果可能不正确的问题 #10365 @ChangRui-Ryan
- 修复当查询的列存储大量
Tools
Backup & Restore (BR)
- 修复日志备份中 zstd 压缩未生效,导致输出未被压缩的问题 #18836 @3pointer
- 修复备份数据到 Azure Blob Storage 时 flush 偶尔会很慢的问题 #18410 @YuJuncen
- 修复删除文件失败时可能出现
log truncate的问题 #63358 @YuJuncen - 修复在备份数据时如果设置
--checksum为false可能导致恢复后mysql.stats_meta表的 count 列为0的问题 #60978 @Leavrth - 降低了 S3 兼容存储服务在启用带宽限制时使用 BR 恢复数据失败的概率 #18846 @kennytm
- 修复
log backup observer可能丢失对某个 Region 的监听,从而导致日志备份进度无法推进的问题 #18243 @Leavrth - 修复当备份的表中存在一些特殊的 schema 时,可能导致
restore point创建失败的问题 #63663 @RidRisR
TiCDC
- 修复在配置包含虚拟列的 Column 类型分区分发器时可能导致的 panic 问题 #12241 @wk989898
- 修复在关闭 DDL puller 时可能引发的 panic 问题 #12244 @wk989898
- 支持在
filter配置中通过ignore-txn-start-ts参数过滤不支持的 DDL 类型 #12286 @asddongmen - 修复使用 Azure Blob Storage 作为下游时可能出现数据同步任务卡住的问题 #12277 @zurakutsia
- 修复
DROP FOREIGN KEYDDL 没有同步到下游的问题 #12328 @3AceShowHand - 修复订阅 Region 时遇到回滚和预写条目导致 TiCDC panic 的问题 #19048 @3AceShowHand
- 修复 TiKV 中的断言错误可能导致 TiCDC panic 的问题 #18498 @tharanga