TiDB 7.6.0 Release Notes
发版日期:2024 年 1 月 25 日
TiDB 版本:7.6.0
在 7.6.0 版本中,你可以获得以下关键特性:
分类 | 功能/增强 | 描述 |
---|---|---|
可扩展性与性能 | 跨数据库绑定执行计划 | 在处理上百个 schema 相同的数据库时,针对其中一个数据库的 SQL binding 通常也适用于其它的数据库。例如,在 SaaS 或 PaaS 数据平台中,每个用户通常各自维护单独的数据库,这些数据库具有相同的 schema 并运行着类似的 SQL。在这种情况下,逐一为每个数据库做 SQL 绑定是不切实际的。TiDB v7.6.0 引入跨数据库绑定执行计划,支持在所有 schema 相同的数据库之间匹配绑定计划。 |
BR 快照恢复速度最高提升 10 倍(实验特性) | BR v7.6.0 实验性地引入了粗粒度打散 Region 算法,用于提升集群的快照恢复速度。在 TiKV 节点较多的集群中,该算法可显著提高集群资源利用率,更均匀地分配负载,同时更好地利用每个节点的网络带宽。在一些实际案例中,该特性可将恢复速度最高提升约 10 倍。 | |
建表性能提升 10 倍(实验特性) | 在 v7.6.0 中引入了新的 DDL 架构,批量建表的性能提高了 10 倍。这一重大改进极大地缩短了创建大量表所需的时间。特别是在 SaaS 场景中,快速创建大量表(从数万到数十万不等)是一个常见的挑战,使用该特性能显著提升 SaaS 场景的建表速度。 | |
通过 Active PD Follower 提升 PD Region 信息查询服务的扩展能力(实验特性) | TiDB v7.6.0 实验性地引入了 Active PD Follower 特性,允许 PD follower 提供 Region 信息查询服务。在 TiDB 节点数量较多和 Region 数量较多的集群中,该特性可以提升 PD 集群处理 GetRegion 、ScanRegions 请求的能力,减轻 PD leader 的 CPU 压力。 | |
稳定性与高可用 | 支持 TiProxy(实验特性) | 全面支持 TiProxy,可通过部署工具轻松部署。TiProxy 可以管理和维护客户端与 TiDB 的连接,在滚动重启、升级以及扩缩容过程中保持连接。 |
Data Migration (DM) 正式支持迁移 MySQL 8.0 (GA) | 在 v7.6.0 之前,DM 迁移 MySQL 8.0 仅为实验特性,不能用于生产环境。TiDB v7.6.0 增强了该功能的稳定性、兼容性,可在生产环境帮助你平滑、快速地将数据从 MySQL 8.0 迁移到 TiDB。在 v7.6.0 中,该功能正式 GA。 |
功能详情
可扩展性
通过 Active PD Follower 提升 PD 上 Region 信息查询服务的扩展能力(实验特性)#7431 @CabinfeverB
当集群的 Region 数量较多时,PD leader 处理心跳和调度任务的开销也较大,可能导致 CPU 资源紧张。如果同时集群中的 TiDB 实例数量较多,查询 Region 信息请求并发量较大,PD leader CPU 压力将变得更大,可能会造成 PD 服务不可用。
为确保服务的高可用性,TiDB v7.6.0 引入了 Active PD Follower 特性提升 PD 上 Region 信息查询服务的扩展能力。你可以通过设置系统变量
pd_enable_follower_handle_region
开启 Active PD Follower 特性。启用该特性后,TiDB 在获取 Region 信息时会将请求均匀地发送到所有 PD 节点上,使 PD follower 也可以处理 Region 请求,从而减轻 PD leader 的 CPU 压力。更多信息,请参考用户文档。
性能
BR 快照恢复速度最高提升 10 倍(实验特性)#33937 #49886 @3pointer
随着 TiDB 集群规模的不断扩大,故障时快速恢复集群以减少业务中断时间显得尤为重要。在 v7.6.0 之前的版本中,Region 打散算法是性能恢复的主要瓶颈。在 v7.6.0 中,BR 优化了 Region 打散算法,可以迅速将恢复任务拆分为大量小任务,并批量分散到所有 TiKV 节点上。新的并行恢复算法充分利用每个 TiKV 节点的所有资源,实现了并行快速恢复。在实际案例中,大规模 Region 场景下,集群快照恢复速度最高提升约 10 倍。
目前,新的粗粒度 Region 打散算法为实验特性,你可以配置
br
新增的命令行参数--granularity="coarse-grained"
启用新算法。例如:br restore full \ --pd "${PDIP}:2379" \ --storage "s3://${Bucket}/${Folder}" \ --s3.region "${region}" \ --granularity "coarse-grained" \ --send-credentials-to-tikv=true \ --log-file restorefull.log更多信息,请参考用户文档。
默认开启 Titan 引擎 #16245 @Connor1996 @v01dstar @tonyxuqqi
为了更好地支持 TiDB 宽表写入场景,特别是在支持 JSON 之后,从 TiDB v7.6.0 开始,默认开启 Titan 引擎,自动将超过 32 KB 的大 Value 从 RocksDB 的 LSM Tree 中分离出来,单独存储在 Titan 中,以提升对大 Value 的处理性能。Titan 引擎与 TiKV 所使用的 RocksDB 特性完全兼容。这一变更不仅降低了写入放大效应,在处理大 Value 的写入、更新和点查场景时也表现得更加出色。同时,在 Range Scan 场景下,通过对 Titan 引擎的优化,默认配置下 Titan 引擎的性能测试结果和 RocksDB 基本持平。
该配置的变更对历史版本兼容,已有的 TiDB 集群在升级到 TiDB v7.6.0 或之后版本时,仍会默认保持关闭 Titan 引擎。你可以根据实际的需求手动开启或者关闭 Titan 引擎。
更多信息,请参考用户文档。
支持下推以下字符串函数到 TiKV #48170 @gengliqi
LOWER()
UPPER()
更多信息,请参考用户文档。
新增支持下推以下 JSON 函数到 TiFlash #48350 #48986 #48994 #49345 #49392 @SeaRise @yibin87
JSON_UNQUOTE()
JSON_ARRAY()
JSON_DEPTH()
JSON_VALID()
JSON_KEYS()
JSON_CONTAINS_PATH()
更多信息,请参考用户文档。
建表性能提升 10 倍(实验特性)#49752 @gmhdbjd
在之前的版本里,将上游数据库上万张表迁移到 TiDB 时,TiDB 创建这些表耗时长,效率低。从 v7.6.0 开始,引入了新的 TiDB DDL V2 架构,你可以通过设置系统变量
tidb_ddl_version
开启。相比之前的版本,新版本的 DDL 批量建表性能提升了高达 10 倍,从而大幅减少了建表时间。更多信息,请参考用户文档。
支持周期性全量数据整理(实验特性)#12729 afeinberg
从 v7.6.0 开始,TiDB 支持 TiKV 周期性全量数据整理。该功能可以作为垃圾回收 (GC) 的增强,用以消除冗余的数据版本。在业务活动呈现明显的高峰和低谷的场景中,利用该功能可在系统空闲时段进行数据整理,以提升高峰期间业务处理的性能。
你可以通过配置 TiKV 配置项
periodic-full-compact-start-times
指定启动周期性全量数据整理的时间,并通过periodic-full-compact-start-max-cpu
控制 TiKV 执行周期性全量数据整理时的 CPU 使用率阈值。periodic-full-compact-start-max-cpu
默认是 10%,即为了减少对业务流量的影响,只有当 TiKV 的 CPU 利用率低于 10% 时,才会触发周期性全量数据整理。更多信息,请参考用户文档。
稳定性
在 TiDB 上运行 SaaS 服务时,为了方便数据维护和管理,通常会将每个租户的数据独立存储于不同数据库中,并执行相同的业务逻辑。这导致数百个数据库中存在相同的表和索引定义,执行类似的 SQL 语句。在这种场景下,对一条 SQL 语句的执行计划进行绑定 (SQL Binding) 时,这条绑定通常也适用于其他数据库中的 SQL 语句。
针对这种应用场景,TiDB v7.6.0 引入跨数据库绑定,可以为模式相同的 SQL 语句绑定相同的执行计划,即使这些 SQL 运行在不同的数据库上。创建跨数据库绑定时,需要将数据库名用通配符
*
表示,如下所示。此时,无论t1
和t2
表位于哪个数据库,TiDB 都将尝试使用此绑定来生成执行计划,无需为每个数据库中的 SQL 单独创建绑定。CREATE GLOBAL BINDING FOR USING SELECT /*+ merge_join(t1, t2) */ t1.id, t2.amount FROM *.t1, *.t2 WHERE t1.id = t2.id;此外,跨数据库绑定能有效缓解由于用户数据和负载的不均衡及其快速变化所引发的 SQL 性能问题。通过跨数据库绑定,SaaS 服务商可以固定由拥有大量数据的用户已验证的执行计划,从而固定所有用户的执行计划。对于 SaaS 服务商,该功能提供了显著的便利性和体验提升。
由于跨数据库绑定会带来系统开销(小于 1%),TiDB 默认将其关闭。要使用跨数据库绑定,首先需要开启
tidb_opt_enable_fuzzy_binding
系统变量。更多信息,请参考用户文档。
高可用
支持代理组件 TiProxy(实验特性)#413 @djshow832 @xhebox
TiProxy 是 TiDB 的官方代理组件,位于客户端和 TiDB server 之间,为 TiDB 提供负载均衡、连接保持功能,让 TiDB 集群的负载更加均衡,并在维护操作期间不影响用户对数据库的连接访问。其应用场景如下:
- 在 TiDB 集群进行滚动重启、滚动升级、缩容等维护操作时,TiDB server 会发生变动,导致客户端与发生变化的 TiDB server 的连接中断。通过使用 TiProxy,可以在这些维护操作过程中平滑地将连接迁移至其他 TiDB server,从而让客户端不受影响。
- 所有客户端对 TiDB server 的连接都无法动态迁移至其他 TiDB server。当多个 TiDB server 的负载不均衡时,可能出现整体集群资源充足,但某些 TiDB server 资源耗尽导致延迟大幅度增加的情况。为解决此问题,TiProxy 提供连接动态迁移功能,在客户端无感的前提下,将连接从一个 TiDB server 迁移至其他 TiDB server,从而实现 TiDB 集群的负载均衡。
TiProxy 已集成至 TiUP、TiDB Operator、TiDB Dashboard 等 TiDB 基本组件中,可以方便地进行配置、部署和运维。
更多信息,请参考用户文档。
SQL 功能
LOAD DATA
支持显式事务和回滚 #49079 @ekexium与 MySQL 相比,v7.6.0 之前的
LOAD DATA
语句在不同 TiDB 版本中的事务行为存在差异,导致使用该语句时可能需要额外进行调整。具体来说:在 v4.0.0 之前,每导入 20000 行数据就会进行一次提交。从 v4.0.0 到 v6.6.0,TiDB 默认在一个事务中提交所有行,但也支持通过设置tidb_dml_batch_size
系统变量实现每固定的行数进行一次提交。自 v7.0.0 起,tidb_dml_batch_size
对LOAD DATA
语句不再生效,TiDB 将在一个事务中提交所有行。从 v7.6.0 开始,
LOAD DATA
在事务中与其它普通 DML 的处理方式一致,特别是和 MySQL 的事务行为一致。事务内的LOAD DATA
语句本身不再自动提交当前事务,也不会开启新事务,并且事务内的LOAD DATA
语句可以被显式提交或者回滚。此外,LOAD DATA
语句会受 TiDB 事务模式设置(乐观/悲观)影响。这些改进简化了数据从 MySQL 到 TiDB 的迁移过程,使得数据导入体验更加统一和可控。更多信息,请参考用户文档。
数据库管理
闪回功能支持精确 TSO #48372 @BornChanger
TiDB v7.6.0 提供了更加强大和精确的闪回功能
FLASHBACK CLUSTER
,不仅支持回溯到过去指定的时间点,还可以通过FLASHBACK CLUSTER TO TSO
精确地指定要恢复的 TSO 时间戳,实现更加灵活的数据恢复。例如,与 TiCDC 结合使用时,该功能允许下游 TiDB 集群在暂停数据同步、开启预上线读写测试后,快速且优雅地回溯到暂停同步时的 TSO 时间戳,并继续通过 TiCDC 同步数据,从而简化了预上线验证流程和数据管理。FLASHBACK CLUSTER TO TSO 445494839813079041;更多信息,请参考用户文档。
支持自动终止长时间未提交的空闲事务 #48714 @crazycs520
在网络异常断开或应用程序故障时,
COMMIT
/ROLLBACK
语句可能无法正常传送到数据库。这种情况可能导致数据库锁未能及时释放,进而引起事务锁等待以及数据库连接数快速增加。这类问题在测试环境中较常见,但在线上环境也会偶尔发生,并且有时难以迅速诊断。为有效防止此类问题的发生,TiDB v7.6.0 引入tidb_idle_transaction_timeout
系统变量,可以自动终止长时间运行的空闲事务。当用户会话处于事务状态且空闲时间超过该变量设定的值时,TiDB 会自动强制结束该事务的数据库连接并回滚事务。更多信息,请参考用户文档。
TiDB v7.6.0 简化了创建执行计划绑定的语法。在创建执行计划绑定的命令中无需提供原 SQL 语句,TiDB 可以根据带 hint 的语句识别出对应的原 SQL。这一改进提高了创建执行计划绑定的便利性。例如:
CREATE GLOBAL BINDING USING SELECT /*+ merge_join(t1, t2) */ * FROM t1, t2 WHERE t1.id = t2.id;更多信息,请参考用户文档。
支持动态调整 TiDB 单行记录大小限制 #49237 @zyguan
在 v7.6.0 之前,事务中单行记录的大小受 TiDB 配置项
txn-entry-size-limit
限制。如果单行记录的大小超出此限制,TiDB 将返回entry too large
错误。此时,用户需要修改 TiDB 配置文件并重启 TiDB 才能够生效。为降低用户的管理成本,TiDB v7.6.0 新增系统变量tidb_txn_entry_size_limit
,支持动态修改txn-entry-size-limit
配置项的值。该变量的默认值为0
,表示默认使用txn-entry-size-limit
配置项的值作为限制。当设置为非0
值时,TiDB 优先使用该变量的值作为事务中的单行记录大小的限制。这一改进旨在提高用户调整系统配置的灵活性,无需重启 TiDB 即可生效。更多信息,请参考用户文档。
BR 默认恢复用户账号等系统表数据 #48567 @BornChanger #49627 @Leavrth
从
br
v5.1.0 开始,快照备份时默认自动备份 mysql schema 下的系统表数据,但恢复数据时默认不恢复系统表数据。在 v6.2.0 中,br
增加恢复参数--with-sys-table
支持恢复数据的同时恢复部分系统表相关数据,提供更多的操作灵活性。为了进一步降低用户的管理成本,并提供更直观的默认行为。从 v7.6.0 开始,
br
默认开启恢复参数--with-sys-table
。这意味着br
默认支持恢复数据的同时恢复部分系统表相关数据,特别是用户账号和表的统计信息数据。这一改进旨在使备份恢复操作更加直观,减轻手动配置的负担,从而提升整体的操作体验。更多信息,请参考用户文档。
可观测性
增强资源管控相关的观测性 #49318 @glorv @bufferflies @nolouch
随着越来越多用户利用资源组对业务应用进行隔离,资源管控提供了更丰富的基于资源组的数据,协助你观测资源组负载、资源组设置,确保出现问题时能够快速发现并精准诊断。其中包括:
- 慢查询日志增加资源组名称、RU 消耗、以及等待资源耗时。
- Statement Summary Tables 增加资源组名称、RU 消耗、以及等待资源耗时。
- 在变量
tidb_last_query_info
中增加了 SQL 的 RU 消耗信息ru_consumption
,你可以利用此变量获取会话中上一条语句的资源消耗。 - 增加基于资源组的数据库指标:QPS/TPS、执行时间 (P999/P99/P95)、失败次数、连接数。
- 增加系统表
request_unit_by_group
记录资源组每天的历史资源消耗。
更多信息,请参考慢查询日志、Statement Summary Tables、资源管控 (Resource Control) 监控指标详解。
数据迁移
Data Migration (DM) 支持迁移 MySQL 8.0 的功能成为正式功能(GA)#10405 @lyzx2001
之前 DM 迁移 MySQL8.0 仅为实验特性,不能用于生产环境。TiDB v7.6.0 增强了该功能的稳定性、兼容性,可在生产环境帮助你平滑、快速地将数据从 MySQL 8.0 迁移到 TiDB。在 v7.6.0 中,该功能正式 GA。
更多信息,请参考用户文档。
TiCDC 支持通过双向复制模式 (Bi-Directional Replication, BDR) 同步 DDL 语句(实验特性)#10301 #48519 @okJiang @asddongmen
从 v7.6.0 开始,TiCDC 支持在配置了双向复制的情况下同步 DDL 语句。以前,TiCDC 不支持复制 DDL 语句,因此要使用 TiCDC 双向复制必须将 DDL 语句分别应用到两个 TiDB 集群。有了该特性,TiCDC 可以为一个集群分配
PRIMARY
BDR role,并将该集群的 DDL 语句复制到下游集群。更多信息,请参考用户文档。
TiCDC 支持查询 changefeed 的下游同步状态 #10289 @hongyunyan
从 v7.6.0 起,TiCDC 引入了一个新的 API
GET /api/v2/changefeed/{changefeed_id}/synced
,用于查询指定同步任务 (changefeed) 的下游同步状态。通过此 API,你可以判断 TiCDC 是否已将所接收到的上游数据完全同步到下游。更多信息,请参考用户文档。
TiCDC 支持将 CSV 格式中的 delimiter 设置为 3 个字符 #9969 @zhangjinpeng87
从 v7.6.0 开始,你可以将 TiCDC 输出的 CSV 格式中的 delimiter 设置为 1 到 3 个字符。例如,你可以指定 TiCDC 使用 2 个字符的 delimiter(例如
||
或$^
)或 3 个字符的 delimiter(例如|@|
)分隔字段。更多信息,请参考用户文档。
兼容性变更
MySQL 兼容性
- 在 TiDB v7.6.0 之前,
LOAD DATA
操作在一个事务中提交所有行,或者以批量方式提交事务,和 MySQL 的行为略有不同。从 TiDB v7.6.0 开始,LOAD DATA
的事务行为与 MySQL 的事务行为一致,包括事务内的LOAD DATA
语句本身不再自动提交当前事务,也不会开启新事务,并且事务内的LOAD DATA
语句可以被显式提交或者回滚。此外,LOAD DATA
语句会受 TiDB 事务模式设置(乐观/悲观)影响。#49079 @ekexium
系统变量
变量名 | 修改类型 | 描述 |
---|---|---|
tidb_auto_analyze_partition_batch_size | 修改 | 经进一步的测试后,该变量默认值从 1 修改为 128 。 |
tidb_sysproc_scan_concurrency | 修改 | 在大规模集群里,scan 操作的并发度可以调整的更高,以满足 ANALYZE 的需要,因此将该变量最大值由 256 修改为 4294967295 。 |
tidb_analyze_distsql_scan_concurrency | 新增 | 用于设置执行 ANALYZE 时 scan 操作的并发度。默认值为 4 。 |
tidb_ddl_version | 新增 | 用于控制是否开启 TiDB DDL V2。将该变量的值设置为 2 可以开启该功能,设置为 1 关闭该功能。默认值为 1 。开启后,将使用新版本的实现执行 DDL 语句。TiDB DDL V2 对 DDL 功能做了提升,建表 DDL 的执行速度相比 V1 版本提升 10 倍。 |
tidb_enable_global_index | 新增 | 用于控制是否支持对分区表创建 Global index 。默认值为 OFF 。Global index 当前正处于开发阶段,不推荐修改该变量值。 |
tidb_idle_transaction_timeout | 新增 | 用来控制用户会话中事务的空闲超时。当用户会话处于事务状态且空闲时间超过该变量设定的值时,会话会被 Kill 掉。默认值 0 表示没有时间限制。 |
tidb_opt_enable_fuzzy_binding | 新增 | 用于控制是否开启跨数据库绑定执行计划功能,默认值 OFF 表示关闭。 |
tidb_txn_entry_size_limit | 新增 | 用于动态修改 TiDB 配置项 performance.txn-entry-size-limit ,即限制 TiDB 单行数据的大小。默认值为 0 ,表示默认使用配置项的值。当设置为非 0 值时,优先使用该变量的值作为 txn-entry-size-limit 的值。 |
pd_enable_follower_handle_region | 新增 | 用于控制是否开启 Active PD Follower(实验特性)。当该值为 OFF 时,TiDB 仅从 PD leader 获取 Region 信息。当该值为 ON 时,TiDB 在获取 Region 信息时会将请求均匀地发送到所有 PD 节点上,因此 PD follower 也可以处理 Region 信息请求,从而减轻 PD leader 的 CPU 压力。 |
配置文件参数
配置文件 | 配置项 | 修改类型 | 描述 |
---|---|---|---|
TiDB | tls-version | 修改 | 默认值为空,TiDB 默认支持的 TLS 版本从 TLS1.1 及更高提升为 TLS1.2 及更高。 |
TiKV | blob-file-compression | 修改 | 设置 Titan 中 value 所使用的压缩算法。从 v7.6.0 开始,默认采用 zstd 压缩算法。 |
TiKV | rocksdb.defaultcf.titan.min-blob-size | 修改 | 从 TiDB v7.6.0 开始,新建集群默认值为 32KB 。对于已有集群升级到 v7.6.0 版本的情况,默认值为 1KB 保持不变。 |
TiKV | rocksdb.titan.enabled | 修改 | 开启 Titan 开关。v7.5.0 及更早的版本默认值为 false 。从 v7.6.0 开始,新建集群默认值是 true ,已有集群升级到 v7.6.0 或更高版本则会维持原有的配置。 |
TiKV | gc.num-threads | 新增 | 设置当 enable-compaction-filter 为 false 时 GC 的线程个数。默认值为 1 。 |
TiKV | raftstore.periodic-full-compact-start-times | 新增 | 设置 TiKV 启动周期性全量数据整理 (Compaction) 的时间。默认值 [] 表示默认情况下禁用周期性全量数据整理。 |
TiKV | raftstore.periodic-full-compact-start-max-cpu | 新增 | 设置 TiKV 执行周期性全量数据整理时的 CPU 使用率阈值,默认值为 0.1 。 |
TiKV | zstd-dict-size | 新增 | 指定 zstd 字典大小,默认值为 0KB ,表示关闭 zstd 字典压缩。 |
TiFlash | logger.level | 修改 | 为减少日志打印的开销,默认值由 "debug" 改为 "INFO" 。 |
TiDB Lightning | tidb.pd-addr | 修改 | 配置 PD Server 的地址,从 v7.6.0 开始支持设置多个地址。 |
TiDB Lightning | block-size | 新增 | 控制物理导入模式 (backend='local' ) 中本地文件排序的 I/O 区块大小。默认值为 16KiB 。当 IOPS 成为瓶颈时,可以调大该参数的值以缓解磁盘 IOPS,从而提升数据导入性能。 |
BR | --granularity | 新增 | 通过设置 --granularity="coarse-grained" 启用粗粒度的 Region 打散算法(实验特性)进行恢复,加快大规模 Region 场景下的 Region 恢复速度。 |
TiCDC | compression | 新增 | 设置 redo log 文件的压缩行为。 |
TiCDC | sink.cloud-storage-config | 新增 | 设置同步数据到对象存储时自动清理历史数据的功能。 |
系统表
- 新增系统表
INFORMATION_SCHEMA.KEYWORDS
用来展示 TiDB 支持的所有关键字的信息。 - 在系统表
INFORMATION_SCHEMA.SLOW_QUERY
中增加了以下资源管控 (Resource Control) 相关的字段:Resource_group
:语句执行所绑定的资源组。Request_unit_read
:执行语句消耗的总读 RU。Request_unit_write
:执行语句消耗的总写 RU。Time_queued_by_rc
:执行语句过程中等待可用资源的总耗时。
离线包变更
从 v7.6.0 开始,TiDB-community-server
二进制软件包中新增代理组件 TiProxy 的安装包 tiproxy-{version}-linux-{arch}.tar.gz
。
废弃功能
- TiDB v7.6.0 废弃了对 TLSv1.0 和 TLSv1.1 协议的支持,并将从 TiDB v8.0.0 开始移除对这两个协议的支持。请升级 TLS 至 TLSv1.2 或 TLSv1.3。
- 执行计划的自动演进绑定(实验特性)将从 TiDB v8.0.0 开始废弃,等同的功能将会在后续版本中重新设计。
- 系统变量
tidb_disable_txn_auto_retry
将从 TiDB v8.0.0 开始废弃,废弃后将不再支持乐观事务的自动重试。
改进提升
TiDB
- 当使用非二进制排序规则并且查询条件中包含
LIKE
时,优化器可以生成 IndexRangeScan 以提升执行效率 #48181 #49138 @time-and-fate - 增强特定情况下
OUTER JOIN
转INNER JOIN
的能力 #49616 @qw4990 - 提升分布式执行框架任务在节点重启场景下的均衡性 #47298 @ywqzzy
- 允许多个快速加索引 DDL 任务排队执行,而非回退为普通加索引任务 #47758 @tangenta
- 增强
ALTER TABLE ... ROW_FORMAT
的兼容性 #48754 @hawkingrei - 将
CANCEL IMPORT JOB
命令调整为同步命令 #48736 @D3Hunter - 提升空表加索引的速度 #49682 @zimulala
- 当关联子查询的列未被上层算子引用时,可以直接消除该关联子查询 #45822 @King-Dylan
EXCHANGE PARTITION
操作会触发统计信息的维护更新 #47354 @hi-rustin- TiDB 支持构建符合联邦信息处理标准 (FIPS) 要求的二进制文件 #47948 @tiancaiamao
- 改进 TiDB 在处理部分类型转换时的实现,并修复相关问题 #47945 #47864 #47829 #47816 @YangKeao @lcwangchao
- 在获取 schema 版本时,默认使用 KV timeout 特性读取,减少 meta Region leader 读取慢对 schema 版本更新的影响 #48125 @cfzjywxk
- 当使用非二进制排序规则并且查询条件中包含
TiKV
PD
TiFlash
- 降低磁盘性能抖动对读取延迟的影响 #8583 @JaySon-Huang
- 减少后台数据 GC 任务对读、写任务延迟的影响 #8650 @JaySon-Huang
- 支持在存算分离架构下通过合并相同数据的读取操作,提升多并发下的数据扫描性能 #6834 @JinheLin
- 优化
JOIN ON
条件中仅包含 JOIN KEY 等值条件时,半连接 (SEMI JOIN ) 及 LEFT OUTER SEMIJOIN 的执行性能 #47424 @gengliqi
Tools
Backup & Restore (BR)
TiCDC
- 通过增加并行,优化了 TiCDC 同步数据到对象存储的性能 #10098 @CharlesCheung96
- 支持通过在
sink-uri
中设置content-compatible=true
使 TiCDC Canal-JSON 兼容 Canal 官方输出的内容格式 #10106 @3AceShowHand
TiDB Data Migration (DM)
TiDB Lightning
- 支持配置多个 PD 地址以增强稳定性 #49515 @mittalrishabh
- 支持通过配置参数
block-size
来控制 TiDB Lightning 本地文件排序的 I/O 区块大小,提升数据导入性能 #45037 @mittalrishabh
错误修复
TiDB
- 修复 TiDB panic 并报错
invalid memory address or nil pointer dereference
的问题 #42739 @CbcWestwolf - 修复当 DDL
jobID
恢复为 0 时 TiDB 节点 panic 的问题 #46296 @jiyfhust - 修复某些情况下相同的查询计划拥有不同的
PLAN_DIGEST
的问题 #47634 @King-Dylan - 修复
UNION ALL
第一个子节点是 DUAL Table 时,执行可能报错的问题 #48755 @winoros - 修复当
tidb_max_chunk_size
值较小时,包含公共表表达式 (CTE) 的查询出现runtime error: index out of range [32] with length 32
错误的问题 #48808 @guo-shaoge - 修复使用
AUTO_ID_CACHE=1
时 Goroutine 泄漏的问题 #46324 @tiancaiamao - 修复 MPP 计算
COUNT(INT)
时结果可能出错的问题 #48643 @AilinKid - 修复当分区列类型为
DATETIME
时,执行ALTER TABLE ... LAST PARTITION
失败的问题 #48814 @crazycs520 - 修复数据中包含后导空格时,在
LIKE
中使用_
通配符可能会导致查询结果出错的问题 #48983 @time-and-fate - 修复
tidb_server_memory_limit
导致内存长期压力较高时,TiDB CPU 利用率过高的问题 #48741 @XuHuaiyu - 修复
ENUM
类型列作为 join 键时,查询结果错误的问题 #48991 @winoros - 修复当内存使用超限时包含 CTE 的查询非预期卡住的问题 #49096 @AilinKid
- 修复 TiDB server 在使用企业插件审计日志时可能占用大量资源的问题 #49273 @lcwangchao
- 修复特定情况下优化器将 TiFlash 选择路径错误转化为 DUAL Table 的问题 #49285 @AilinKid
- 修复包含递归 (
WITH RECURSIVE
) CTE 的UPDATE
或DELETE
语句可能会产生错误结果的问题 #48969 @winoros - 修复包含 IndexHashJoin 算子的查询由于内存超过
tidb_mem_quota_query
而卡住的问题 #49033 @XuHuaiyu - 修复在非严格模式下 (
sql_mode = ''
),INSERT
过程中产生截断仍然会报错的问题 #49369 @tiancaiamao - 修复 CTE 查询在重试过程中可能会报错
type assertion for CTEStorageMap failed
的问题 #46522 @tiancaiamao - 修复在嵌套的
UNION
查询中LIMIT
和ORDER BY
可能无效的问题 #49377 @AilinKid - 修复在解析
ENUM
或SET
类型的非法值时会导致 SQL 语句报错的问题 #49487 @winoros - 修复构造统计信息时因为 Golang 隐式转换算法导致统计信息误差过大的问题 #49801 @qw4990
- 修复在某些时区下夏令时显示有误的问题 #49586 @overvenus
- 修复在有大量表时,
AUTO_ID_CACHE=1
的表可能造成 gRPC 客户端泄漏的问题 #48869 @tiancaiamao - 修复 TiDB server 在优雅关闭 (graceful shutdown) 时可能 panic 的问题 #36793 @bb7133
- 修复
ADMIN RECOVER INDEX
在处理包含CommonHandle
的表时报错ERROR 1105
的问题 #47687 @Defined2014 - 修复执行
ALTER TABLE t PARTITION BY
时指定 Placement Rules 报错ERROR 8239
的问题 #48630 @mjonss - 修复
INFORMATION_SCHEMA.CLUSTER_INFO
中START_TIME
列类型不合理的问题 #45221 @dveeden - 修复
INFORMATION_SCHEMA.COLUMNS
中EXTRA
列类型不合理导致报错Data Too Long, field len 30, data len 45
的问题 #42030 @tangenta - 修复
IN (...)
语句导致INFORMATION_SCHEMA.STATEMENTS_SUMMARY
中的PLAN_DIGEST
不同的问题 #33559 @King-Dylan - 修复
TIME
类型转换为YEAR
类型时,返回的结果混合了TIME
和年份的问题 #48557 @YangKeao - 修复关闭
tidb_enable_collect_execution_info
导致 Coprocessor Cache panic 的问题 #48212 @you06 - 修复
shuffleExec
意外退出导致 TiDB 崩溃的问题 #48230 @wshwsh12 - 修复静态
CALIBRATE RESOURCE
依赖 Prometheus 数据的问题 #49174 @glorv - 修复在日期中加上数值较大的 Interval 时返回错误结果的问题。修复后,带有无效前缀或字符串
true
的 Interval 将被视为零值,与 MySQL 8.0 保持一致 #49227 @lcwangchao - 修复
ROW
函数对null
类型推断有误导致意外报错的问题 #49015 @wshwsh12 - 修复在某些情况下
ILIKE
函数可能导致数据竞争的问题 #49677 @lcwangchao - 修复由于
STREAM_AGG()
错误处理 CI 导致查询结果有误的问题 #49902 @wshwsh12 - 修复将字节转换为
TIME
时出现编码失败的问题 #47346 @wshwsh12 - 修复
CHECK
约束的ENFORCED
选项的行为与 MySQL 8.0 不一致的问题 #47567 #47631 @jiyfhust - 修复
CHECK
约束的 DDL 卡住的问题 #47632 @jiyfhust - 修复由于内存不足导致 DDL 快速加索引失败的问题 #47862 @GMHDBJD
- 修复在执行加索引的过程中升级集群可能导致数据与索引不一致的问题 #46306 @zimulala
- 修复更新
tidb_mem_quota_query
系统变量后执行ADMIN CHECK
报错ERROR 8175
的问题 #49258 @tangenta - 修复
ALTER TABLE
修改外键引用列的类型时,DECIMAL
精度发生变化没有报错的问题 #49836 @yoshikipom - 修复
ALTER TABLE
修改外键引用列的类型时,INTEGER
长度发生变化误报错的问题 #47702 @yoshikipom - 修复某些场景下表达式索引没有发现除数是 0 的问题 #50053 @lcwangchao
- 缓解当要处理的表的数量过多时,TiDB 节点 OOM 的问题 #50077 @zimulala
- 修复集群滚动重启时 DDL 卡在运行中状态的问题 #50073 @tangenta
- 修复使用
PointGet
或BatchPointGet
算子访问分区表的全局索引时,结果可能出错的问题 #47539 @L-maple - 修复当生成列上的索引设置为可见时,可能无法选中 MPP 计划的问题 #47766 @AilinKid
- 修复
LIMIT
可能无法推入到OR
类型的Index Merge
的问题 #48588 @AilinKid - 修复 BR 导入后,
mysql.bind_info
表中可能存在重复的内置 (builtin) 行的问题 #46527 @qw4990 - 修复删除分区后,分区表的统计信息更新行为不合理的问题 #48182 @hi-rustin
- 修复并发合并分区表的全局统计信息时可能遇到报错的问题 #48713 @hawkingrei
- 修复在具有补齐空格 (PADDING SPACE) 的列上使用
LIKE
运算符进行索引范围扫描时,查询结果可能出错的问题 #48821 @time-and-fate - 修复生成列可能触发对内存的并发读写导致数据竞争的问题 #44919 @tangenta
- 修复当指定
WITH 0 TOPN
(即不收集 TopN 的统计信息)时,ANALYZE TABLE
仍然可能收集 Top1 的统计信息的问题 #49080 @hawkingrei - 修复不合法的优化器 hint 可能会导致合法 hint 不生效的问题 #49308 @hawkingrei
- 修复对 Hash 类型的分区表进行分区的增删重组或
TRUNCATE
操作时,统计信息没有对应更新的问题 #48235 #48233 #48226 #48231 @hi-rustin - 修复设置统计信息自动更新的时间窗口后,时间窗口外统计信息仍然可能更新的问题 #49552 @hawkingrei
- 修复从分区表转为非分区表时,旧统计信息不会自动删除的问题 #49547 @hi-rustin
- 修复当使用
TRUNCATE TABLE
清空非分区表的数据时,旧统计信息不会自动删除的问题 #49663 @hi-rustin - 修复当查询使用了会强制排序的优化器 hint(例如
STREAM_AGG()
)且其执行计划包含IndexMerge
时,强制排序可能会失效的问题 #49605 @AilinKid - 修复直方图的边界包含
NULL
时,直方图统计信息可能无法解析成可读字符串的问题 #49823 @AilinKid - 修复查询语句包含
GROUP_CONCANT(ORDER BY)
语法时,执行可能出错的问题 #49986 @AilinKid - 修复当未使用严格的
SQL_MODE
时,UPDATE
、DELETE
、INSERT
语句返回溢出错误而非警告的问题 #49137 @YangKeao - 修复当表中存在由多值索引和非
BINARY
类型字符串组成的复合索引时,数据无法插入的问题 #49680 @YangKeao - 修复多级嵌套的
UNION
查询中LIMIT
无效的问题 #49874 @Defined2014 - 修复当使用
BETWEEN ... AND ...
条件查询分区表时结果有误的问题 #49842 @Defined2014 - 修复无法在
REPLACE INTO
语句中使用 hint 的问题 #34325 @YangKeao - 修复在查询 Hash 分区表时 TiDB 可能选择错误的分区导致结果有误的问题 #50044 @Defined2014
- 修复使用 MariaDB Connector/J 并配置启用压缩时发生连接错误的问题 #49845 @onlyacat
- 修复 TiDB panic 并报错
TiKV
- 修复损坏的 SST 文件可能会扩散到其他 TiKV 节点导致 panic 的问题 #15986 @Connor1996
- 修复 Online Unsafe Recovery 时无法处理 merge abort 的问题 #15580 @v01dstar
- 修复扩容时可能导致 DR Auto-Sync 的 joint state 超时问题 #15817 @Connor1996
- 修复 Titan
blob-run-mode
无法在线更新的问题 #15978 @tonyxuqqi - 修复 Resolved TS 可能被阻塞两小时的问题 #11847 #15520 #39130 @overvenus
- 修复在 Flashback 时遇到
notLeader
或regionNotFound
时卡住的问题 #15712 @HuSharp - 修复如果 TiKV 运行极慢,在 Region Merge 之后可能 panic 的问题 #16111 @overvenus
- 修复 GC 扫描过期 lock 时无法读取内存悲观锁的问题 #15066 @cfzjywxk
- 修复 Titan 监控中 blob 文件大小不正确的问题 #15971 @Connor1996
- 修复 TiCDC 同步大表可能导致 TiKV OOM 的问题 #16035 @overvenus
- 修复 TiDB 和 TiKV 处理
DECIMAL
算术乘法截断时结果不一致的问题 #16268 @solotzg - 修复
cast_duration_as_time
可能返回错误结果的问题 #16211 @gengliqi - 修复巴西和埃及时区转换错误的问题 #16220 @overvenus
- 修复 gRPC threads 在检查
is_shutdown
时可能出现 panic 的问题 #16236 @pingyu
PD
- 修复 PD 内 etcd 健康检查没有移除过期地址的问题 #7226 @iosmanthus
- 修复 PD Leader 切换且新 Leader 与调用方之间存在网络隔离时,调用方不能正常更新 Leader 信息的问题 #7416 @CabinfeverB
- 将 Gin Web Framework 的版本从 v1.8.1 升级到 v1.9.1 以修复部分安全问题 #7438 @niubell
- 修复在不满足副本数量需求时,删除 orphan peer 的问题 #7584 @bufferflies
TiFlash
- 修复当查询遇到内存限制后发生内存泄漏的问题 #8447 @JinheLin
- 修复在执行
FLASHBACK DATABASE
后 TiFlash 副本的数据仍会被 GC 回收的问题 #8450 @JaySon-Huang - 修复慢查询导致内存使用显著增加的问题 #8564 @JinheLin
- 修复在
CREATE TABLE
、DROP TABLE
频繁执行的场景下,部分 TiFlash 副本数据无法通过RECOVER TABLE
或FLASHBACK TABLE
恢复的问题 #1664 @JaySon-Huang - 修复在查询带有类似
ColumnRef in (Literal, Func...)
的过滤条件时,查询结果出错的问题 #8631 @Lloyd-Pottiger - 修复在 TiDB 执行并发 DDL 遇到冲突时 TiFlash panic 的问题 #8578 @JaySon-Huang
- 修复存算分离架构下,可能无法正常选出对象存储数据 GC owner 的问题 #8519 @JaySon-Huang
- 修复 lowerUTF8/upperUTF8 不允许大小写字符占据不同字节数的错误 #8484 @gengliqi
- 修复 TiFlash 错误处理
ENUM
偏移量为 0 的问题 #8311 @solotzg - 修复表达式
INET_NTOA()
中的兼容性问题 #8211 @solotzg - 修复在 stream 读时扫描多个分区表可能导致潜在的 OOM 问题 #8505 @gengliqi
- 修复成功执行的短查询打印过多信息日志的问题 #8592 @windtalker
- 修复 TiFlash 在停止时可能崩溃的问题 #8550 @guo-shaoge
- 修复
GREATEST
或LEAST
函数在包含常量字符串参数时,可能发生的随机无效内存访问的问题 #8604 @windtalker
Tools
Backup & Restore (BR)
- 修复生成外部存储文件 URI 错误的问题 #48452 @3AceShowHand
- 修复在任务初始化阶段出现与 PD 的连接错误导致日志备份任务虽然启动但无法正常工作的问题 #16056 @YuJuncen
- 修复日志备份任务可能出现内存泄露以及备份任务启动后无法正常运行的问题 #16070 @YuJuncen
- 修复 PITR 恢复过程中插入数据到系统表
mysql.gc_delete_range
出错的问题 #49346 @Leavrth - 修复从旧版本的备份恢复数据时报错
Unsupported collation
的问题 #49466 @3pointer - 修复在部分场景下通过快照恢复用户表后权限更新不及时的问题 #49394 @Leavrth
TiCDC
- 修复某些场景下在同步
DELETE
语句时,WHERE
条件没有采用主键作为条件的问题 #9812 @asddongmen - 修复同步数据到对象存储时,可能会出现 TiCDC Server panic 的问题 #10137 @sdojjy
- 修复
kv-client
初始化过程中可能出现数据竞争的问题 #10095 @3AceShowHand - 修复在某些特殊场景下,TiCDC 错误地关闭与 TiKV 的连接的问题 #10239 @hicqu
- 修复上游在执行有损 DDL 时,TiCDC Server 可能 panic 的问题 #9739 @hicqu
- 修复数据同步到下游 MySQL 时可能出现
checkpoint-ts
卡住的问题 #10334 @zhangjinpeng87
- 修复某些场景下在同步
TiDB Data Migration (DM)
贡献者
感谢来自 TiDB 社区的贡献者们:
- 0o001(首次贡献者)
- bagechengzi(首次贡献者)
- feran-morgan-pingcap(首次贡献者)
- highpon
- jiyfhust
- L-maple
- lkshminarayanan(首次贡献者)
- lyang24(首次贡献者)
- mittalrishabh
- morgo
- nkg-(首次贡献者)
- onlyacat
- shawn0915
- Smityz
- szpnygo(首次贡献者)
- ub-3(首次贡献者)
- xiaoyawei(首次贡献者)
- yorkhellen
- yoshikipom(首次贡献者)
- Zheaoli