TiDB 8.4.0 Release Notes
发版日期:2024 年 11 月 11 日
TiDB 版本:8.4.0
在 8.4.0 版本中,你可以获得以下关键特性:
分类 | 功能/增强 | 描述 |
---|---|---|
可扩展性和性能 | 实例级执行计划缓存(实验特性) | 实例级执行计划缓存允许同一个 TiDB 实例的所有会话共享执行计划缓存。与现有的会话级执行计划缓存相比,实例级执行计划缓存能够在内存中缓存更多执行计划,减少 SQL 编译时间,从而降低 SQL 整体运行时间,提升 OLTP 的性能和吞吐,同时更好地控制内存使用,提升数据库稳定性。 |
分区表全局索引成为正式功能 | 全局索引可以有效提高检索非分区列的效率,并且消除了唯一键必须包含分区键的限制。该功能扩展了 TiDB 分区表的使用场景,避免了数据迁移过程中的一些应用修改工作。 | |
TiDB 并行获取 TSO | 在高并发场景下,并行获取 TSO 能够有效降低等待获取 TSO 的时间,提升集群的吞吐。 | |
提升缓存表的查询性能 | 优化了缓存表索引扫描的查询性能,部分场景可提升 5.4 倍。在需要对小表进行高速查询的场景下,利用缓存表可大幅提升整体性能。 | |
稳定性与高可用 | Runaway Queries 支持更多触发条件,并能够切换资源组 | Runaway Queries 提供了有效的手段来降低突发的 SQL 性能问题对系统产生的影响。v8.4.0 中新增 Coprocessor 处理的 Key 的数量 (PROCESSED_KEYS ) 和 Request Unit (RU ) 作为识别条件,并可以将识别到的查询置入指定资源组,对 Runaway Queries 进行更精确的识别与控制。 |
支持为资源管控的后台任务设置资源使用上限 | 为资源管控的后台任务设置百分比上限,针对不同业务系统的需求,控制后台任务的消耗,从而将后台任务的消耗限制在一个很低的水平,保证在线业务的服务质量。 | |
TiProxy 流量捕获和回放(实验特性) | 在进行集群升级、迁移或部署变更等重要操作之前,使用 TiProxy 捕获 TiDB 生产集群的真实负载,并在测试的目标集群中重现该工作负载,从而验证性能,确保变更成功。 | |
自动统计信息收集任务支持并发 | 使用系统变量 tidb_auto_analyze_concurrency 控制单个自动统计信息收集任务内部的并发度,TiDB 会根据节点规模和硬件规格自动确定扫描任务的并发度。该功能通过充分利用系统资源,提高统计信息收集效率,从而减少手动调优,并确保集群性能稳定。 | |
SQL | 支持向量搜索功能(实验特性) | 向量搜索是一种基于数据语义的搜索方法,可以提供更相关的搜索结果。作为 AI 和大语言模型 (LLM) 的核心功能之一,向量搜索可用于检索增强生成 (Retrieval-Augmented Generation, RAG)、语义搜索、推荐系统等多种场景。 |
数据库管理和可观测性 | 在内存表中显示 TiKV 和 TiDB 的 CPU 时间 | 将 CPU 时间合入系统表中展示,与会话或 SQL 的其他指标并列,方便你从多角度对高 CPU 消耗的操作进行观测,提升诊断效率。尤其适用于诊断实例 CPU 飙升或集群读写热点等场景。 |
按表或数据库维度聚合 TiKV 消耗的 CPU 时间 | 当热点问题不是由个别 SQL 语句引起时,利用 Top SQL 中按表或者数据库聚合的 CPU 时间,能够协助用户快速发现造成热点的表或者应用程序,从而大大提升热点问题和 CPU 消耗问题的诊断效率。 | |
支持对开启了 IMDSv2 服务的 TiKV 实例做备份 | 目前 AWS EC2 的默认元数据服务是 IMDSv2。TiDB 支持从开启了 IMDSv2 的 TiKV 实例中备份数据,协助你更好地在公有云服务中运行 TiDB 集群。 | |
安全 | 日志备份数据支持客户端加密(实验特性) | 在上传日志备份到备份存储之前,你可以对日志备份数据进行加密,确保数据在存储和传输过程中的安全性。 |
功能详情
性能
新增 TSO 请求的并行批处理模式,降低获取 TSO 的延迟 #54960 #8432 @MyonKeminta
在 v8.4.0 之前,TiDB 向 PD 请求 TSO 时会将一段时间内的请求汇总起来并以串行的方式进行批处理,以减少 RPC (Remote Procedure Call) 请求数量,从而降低 PD 负载。对于延迟敏感的场景,这种串行模式的性能并不理想。
在 v8.4.0 中,TiDB 新增 TSO 请求的并行批处理模式,并提供不同的并发能力。并行模式可以降低获取 TSO 的延迟,但可能会增加 PD 的负载。你可以通过
tidb_tso_client_rpc_mode
变量设定获取 TSO 的 RPC 模式。更多信息,请参考用户文档。
优化 TiDB Hash Join 算子的执行效率(实验特性)#55153 #53127 @windtalker @xzhangxian1008 @XuHuaiyu @wshwsh12
在 v8.4.0 中,TiDB 对 Hash Join 算子的实现方法进行了优化,以提升其执行效率。目前,优化版的 Hash Join 仅对 Inner Join 和 Outer Join 操作生效,且默认关闭。如需开启优化版的 Hash Join,可以将系统变量
tidb_hash_join_version
设置为optimized
。更多信息,请参考用户文档。
支持下推以下日期函数到 TiKV #56297 #17529 @gengliqi
DATE_ADD()
DATE_SUB()
ADDDATE()
SUBDATE()
更多信息,请参考用户文档。
支持实例级执行计划缓存(实验特性)#54057 @qw4990
实例级执行计划缓存允许同一个 TiDB 实例上的所有会话共享执行计划缓存。该功能可以大幅降低 TiDB 的查询响应时间,提升集群吞吐,减少执行计划突变的可能性,并保持集群性能的稳定。相比会话级执行计划缓存,实例级执行计划缓存具有以下优势:
- 消除冗余,在相同的内存消耗下缓存更多执行计划。
- 在实例上分配固定大小的内存区域,更有效地限制内存使用。
在 v8.4.0 中,实例级执行计划缓存仅支持对查询的执行计划进行缓存,且默认关闭。你可以通过系统变量
tidb_enable_instance_plan_cache
开启该功能,并通过系统变量tidb_instance_plan_cache_max_size
设置其最大内存使用量。开启该功能之前,请关闭会话级别的 Prepare 语句执行计划缓存和非 Prepare 语句执行计划缓存。更多信息,请参考用户文档。
TiDB Lightning 的逻辑导入模式支持预处理语句和客户端语句缓存 #54850 @dbsid
通过开启配置项
logical-import-prep-stmt
,TiDB Lightning 逻辑导入模式中执行的 SQL 语句将通过使用预处理语句和客户端语句缓存,降低 TiDB SQL 解析和编译的成本,提升 SQL 执行效率,并有更大机会命中执行计划缓存,提升逻辑导入的速度。更多信息,请参考用户文档。
分区表的全局索引成为正式功能 (GA) #45133 @mjonss @Defined2014 @jiyfhust @L-maple
之前版本的分区表,因为不支持全局索引有较多的限制,比如唯一键必须包含分区表达式中用到的所有列,如果查询条件不带分区键,查询时会扫描所有分区,导致性能较差。从 v7.6.0 开始,引入了系统变量
tidb_enable_global_index
用于开启全局索引特性,但该功能当时处于开发中,不够完善,不建议开启。从 v8.3.0 开始,全局索引作为实验特性正式发布。你可通过关键字
GLOBAL
为分区表显式创建一个全局索引,从而去除分区表唯一键必须包含分区表达式中用到的所有列的限制,满足灵活的业务需求。同时基于全局索引也提升了非分区列的查询性能。在 v8.4.0 中,全局索引成为正式功能 (GA)。你无需再设置系统变量
tidb_enable_global_index
开启全局索引特性,可以直接使用关键字GLOBAL
创建全局索引。从 v8.4.0 开始,该系统变量被废弃,并总是设置为ON
。更多信息,请参考用户文档。
优化缓存表在部分场景下的查询性能 #43249 @tiancaiamao
优化缓存表的查询性能,在使用
IndexLookup
执行SELECT ... LIMIT 1
时,性能最高提升 5.4 倍。同时,提升IndexLookupReader
在全表扫描和主键查询场景下的性能。
稳定性
超出预期的查询 (Runaway Queries) 新增处理行数和 Request Unit 作为阈值 #54434 @HuSharp
从 v8.4.0 开始, TiDB 可以依据处理行数 (
PROCESSED_KEYS
) 和 Request Unit (RU
) 定义超出预期的查询。和执行时间 (EXEC_ELAPSED
) 相比,新增阈值能够更准确地定义查询的资源消耗,避免整体性能下降时发生识别偏差。支持同时设置多个条件,满足任意条件即识别为
Runaway Queries
。可以观测 Statement Summary Tables 中的几个对应字段 (
RESOURCE_GROUP
、MAX_REQUEST_UNIT_WRITE
、MAX_REQUEST_UNIT_READ
、MAX_PROCESSED_KEYS
),根据历史执行情况决定条件值的大小。更多信息,请参考用户文档。
超出预期的查询 (Runaway Queries) 支持切换资源组 #54434 @JmPotato
v8.4.0 新增支持将 Runaway Queries 切换到指定资源组。在降低优先级 (COOLDOWN) 仍旧无法有效降低资源消耗的情况下,你可以创建一个资源组 (Resource Group)并限制其资源上限,通过配置参数
SWITCH_GROUP
指定将识别到的查询切换到该资源组中,会话的后续查询仍在原资源组中执行。切换资源组的行为能够更精确地限制资源使用,对 Runaway Queries 的资源消耗做更加严格的控制。更多信息,请参考用户文档。
支持使用系统变量
tidb_scatter_region
设置集群级别的 Region 打散策略 #55184 @D3Hunter在 v8.4.0 之前,系统变量
tidb_scatter_region
仅支持设置为开启或者关闭。开启后,建表时会使用表级别打散策略。在批量快速建表,且表的数量达到几十万张后,该策略会导致 Region 集中分布在其中几个 TiKV 节点,导致这些 TiKV 节点 OOM。从 v8.4.0 开始,该系统变量改为字符串类型,且新增支持集群级别的打散策略,避免上述场景下导致 TiKV OOM 的问题。
更多信息,请参考用户文档。
支持为资源管控的后台任务设置资源上限 #56019 @glorv
TiDB 资源管控能够识别并降低后台任务的运行优先级。在部分场景下,即使有空闲资源,用户也希望后台任务消耗能够控制在很低的水平。从 v8.4.0 开始,你可以使用参数
UTILIZATION_LIMIT
为资源管控的后台任务设置最大可以使用的资源百分比,每个节点把所有后台任务的使用量控制在这个百分比以下。该功能可以让你精细控制后台任务的资源占用,进一步提升集群稳定性。更多信息,请参考用户文档。
TiDB 在 v8.4.0 部分调整了资源分配策略,更好地满足用户对资源管控的预期。
- 控制大查询在运行时的资源分配,避免超出资源组限额。配合 Runaway Queries 的
COOLDOWN
动作,识别并降低大查询并发度,降低瞬时资源消耗。 - 调整默认的优先级调度策略。当不同优先级的任务同时运行时,高优先级的任务获得更多资源。
- 控制大查询在运行时的资源分配,避免超出资源组限额。配合 Runaway Queries 的
高可用
TiProxy 支持流量回放功能(实验特性)#642 @djshow832
从 TiProxy v1.3.0 开始,你可以使用
tiproxyctl
连接 TiProxy 实例,捕获 TiDB 生产集群中的访问流量,并在测试集群中按照指定的速率回放这些流量。通过该功能,你可以在测试环境中重现生产集群的实际工作负载,从而验证所有 SQL 的执行结果和性能表现。流量回放适用于以下场景:
- TiDB 版本升级前验证
- 执行变更前影响评估
- TiDB 扩缩容前性能验证
- 集群性能上限测试
更多信息,请参考用户文档。
SQL 功能
支持向量搜索功能(实验特性)#54245 #17290 #9032 @breezewish @Lloyd-Pottiger @EricZequan @zimulala @JaySon-Huang @winoros @wk989898
向量搜索是一种基于数据语义的搜索方法,可以提供更相关的搜索结果。作为 AI 和大语言模型 (LLM) 的核心功能之一,向量搜索可用于检索增强生成 (Retrieval-Augmented Generation, RAG)、语义搜索、推荐系统等多种场景。
从 v8.4.0 开始,TiDB 支持向量数据类型和向量搜索索引,具备强大的向量搜索能力。TiDB 的向量数据类型最多可支持 16383 维度,并支持多种距离函数,包括 L2 距离(欧式距离)、余弦距离、负内积和 L1 距离(曼哈顿距离)。
在使用时,你只需要创建包含向量数据类型的表,并插入向量数据,即可执行向量搜索查询,也可进行向量数据与传统关系数据的混合查询。
此外,你可以创建并利用向量搜索索引来提升向量搜索的性能。需要注意的是,TiDB 的向量搜索索引依赖于 TiFlash。在使用向量搜索索引之前,需要确保 TiDB 集群中已部署 TiFlash 节点。
更多信息,请参考用户文档。
数据库管理
日志备份数据支持客户端加密(实验特性)#55834 @Tristan1900
在之前的版本中,仅快照备份数据支持客户端加密。从 v8.4.0 起,日志备份数据也支持客户端加密。在上传日志备份到备份存储之前,你可以选择以下方式之一对日志备份数据进行加密,从而确保备份数据的安全性:
- 使用自定义的固定密钥加密
- 使用本地磁盘的主密钥加密
- 使用 KMS(密钥管理服务)的主密钥加密
更多信息,请参考用户文档。
BR 降低了从云存储服务系统恢复数据的权限要求 #55870 @Leavrth
在 v8.4.0 之前,BR 在恢复过程中会将恢复进度的检查点信息写入到备份存储系统。当恢复过程出现中断时,这些检查点使中断的恢复操作能够快速恢复。从 v8.4.0 开始,BR 将恢复检查点信息写入到目标 TiDB 集群中。这意味着 BR 在恢复时只需要具备对备份目录的读取权限。
更多信息,请参考用户文档。
可观测性
在系统表中显示 TiDB 和 TiKV 消耗的 CPU 时间 #55542 @yibin87
TiDB Dashboard 的 Top SQL 页面能够展示 CPU 消耗高的 SQL 语句。从 v8.4.0 开始,TiDB 将 CPU 时间消耗信息加入系统表展示,与会话或 SQL 的其他指标并列,方便你从多角度对高 CPU 消耗的操作进行观测。在实例 CPU 飙升或集群读写热点的场景下,这些信息能够协助你快速发现问题的原因。
STATEMENTS_SUMMARY
增加AVG_TIDB_CPU_TIME
和AVG_TIKV_CPU_TIME
,显示单个 SQL 语句在历史上消耗 CPU 的平均时间。INFORMATION_SCHEMA.PROCESSLIST
增加TIDB_CPU
和TIKV_CPU
,显示会话当前正在执行 SQL 的累计 CPU 时间消耗。- 慢日志中增加字段
Tidb_cpu_time
和Tikv_cpu_time
,显示被捕捉到的 SQL 语句消耗 CPU 的时间。
其中,TiKV 的 CPU 时间默认显示。采集 TiDB 的 CPU 时间会引入额外开销(约 8%),因此仅在开启 Top SQL 特性时,TiDB 的 CPU 时间才会显示为实际值,否则始终显示为
0
。更多信息,请参考
INFORMATION_SCHEMA.PROCESSLIST
和INFORMATION_SCHEMA.SLOW_QUERY
。Top SQL 支持按表或数据库维度查看 CPU 时间的聚合结果 #55540 @nolouch
在 v8.4.0 之前,Top SQL 以 SQL 为单位来聚合 CPU 时间。如果 CPU 时间不是由少数几个 SQL 贡献,按 SQL 聚合并不能有效发现问题。从 v8.4.0 开始,你可以选择 By TABLE 或者 By DB 聚合 CPU 时间。在多系统融合的场景下,新的聚合方式能够更有效地识别来自某个特定系统的负载变化,提升问题诊断的效率。
更多信息,请参考用户文档。
安全
BR 支持 AWS IMDSv2 #16443 @pingyu
在 Amazon EC2 上部署 TiDB 时,BR 支持 AWS 的 Instance Metadata Service Version 2 (IMDSv2)。你可以在 EC2 实例上进行相关配置,使 BR 可以使用与实例关联的 IAM 角色以适当的权限访问 Amazon S3。
更多信息,请参考用户文档。
数据迁移
TiCDC Claim-Check 支持仅发送 Kafka 消息的
value
部分到外部存储 #11396 @3AceShowHand在 v8.4.0 之前,如果开启了 Claim-Check 功能 (将
large-message-handle-option
设置为claim-check
),TiCDC 在处理大型消息时会将key
和value
都进行编码并存储在外部存储系统中。从 v8.4.0 开始,TiCDC 支持仅将 Kafka 消息的
value
部分发送到外部存储,该功能仅适用于非 Open Protocol 协议。你可以通过设置claim-check-raw-value
参数控制是否开启该功能。更多信息,请参考用户文档。
TiCDC 引入 Checksum V2 算法校验 Update 或 Delete 事件中 Old Value 数据 #10969 @3AceShowHand
从 v8.4.0 开始,TiDB 和 TiCDC 引入 Checksum V2 算法,解决了 Checksum V1 在执行
ADD COLUMN
或DROP COLUMN
后无法正确校验 Update 或 Delete 事件中 Old Value 数据的问题。对于 v8.4.0 及之后新创建的集群,或从之前版本升级到 v8.4.0 的集群,启用单行数据 Checksum 正确性校验功能后,TiDB 默认使用 Checksum V2 算法进行 Checksum 计算和校验。TiCDC 支持同时处理 V1 和 V2 两种 Checksum。该变更仅影响 TiDB 和 TiCDC 内部实现,不影响下游 Kafka consumer 的 Checksum 计算校验方法。更多信息,请参考用户文档。
兼容性变更
系统变量
变量名 | 修改类型 | 描述 |
---|---|---|
log_bin | 删除 | 从 v8.4.0 开始,TiDB Binlog 被移除。该变量表示是否使用 TiDB Binlog,从 v8.4.0 开始被删除。 |
sql_log_bin | 删除 | 从 v8.4.0 开始,TiDB Binlog 被移除。该变量表示是否将更改写入 TiDB Binlog,从 v8.4.0 开始被删除。 |
tidb_enable_global_index | 废弃 | 从 v8.4.0 开始,该变量被废弃。其值将固定为默认值 ON ,即默认启用全局索引。你只需在执行 CREATE TABLE 或 ALTER TABLE 时给对应的列加上关键字 GLOBAL 即可创建全局索引。 |
tidb_enable_list_partition | 废弃 | 从 v8.4.0 开始,该变量被废弃。其值将固定为默认值 ON ,即默认启用 List 分区。 |
tidb_enable_table_partition | 废弃 | 从 v8.4.0 开始,该变量被废弃。其值将固定为默认值 ON ,即默认启用分区表。 |
tidb_analyze_partition_concurrency | 修改 | 取值范围从 [1, 18446744073709551615] 修改为 [1, 128] 。 |
tidb_enable_inl_join_inner_multi_pattern | 修改 | 默认值从 OFF 修改为 ON 。从 v8.4.0 开始,当内表上有 Selection 、Projection 或 Aggregation 算子时,默认支持 Index Join。 |
tidb_opt_prefer_range_scan | 修改 | 默认值从 OFF 修改为 ON 。对于没有统计信息的表(伪统计信息)或空表(零统计信息),优化器将优先选择区间扫描而不是全表扫描。 |
tidb_scatter_region | 修改 | 在 v8.4.0 之前,该变量为布尔型,仅支持开启或关闭,且开启后新建表的 Region 只支持表级别打散。从 v8.4.0 开始,增加 SESSION 作用域,类型由布尔型变更为枚举型,默认值由原来的 OFF 变更为空,表示不打散表 Region,并增加了可选值 TABLE 和 GLOBAL 。支持集群级别的打散策略,避免快速批量建表时由于 Region 分布不均匀导致 TiKV OOM 的问题。 |
tidb_schema_cache_size | 修改 | 默认值从 0 修改为 536870912 (即 512 MiB),表示默认开启该功能,且最小值允许设置为 67108864 (即 64 MiB)。 |
tidb_auto_analyze_concurrency | 新增 | 设置单个自动统计信息收集任务内部的并发度。在 v8.4.0 之前,该并发度固定为 1 。你可以根据集群资源情况提高该并发度,从而加快统计信息收集任务的执行速度。 |
tidb_enable_instance_plan_cache | 新增 | 控制是否开启 Instance Plan Cache 功能。 |
tidb_enable_stats_owner | 新增 | 设置该 TiDB 实例是否可以运行统计信息自动更新任务。 |
tidb_hash_join_version | 新增 | 控制 TiDB 是否使用 Hash Join 算子的优化版。默认值为 legacy ,表示不使用优化版。如果设置为 optimized ,TiDB 在执行 Hash Join 算子时将使用其优化版,以提升 Hash Join 性能。 |
tidb_instance_plan_cache_max_size | 新增 | 设置 Instance Plan Cache 的最大内存使用量。 |
tidb_instance_plan_cache_reserved_percentage | 新增 | 控制内存驱逐后 Instance Plan Cache 的空闲内存百分比。 |
tidb_pre_split_regions | 新增 | 在 v8.4.0 之前,要设置新建表默认的行分裂分片数,需要在每个 CREATE TABLE SQL 语句里声明 PRE_SPLIT_REGIONS ,一旦需要同样配置的表数量较多,操作复杂。为解决这些问题,引入了该变量。你可以在 GLOBAL 或 SESSION 级别设置该系统变量,提升易用性。 |
tidb_shard_row_id_bits | 新增 | 在 v8.4.0 之前,要设置新建表默认的行 ID 的分片数,需要在每个 CREATE TABLE 或 ALTER TABLE 的 SQL 语句里声明 SHARD_ROW_ID_BITS ,一旦需要同样配置的表数量较多,操作复杂。为解决这些问题,引入了该变量。你可以在 GLOBAL 或 SESSION 级别设置该系统变量,提升易用性。 |
tidb_tso_client_rpc_mode | 新增 | 设置 TiDB 向 PD 发送 TSO RPC 请求时使用的模式。这里的模式将用于控制 TSO RPC 请求是否并行,调节获取 TS 时消耗在请求攒批阶段的时间,从而在某些场景中减少执行查询时等待 TS 阶段的时间。 |
配置参数
配置文件或组件 | 配置项 | 修改类型 | 描述 |
---|---|---|---|
TiDB | grpc-keepalive-time | 修改 | 增加最小值 1 。 |
TiDB | grpc-keepalive-timeout | 修改 | 在 v8.4.0 之前,该参数为 INT 类型,且最小值仅支持设置为 1 。从 v8.4.0 开始,数据类型修改为 FLOAT64,且最小值支持设置为 0.05 。在网络抖动比较频繁的场景中可以适当调小该值,通过减少重试间隔,来减少网络抖动带来的性能影响。 |
TiDB | tidb_enable_stats_owner | 新增 | 表示该 tidb-server 是否可以运行统计信息自动更新任务。 |
TiKV | region-split-keys | 修改 | 默认值从 "960000" 修改为 "2560000" 。 |
TiKV | region-split-size | 修改 | 默认值从 "96MiB" 修改为 "256MiB" 。 |
TiKV | sst-max-size | 修改 | 默认值从 "144MiB" 修改为 "384MiB" 。 |
TiKV | pessimistic-txn.in-memory-instance-size-limit | 新增 | 控制单个 TiKV 实例内存悲观锁的内存使用上限。超过此限制时,悲观锁将回退到持久化方式写入磁盘。 |
TiKV | pessimistic-txn.in-memory-peer-size-limit | 新增 | 控制单个 Region 内存悲观锁的内存使用上限。超过此限制时,悲观锁将回退到持久化方式写入磁盘。 |
TiKV | raft-engine.spill-dir | 新增 | 指定 TiKV 实例存储 Raft 日志文件的辅助目录,用于支持多盘存储 Raft 日志文件。 |
TiKV | resource-control.priority-ctl-strategy | 新增 | 配置低优先级任务的管控策略。TiKV 通过对低优先级的任务添加流量控制来确保优先执行更高优先级的任务。 |
PD | cert-allowed-cn | 修改 | 从 v8.4.0 开始,支持设置多个 Common Name 。在 v8.4.0 之前,只能设置一个 Common Name 。 |
PD | max-merge-region-keys | 修改 | 默认值从 200000 修改为 540000 。 |
PD | max-merge-region-size | 修改 | 默认值从 20 修改为 54 。 |
TiFlash | storage.format_version | 修改 | TiFlash 底层存储格式的默认版本从 5 修改为 7 ,以支持向量索引的构建与存储。由于该格式修改,升级 TiFlash 到 v8.4.0 或更高版本后,不支持原地降级到之前的版本。 |
TiDB Binlog | --enable-binlog | 删除 | 从 v8.4.0 开始,TiDB Binlog 被移除。该参数用于开启或关闭 TiDB 中 binlog 的生成,从 v8.4.0 开始被删除。 |
TiCDC | claim-check-raw-value | 新增 | 控制 TiCDC 是否仅将 Kafka 消息的 value 部分发送到外部存储,该功能仅适用于非 Open Protocol 协议。 |
TiDB Lightning | logical-import-prep-stmt | 新增 | 在逻辑导入模式下,该参数控制是否使用预处理语句和语句缓存来提高性能。默认值为 false 。 |
BR | --log.crypter.key | 新增 | 设置日志备份数据的加密密钥,十六进制字符串格式,aes128-ctr 对应 128 位(16 字节)密钥长度,aes192-ctr 为 24 字节,aes256-ctr 为 32 字节。 |
BR | --log.crypter.key-file | 新增 | 设置日志备份数据的密钥文件,可直接将存放密钥的文件路径作为参数传入,此时 log.crypter.key 不需要配置。 |
BR | --log.crypter.method | 新增 | 设置日志备份数据的加密算法,支持 aes128-ctr 、aes192-ctr 和 aes256-ctr 三种算法,缺省值为 plaintext ,表示不加密。 |
BR | --master-key | 新增 | 设置日志备份数据的主密钥,可以是基于本地磁盘的主密钥或基于云 KMS (Key Management Service) 的主密钥。 |
BR | --master-key-crypter-method | 新增 | 设置日志备份数据基于主密钥的加密算法,支持 aes128-ctr 、aes192-ctr 和 aes256-ctr 三种算法,缺省值为 plaintext ,表示不加密。 |
离线包变更
从 v8.4.0 开始,TiDB-community-toolkit
二进制软件包中移除了以下内容:
pump-{version}-linux-{arch}.tar.gz
drainer-{version}-linux-{arch}.tar.gz
binlogctl
arbiter
移除功能
以下为从 v8.4.0 开始已移除的功能:
- 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
将在未来版本中被移除。
- 从 v8.0.0 开始,TiDB Lightning 废弃了物理导入模式下的旧版冲突检测策略,支持通过
废弃功能
以下为计划将在未来版本中废弃的功能:
- TiDB 在 v8.0.0 引入了系统变量
tidb_enable_auto_analyze_priority_queue
,用于控制是否启用优先队列来优化自动收集统计信息任务的排序。在未来版本中,优先队列将成为自动收集统计信息任务的唯一排序方式,系统变量tidb_enable_auto_analyze_priority_queue
将被废弃。 - TiDB 在 v7.5.0 引入了系统变量
tidb_enable_async_merge_global_stats
,用于设置 TiDB 使用异步方式合并分区统计信息,以避免 OOM 问题。在未来版本中,分区统计信息将统一使用异步方式进行合并,系统变量tidb_enable_async_merge_global_stats
将被废弃。 - 计划在后续版本重新设计执行计划绑定的自动演进,相关的变量和行为会发生变化。
- TiDB 在 v8.0.0 引入了系统变量
tidb_enable_parallel_hashagg_spill
,用于控制 TiDB 是否支持并行 HashAgg 进行落盘。在未来版本中,系统变量tidb_enable_parallel_hashagg_spill
将被废弃。 - TiDB Lightning 参数
conflict.max-record-rows
计划在未来版本中废弃,并在后续版本中删除。该参数将由conflict.threshold
替代,即记录的冲突记录数和单个导入任务允许出现的冲突记录数的上限数保持一致。 - 从 v6.3.0 开始,分区表默认使用动态裁剪模式,相比静态裁剪模式,动态裁剪模式支持 IndexJoin、Plan Cache 等特性,性能表现更好。在未来版本中,静态裁剪模式将被废弃。
改进提升
TiDB
- 优化扫描大量数据时构造 BatchCop Task 的效率 #55915 #55413 @wshwsh12
- 优化事务的缓存,以降低事务中的写操作延时与 TiDB CPU 使用 #55287 @you06
- 优化系统变量
tidb_dml_type
为"bulk"
时 DML 语句的执行性能 #50215 @ekexium - 支持使用 Optimizer Fix Control 47400 控制优化器是否将
estRows
的最小值限制为1
,与 Oracle 和 DB2 等数据库的行为保持一致 #47400 @terry1purcell - 为日志表
mysql.tidb_runaway_queries
增加写入控制,降低大量并发写入引发的开销 #54434 @HuSharp - 当内表上有
Selection
、Projection
或Aggregation
算子时默认支持 Index Join #47233 @winoros - 在某些场景下减少
DELETE
操作从 TiKV 获取的列信息数量,降低DELETE
操作的资源开销 #38911 @winoros - 支持通过系统变量
tidb_auto_analyze_concurrency
设置单个自动统计信息收集任务内部的并发度 #53460 @hawkingrei - 优化一个内部函数的处理逻辑,提升查询大量列的表时的性能 #52112 @Rustin170506
- 支持将形如
a = 1 AND (a > 1 OR (a = 1 AND b = 2))
的过滤条件简化为a = 1 AND b = 2
#56005 @ghazalfamilyusa - 在选中不优执行计划风险较高的场景中,提高代价模型中全表扫描的代价,使得优化器更倾向于使用索引 #56012 @terry1purcell
- TiDB 支持
MID()
函数的两参数版本,即MID(str, pos)
#52420 @dveeden - 支持对主键为非 binary 类型的表拆分 TTL 任务 #55660 @lcwangchao
- 优化系统元数据相关语句性能 #50305 @ywqzzy @tangenta @joechenrh @CbcWestwolf
- 采用新的优先级队列处理自动收集统计信息操作,以提高收集性能并减少重建队列的开销 #55906 @Rustin170506
- 引入 DDL 通知程序,允许统计信息模块订阅 DDL 事件 #55722 @fzzf678 @lance6716 @Rustin170506
- TiDB 升级期间强制新版 TiDB 节点接管 DDL Owner,避免旧版本 TiDB 节点接管引发的兼容性问题 #51285 @wjhuang2016
- 支持集群级别的 Scatter Region 打散 #8424 @River2000i
TiKV
- Region 的默认值由 96 MiB 提升到 256 MiB,避免 Region 数量过多导致额外开销 #17309 @LykxSassinator
- 支持指定单个 Region 或 TiKV 实例的内存悲观锁的内存上限,在热点写导致大量悲观锁加锁时,可以通过修改配置提高内存上限,避免悲观锁落盘导致的 CPU/IO 开销 #17542 @cfzjywxk
- Raft Engine 新增
spill-dir
配置,支持 Raft 日志的多磁盘存储。当主目录dir
所在磁盘的容量不足时,Raft Engine 会自动将新日志写入spill-dir
,从而确保系统的持续运行 #17356 @LykxSassinator - 优化存在大量 DELETE 版本时 RocksDB 的 compaction 触发机制,以加快磁盘空间回收 #17269 @AndreMouche
- 支持在线更改写入流量控制 (flow-control) 的相关配置 #17395 @glorv
- 优化空表和小 Region 场景下 Region Merge 的速度 #17376 @LykxSassinator
- Pipelined DML 不会长时间阻塞 resolved-ts #17459 @ekexium
PD
TiFlash
- 优化
LENGTH()
和ASCII()
函数执行效率 #9344 @xzhangxian1008 - 减少处理存算分离请求时创建的线程数,避免 TiFlash 计算节点在处理大量请求时崩溃 #9334 @JinheLin
- 改进 Pipeline Model 执行模型下任务的等待机制 #8869 @SeaRise
- 改进 JOIN 算子的取消机制,使得 JOIN 算子内部能及时响应取消请求 #9430 @windtalker
- 优化
Tools
Backup & Restore (BR)
- 当集群的
split-table
和split-region-on-table
配置项为默认值false
时,BR 在恢复数据到该集群的过程中不会按照 table 分裂 Region,以提升恢复速度 #53532 @Leavrth - 默认不支持使用 SQL 语句
RESTORE
全量恢复数据到非空集群 #55087 @BornChanger
- 当集群的
错误修复
TiDB
- 修复当
tidb_restricted_read_only
变量设置为true
时可能死锁的问题 #53822 #55373 @Defined2014 - 修复 TiDB 优雅关闭时不等待 auto commit 事务完成的问题 #55464 @YangKeao
- 修复在 TTL 任务执行过程中,减小
tidb_ttl_delete_worker_count
的值导致任务无法完成的问题 #55561 @lcwangchao - 修复当一张表的索引中包含生成列时,通过
ANALYZE
语句收集这张表的统计信息时可能报错Unknown column 'column_name' in 'expression'
的问题 #55438 @hawkingrei - 废弃统计信息相关的无用配置,减少冗余代码 #55043 @Rustin170506
- 修复执行一条包含关联子查询和 CTE 的查询时,TiDB 可能卡住或返回错误结果的问题 #55551 @guo-shaoge
- 修复禁用
lite-init-stats
可能导致统计信息同步加载失败的问题 #54532 @hawkingrei - 修复当
UPDATE
或DELETE
语句包含递归的 CTE 时,语句可能报错或不生效的问题 #55666 @time-and-fate - 修复当一条 SQL 绑定涉及窗口函数时,有一定概率不生效的问题 #55981 @winoros
- 修复统计信息初始化时,使用非二进制排序规则的字符串类型列的统计信息可能无法正常加载的问题 #55684 @winoros
- 修复当查询条件为
column IS NULL
访问唯一索引时,优化器将行数错误地估算为 1 的问题 #56116 @hawkingrei - 修复当查询包含形如
(... AND ...) OR (... AND ...) ...
的过滤条件时,优化器没有使用最优的多列统计信息估算行数的问题 #54323 @time-and-fate - 修复当一个查询有索引合并 (Index Merge) 执行计划可用时,
read_from_storage
hint 可能不生效的问题 #56217 @AilinKid - 修复
IndexNestedLoopHashJoin
中存在数据竞争的问题 #49692 @solotzg - 修复
INFORMATION_SCHEMA.STATISTICS
表中SUB_PART
值为空的问题 #55812 @Defined2014 - 修复 DML 语句中包含嵌套的生成列时报错的问题 #53967 @wjhuang2016
- 修复带有最小显示宽度的 integer 类型的数据参与除法运算时,可能导致除法结果溢出的问题 #55837 @windtalker
- 修复 TopN 算子之后的算子无法在内存超限时触发回退操作的问题 #56185 @xzhangxian1008
- 修复 Sort 算子中的
ORDER BY
列如果包含常量会卡住的问题 #55344 @xzhangxian1008 - 修复在添加索引期间,kill PD leader 后出现
8223 (HY000)
报错,且表中数据不一致的问题 #55488 @tangenta - 修复当请求历史 DDL 任务信息时,DDL 历史任务过多导致 OOM 的问题 #55711 @joccau
- 修复当 Region 大小超过 96 MiB 时,启动全局排序后执行
IMPORT INTO
卡住的问题 #55374 @lance6716 - 修复在临时表上执行
IMPORT INTO
会导致 TiDB crash 的问题 #55970 @D3Hunter - 修复添加唯一索引出现
duplicate entry
报错的问题 #56161 @tangenta - 修复当 TiKV 停机超过 810 秒后时,TiDB Lightning 未 ingest 所有 KV 对,导致表中数据不一致的问题 #55808 @lance6716
- 修复无法对缓存表使用
CREATE TABLE LIKE
语句的问题 #56134 @tiancaiamao - 修复 CTE 中
FORMAT()
表达式的警告信息混乱的问题 #56198 @dveeden - 修复
CREATE TABLE
与ALTER TABLE
建立分区表时对列的类型限制不一致的问题 #56094 @mjonss - 修复
INFORMATION_SCHEMA.RUNAWAY_WATCHES
表中时间类型不正确的问题 #54770 @HuSharp
- 修复当
TiKV
TiFlash
- 修复当表里含 Bit 类型列并且带有表示非法字符的默认值时,TiFlash 无法解析表 schema 的问题 #9461 @Lloyd-Pottiger
- 修复当多个 Region 并发进行副本同步时,可能错误触发 Region overlap 检查失败而导致 TiFlash panic 的问题 #9329 @CalvinNeo
- 修复一些 TiFlash 不支持的 JSON 函数被错误地下推到 TiFlash 的问题 #9444 @windtalker
Tools
Backup & Restore (BR)
TiDB Data Migration (DM)
TiDB Lightning
- 修复两个实例同时并行开始导入任务时,由于分配到的任务 ID 相同导致 TiDB Lightning 报
verify allocator base failed
错误的问题 #55384 @ei-sugimoto
- 修复两个实例同时并行开始导入任务时,由于分配到的任务 ID 相同导致 TiDB Lightning 报
贡献者
感谢来自 TiDB 社区的贡献者们:
- ei-sugimoto
- eltociear
- guoshouyan(首次贡献者)
- JackL9u
- kafka1991(首次贡献者)
- qingfeng777
- samba-rgb(首次贡献者)
- SeaRise
- tuziemon(首次贡献者)
- xyproto(首次贡献者)