TiDB v8.5 版本正式发布,来看看有什么惊喜吧!
作者: 社区小助手原文来源:https://tidb.net/blog/5ad1bd36
发版日期:2024 年 12 月 19 日
TiDB 版本:8.5.0
TiDB 8.5.0 为长期支持版本 (Long-Term Support Release, LTS)。
相比于前一个 LTS(即 8.1.0 版本),8.5.0 版本包含 8.2.0-DMR、8.3.0-DMR, 和 8.4.0-DMR 中已发布的新功能、提升改进和错误修复。当你从 8.1.x 升级到 8.5.0 时,可以下载 TiDB Release Notes PDF 查看两个 LTS 版本之间的所有 Release Notes。下表列出了从 8.1.0 到 8.5.0 的一些关键特性:
功能详情
可扩展性
Schema 缓存可用的内存上限成为正式功能 (GA),当表的数量达到几十万甚至上百万时,可以显示减少 Schema 元数据的内存占用 #50959 @tiancaiamao @wjhuang2016 @gmhdbjd @tangenta
在一些 SaaS 场景下,当表的数量达到几十万甚至上百万时,Schema 元数据会占用较多的内存。开启该功能后,系统将使用 Least Recently Used (LRU) 算法缓存和淘汰相应的 Schema 元数据信息,有效减少内存占用。
从 v8.4.0 开始,该功能默认开启,默认值为
536870912
(即 512 MiB),你可以通过系统变量tidb_schema_cache_size
按需调整。更多信息,请参考用户文档。
通过 Active PD Follower 提升 PD 上 Region 信息查询服务的扩展能力 (GA) #7431 @okJiang
当集群的 Region 数量较多时,PD leader 处理心跳和调度任务的开销也较大,可能导致 CPU 资源紧张。如果同时集群中的 TiDB 实例数量较多,查询 Region 信息请求并发量较大,PD leader CPU 压力将变得更大,可能会造成 PD 服务不可用。
为确保服务的高可用性,TiDB v7.6.0 引入 Active PD Follower 作为实验特性,以提升 PD 上 Region 信息查询服务的扩展能力。在 v8.5.0 中,该功能成为正式功能 (GA)。你可以通过设置系统变量
pd_enable_follower_handle_region
开启 Active PD Follower 特性。启用该特性后,TiDB 在获取 Region 信息时会将请求均匀地发送到所有 PD 节点上,使 PD follower 也可以处理 Region 请求,从而减轻 PD leader 的 CPU 压力。更多信息,请参考用户文档。
性能
TiDB 加速建表成为正式功能 (GA),显著缩短数据迁移和集群初始化时间 #50052 @D3Hunter @gmhdbjd
TiDB v7.6.0 引入加速建表功能作为实验特性,并通过系统变量
tidb_ddl_version
控制。从 v8.0.0 开始,该系统变量更名为tidb_enable_fast_create_table
。在 v8.5.0 中,TiDB 加速建表功能成为正式功能 (GA) 并默认开启。在数据迁移或集群初始化时,该功能支持快速创建百万级规模的表,从而显著缩短相关操作的耗时。
更多信息,请参考用户文档。
TiKV 支持 MVCC 内存引擎 (In-memory Engine, IME),可加速需要扫描大量 MVCC 历史版本的查询 #16141 @SpadeA-Tang @glorv @overvenus
当频繁更新记录或者需要 TiDB 保留较长时间的历史版本(例如 24 小时)数据时,堆积的 MVCC 版本会导致扫描性能下降。TiKV 的 MVCC 内存引擎可以将最新的 MVCC 版本缓存在内存中,并通过快速的 GC 机制删除内存中的历史版本,从而提升扫描性能。
从 v8.5.0 开始,TiKV 引入 MVCC 内存引擎。当 TiKV 集群中的 MVCC 版本堆积导致扫描性能下降时,你可以通过设置 TiKV 参数
in-memory-engine.enable
来开启 TiKV MVCC 内存引擎,提升扫描性能。更多信息,请参考用户文档。
稳定性
当突然有大量请求发送到 PD 时,这些请求可能导致 PD 工作负载过高,进行影响 PD 性能表现。从 v8.5.0 开始,你可以使用
pd-ctl
来限制 PD 处理请求的最大速率和并发度,提升 PD 的稳定性。更多信息,请参考用户文档。
SQL 功能
外键成为正式功能 (GA) #36982 @YangKeao @crazycs520
在 v8.5.0 中,TiDB 的外键功能成为正式功能 (GA),支持使用外键约束提升数据一致性和保障完整性。你可以轻松创建表间的外键关联,实现级联更新和删除操作,使得数据管理更加便捷。这一功能为复杂数据关联的应用场景提供了更好的支持。
更多信息,请参考用户文档。
引入
ADMIN ALTER DDL JOBS
语法,支持在线修改 DDL 任务参数 #57229 @fzzf678 @tangenta
从 v8.3.0 开始,TiDB 支持在会话级别设置变量 tidb_ddl_reorg_batch_size
和 tidb_ddl_reorg_worker_cnt
,因此通过 Global 设置这两个变量已不再影响所有运行中的 DDL 任务。如需更改这些变量的值,需要先取消 DDL 任务,调整变量取值后再重新提交。
从 v8.5.0 开始,引入了 ADMIN ALTER DDL JOBS
语句。你可以在线调整指定的 DDL 任务的变量值,以便灵活平衡资源消耗与性能,并将变更限定于单个任务,使影响范围更加可控。例如:
ADMIN ALTER DDL JOBS job_id THREAD = 8;
:在线调整该 DDL 任务的tidb_ddl_reorg_worker_cnt
ADMIN ALTER DDL JOBS job_id BATCH_SIZE = 256;
:在线调整该 DDL 任务的tidb_ddl_reorg_batch_size
ADMIN ALTER DDL JOBS job_id MAX_WRITE_SPEED = '200MiB';
:在线调整写入每个 TiKV 节点的索引数据流量大小更多信息,请参考用户文档。
安全
BR 支持在客户端进行快照备份数据和日志备份数据加密 (GA) #28640 #56433 @joccau @Tristan1900
通过快照备份数据的客户端加密功能(在 TiDB v5.3.0 中以实验特性引入),你可以使用自定义的固定密钥在客户端加密备份数据。
通过日志备份数据的客户端加密功能(在 TiDB v8.4.0 中以实验特性引入),你使用以下方式之一在客户端加密日志备份数据:
使用自定义的固定密钥加密
使用本地磁盘的主密钥加密
使用 KMS(密钥管理服务)的主密钥加密
从 v8.5.0 开始,这两个加密功能都成为了正式功能 (GA),进一步增强了客户端数据的安全性。
TiKV 静态加密支持 Google Cloud Key Management Service (Google Cloud KMS) (GA) #8906 @glorv
TiKV 通过静态加密功能对存储的数据进行加密,以确保数据的安全性。静态加密的安全核心点在于密钥管理。在 v8.0.0 中,TiKV 静态加密以实验特性的形式支持了基于 Google Cloud KMS 的主密钥管理。
从 v8.5.0 起,基于 Google Cloud KMS 的静态加密成为正式功能 (GA)。要使用该功能,你需要在 Google Cloud 上创建一个密钥,然后在 TiKV 配置文件中添加
[security.encryption.master-key]
部分的配置。更多信息,请参考用户文档。
兼容性变更
注意
以下为从 v8.4.0 升级至当前版本 (v8.5.0) 所需兼容性变更信息。如果从 v8.3.0 或之前版本升级到当前版本,可能也需要考虑和查看中间版本 Release Notes 中提到的兼容性变更信息。
行为变更
为了与 MySQL 兼容,在非严格模式下 (
sql_mode = ''
) 向非NULL
列插入NULL
值会报错。 #55457@joechenrh不再支持
ALTER TABLE ... DROP FOREIGN KEY IF EXISTS ...
语句。 #56703 @YangKeao
系统变量
配置参数
移除功能
以下为已移除的功能:
TiDB Binlog 在 v8.4.0 中被移除。从 v8.3.0 开始,TiDB Binlog 被完全废弃。如需进行增量数据同步,请使用 TiCDC。如需按时间点恢复 (point-in-time recovery, PITR),请使用 PITR。在将 TiDB 集群升级到 v8.4.0 或之后版本前,务必先切换至 TiCDC 和 PITR。
以下为计划在未来版本中移除的功能:
从 v8.0.0 开始,TiDB Lightning 废弃了物理导入模式下的旧版冲突检测策略,支持通过
conflict.strategy
参数统一控制逻辑导入和物理导入模式的冲突检测策略。旧版冲突检测的参数duplicate-resolution
将在未来版本中被移除。
废弃功能
以下为计划将在未来版本中废弃的功能:
TiDB 在 v8.0.0 引入了系统变量
tidb_enable_auto_analyze_priority_queue
,用于控制是否启用优先队列来优化自动收集统计信息任务的排序。在未来版本中,优先队列将成为自动收集统计信息任务的唯一排序方式,该系统变量将被废弃。TiDB 在 v7.5.0 引入了系统变量
tidb_enable_async_merge_global_stats
,用于设置 TiDB 使用异步方式合并分区统计信息,以避免 OOM 问题。在未来版本中,分区统计信息将统一使用异步方式进行合并,该系统变量将被废弃。计划在后续版本重新设计执行计划绑定的自动演进,相关的变量和行为会发生变化。
TiDB 在 v8.0.0 引入了系统变量
tidb_enable_parallel_hashagg_spill
,用于控制 TiDB 是否支持并行 HashAgg 进行落盘。在未来版本中,该系统变量将被废弃。TiDB 在 v5.1 引入了系统变量
tidb_partition_prune_mode
,用于设置是否开启分区表动态裁剪模式。从 v8.5.0 开始,将该变量设置为static
或static-only
时会产生警告。在未来版本中,该系统变量将被废弃。TiDB Lightning 参数
conflict.max-record-rows
计划在未来版本中废弃,并在后续版本中删除。该参数将由conflict.threshold
替代,即记录的冲突记录数和单个导入任务允许出现的冲突记录数的上限数保持一致。从 v6.3.0 开始,分区表默认使用动态裁剪模式,相比静态裁剪模式,动态裁剪模式支持 IndexJoin、Plan Cache 等特性,性能表现更好。在未来版本中,静态裁剪模式将被废弃。
改进提升
TiDB
新增系统变量
tidb_ddl_reorg_max_write_speed
,用于限制加索引时 ingest 阶段速度的上限 #57156 @CbcWestwolf支持全局索引包含分区表达式中的所有列 #56230 @Defined2014
支持 List 分区表在 Range 查询的场景中进行分区裁剪 #56673 @Defined2014
默认开启 FixControl#46177,修复在某些情况下错误地选择了全表扫描,而没有选择索引范围扫描的问题 #46177 @terry1purcell
改进内部估算逻辑,使其能够更充分地利用多列多值索引的统计信息,提升某些涉及多值索引的查询的估算精度 #56915 @time-and-fate
提高特定情况下全表扫描的代价估算,减少错误地选择全表扫描的概率 #57085 @terry1purcell
优化特定情况下,
OUTER JOIN
含有唯一索引且有ORDER BY ... LIMIT
子句时的执行计划,提高执行效率 #56321 @winorosTiKV
向量距离函数支持 SIMD 以提升性能 #17290 @EricZequan
PD
Store limit v2 成为正式功能 (GA) #8865 @lhy1024
TiFlash
提升聚簇索引表在后台回收过期数据的速度 #9529 @JaySon-Huang
提升数据更新场景下向量搜索的查询性能 #9599 @Lloyd-Pottiger
新增关于构建向量索引 CPU 使用率的监控指标 #9032 @JaySon-Huang
提升逻辑运算符的执行效率 #9146 @windtalker
Tools
Backup & Restore (BR)
优化加密密钥
--crypter.key
的错误提示信息 #56388 @Tristan1900在进行全量备份时,默认不计算表级别的 checksum (
--checksum=false
) 以提升备份性能 #56373 @Tristan1900新增对每个存储节点的连接超时进行独立追踪和重置的机制,增强了对慢节点的处理能力,从而避免备份卡住的问题 #57666 @3pointer
TiDB Data Migration (DM)
错误修复
TiDB
修复当从 PD 返回的 Region 元数据中未包含 Leader 信息时,TiDB 未自动重试请求可能导致执行报错的问题 #56757 @cfzjywxk
修复取消 TTL 任务时,没有强制 Kill 对应 SQL 的问题 #56511 @lcwangchao
修复集群从 v6.5 升级到 v7.5 或更高版本后,已有 TTL 任务执行意外频繁的问题 #56539@lcwangchao
修复
INSERT ... ON DUPLICATE KEY
语句不兼容mysql_insert_id
的问题 #55965 @tiancaiamao修复通过
IMPORT INTO
导入数据后,AUTO_INCREMENT
字段没有正确设置的问题 #56476@D3Hunter修复执行
RECOVER TABLE BY JOB JOB_ID;
可能导致 panic 的问题 #55113 @crazycs520修复由于 stale read 未对读操作的时间戳进行严格校验,导致 TSO 和真实物理时间存在偏移,有小概率影响事务一致性的问题 #56809 @MyonKeminta
修复 DDL owner 节点切换后,无法按照切换前的进度继续执行 Reorg DDL 任务的问题 #56506@tangenta
修复查询
INFORMATION_SCHEMA.TABLES
时由于大小写敏感导致返回结果错误的问题 #56987@joechenrh修复当公共表表达式 (CTE) 有多个数据消费者时,如果某个消费者在未读取数据时就退出,可能导致非法内存访问的问题 #55881 @windtalker
修复
ADDTIME()
和SUBTIME()
函数的第一个参数为日期类型时返回错误结果的问题 #57569@xzhangxian1008修复开启
tidb_low_resolution_tso
变量后,执行SELECT FOR UPDATE
语句出现资源泄漏的问题 #55468 @tiancaiamao修复
JSON_TYPE()
函数未检查其参数类型导致传入非 JSON 数据类型时未报错的问题 #54029@YangKeao修复将数据从
BIT
类型换为CHAR
类型时可能导致 TiKV 崩溃的问题 #56494 @lcwangchao修复同时使用
RANGE COLUMNS
分区函数和utf8mb4_0900_ai_ci
排序规则时,查询结果错误的问题 #57261 @Defined2014修复执行以换行符开头的 Prepared 语句会导致数组越界的运行错误 #54283 @Defined2014
修复
UPDATE
、INSERT
、DELETE IGNORE
语句中没有忽略外键错误的问题 #56678 @YangKeao修复查询
information_schema.cluster_slow_query
表时,如果不加时间过滤条件,则只会查询最新的慢日志文件的问题 #56100 @crazycs520修复 TTL 表的内存泄漏问题 #56934 @lcwangchao
修复
write_only
状态的表外键约束未生效的问题,以避免使用non-public
状态的表 #55813@YangKeao修复使用
NATURAL JOIN
或者USING
子句之后,再使用子查询可能会报错的问题 #53766@dash12653修复如果 CTE 包含
ORDER BY
、LIMIT
、SELECT DISTINCT
子句,并且被另外一个 CTE 的递归部分所引用时,可能被错误地 inline 导致执行报错的问题 #56603 @elsa0520修复使用
PLAN REPLAYER
导入含有外键的表结构时可能报错的问题 #56456 @hawkingrei修复使用
PLAN REPLAYER
导入含有 Placement Rule 的表结构时可能报错的问题 #54961@hawkingrei修复使用
ANALYZE
收集表的统计信息时,如果该表包含虚拟生成列的表达式索引,执行会报错的问题 #57079 @hawkingrei修复
DROP DATABASE
语句没有正确触发统计信息对应变更的问题 #57227 @Rustin170506修复在 CTE 中解析数据库名时,返回错误的数据库名的问题 #54582 @hawkingrei
修复在使用
DUMP STATS
将统计信息转为 JSON 的过程中,直方图上下界数据受损的问题 #56083@hawkingrei修复
EXISTS
子查询的结果继续参与代数运算时,结果和 MySQL 不一致的问题 #56641@windtalker修复无法为带别名的多表删除语句
DELETE
创建执行计划绑定的问题 #56726 @hawkingrei修复 Grafana 中 Stats Healthy Distribution 面板的数据可能错误的问题 #57176 @hawkingrei
TiKV
修复读线程在从 Raft Engine 中的 MemTable 读取过时索引时出现的 panic 问题 #17383@LykxSassinator
修复当大量事务在排队等待同一个 key 上的锁被释放且该 key 被频繁更新时,TiKV 可能因死锁检测压力过大而出现 OOM 的问题 #17394 @MyonKeminta
修复由于 CDC 内部任务堆积过多导致 TiKV OOM 的问题 #17696 @3AceShowHand
修复
raft-entry-max-size
设置过高时,写入 batch 可能过大引起性能抖动的问题 #17701@SpadeA-Tang修复 Region Split 后可能无法快速选出 Leader 的问题 #17602 @LykxSassinator
修复使用
RADIANS()
或DEGREES()
函数时可能导致 TiKV panic 的问题 #17852 @gengliqiPD
修复已删除的资源组仍然出现在监控面板中的问题 #8716 @AndreMouche
修复配置
tidb_enable_tso_follower_proxy
为0
或OFF
时无法关闭 TSO Follower Proxy 特性的问题 #8709 @JmPotatoTiFlash
修复
SUBSTRING()
函数不支持部分整数类型的pos
和len
参数导致查询报错的问题 #9473@gengliqi修复当
SUBSTRING()
函数的第二个参数为负数时,可能返回错误结果的问题 #9604 @guo-shaoge修复当
REPLACE()
函数的第一个参数为常数时,可能报错的问题 #9522 @guo-shaoge修复当
LPAD()
和RPAD()
函数在某些情况下返回错误结果的问题 #9465 @guo-shaoge修复在创建向量索引后,如果 TiFlash 内部用于构建向量索引的任务被意外中断,可能造成 TiFlash 写入损坏数据并无法重启的问题 #9714 @JaySon-Huang
Tools
Backup & Restore (BR)
修复备份过程中还未备份完成的 range 空洞过多时出现 OOM 的问题,减少了预先分配的内存 #53529 @Leavrth
修复备份时无法备份全局索引的问题 #57469 @Defined2014
升级
k8s.io/api
库的版本以修复潜在的安全漏洞 #57790 @BornChanger修复当集群存在大量表但实际数据量较小时,PITR 数据恢复任务可能出现
Information schema is out of date
报错的问题 #57743 @Tristan1900修复通过
tiup br restore
命令进行库表级别恢复时,遗漏检查目标集群中表是否已存在,可能会覆盖已有表的问题 #58168 @RidRisRTiCDC
修复 redo 模块无法正确上报错误的问题 #11744 @CharlesCheung96
修复 TiDB DDL owner 变更导致 DDL 任务的 schema 版本出现非递增时,TiCDC 错误丢弃 DDL 任务的问题 #11714 @wlwilliamx
TiDB Lightning
贡献者
感谢来自 TiDB 社区的贡献者们:
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/89d6fadeb5ab936520c76ca87】。文章转载请联系作者。
评论