TiDB 6.3.0 Release Notes
TiDB 版本:6.3.0-DMR
试用链接:快速体验 |
在 6.3.0-DMR 版本中,你可以获得以下关键特性:
- TiKV 静态加密支持国密算法 SM4。
- TiDB 支持基于国密算法 SM3 插件的身份验证。
- SQL 语句 和
ALTER USER
支持ACCOUNT LOCK/UNLOCK
选项。 - JSON 数据类型和 JSON 函数 GA。
- TiDB 支持 Null-Aware Anti Join。
- TiDB 提供 SQL 查询执行时间的细粒度指标。
- 分区表新增简化 Range 分区的语法糖。
- Range COLUMNS 分区方式支持定义多列。
- TiDB 添加索引的速度提升为原来的 3 倍。
- 降低资源消耗型查询对轻量查询响应时间的影响超 50%。
新增简化 Range 分区定义的语法糖 (syntactic sugar) Range INTERVAL 分区特性(实验特性)#35683 @
提供了新的定义 Range 分区的方式 Range INTERVAL 分区,不需要枚举所有分区,可大幅度缩短现有 Range 分区表定义语句冗长的书写方式。语义与原有 Range 分区等价。
Range COLUMNS 分区方式支持定义多列 @mjonss
支持 ,
column_list
不再限定为单一列,基本功能与 MySQL 等同。分区表 EXCHANGE PARTITION 功能 GA @ymkzpx
新增支持下推两个 至 TiFlash #5579 @
LEAD()
LAG()
提供轻量级元数据锁,提升 DDL 变更过程 DML 的成功率(实验特性)#37275 @
在 TiDB 中,对元数据对象的更改采用的是在线异步变更算法。事务在执行时会获取开始时对应的元数据快照。如果事务执行过程中相关表上发生了元数据的更改,为了保证数据的一致性,TiDB 会返回
Information schema is changed
的错误,导致用户事务提交失败。为了解决这个问题,在 TiDB v6.3.0 中,online DDL 算法中引入了元数据锁特性。通过协调表元数据变更过程中 DML 语句和 DDL 语句的优先级,让执行中的 DDL 语句等待持有旧版本元数据的 DML 语句提交,尽可能避免 DML 语句报错。提升添加索引的性能,减少对 DML 事务的影响(实验特性) @benjamin2037
TiDB v6.3.0 支持开启功能,提升了创建索引回填过程的速度。开启该功能后,TiDB 添加索引的性能提升约为原来的 3 倍。
安全
TiKV 静态加密支持国密算法 SM4 @jiayang-zheng
TiKV 的静态加密新增 ,用户在配置静态加密时,可将
data-encryption-method
参数设为sm4-ctr
,以启用基于国密算法 SM4 的静态加密能力。TiDB 支持国密算法 SM3 的身份验证 #36192 @
TiDB 身份验证新增基于国密算法 SM3 的插件 tidb_sm3_password,启用此插件后,用户密码将通过 SM3 进行加密存储和验证。
TiDB-JDBC 支持国密算法 SM3 的身份验证 @lastincisor
用户密码的身份验证需要客户端的支持,现在 ,你可以使用国密算法 SM3 的身份验证能力通过 TiDB-JDBC 连接到 TiDB。
可观测性
提供 TiDB SQL 查询执行时间的细粒度指标 @cfzjywxk
TiDB v6.3.0 提供了细粒度的数据指标,用于。通过完整且细分的指标数据,可以清晰地了解 SQL 查询主要的时间消耗,从而快速发现关键问题,节省故障诊断的时间。
增强慢日志和
TRACE
语句的输出 #34106 @TiDB v6.3.0 增强了慢日志的内容和
TRACE
的输出。你可以观测到 SQL 语句执行过程中,从 TiDB 解析到 KV RocksDB 落盘全链路的延迟数据,进一步增强 TiDB 的诊断能力。TiDB Dashboard 中显示死锁的历史记录 @cfzjywxk
从 v6.3.0 起,死锁的历史记录将添加到 TiDB Dashboard。当你通过 TiDB Dashboard 的慢日志等手段发现某些 SQL 等待锁的时间较长时,可以分析 TiDB Dashboard 上的死锁历史记录来定位问题,提升了诊断的易用性。
性能
TiFlash 调整 FastScan 功能使用方式(实验特性)#5252 @
TiFlash 从 v6.2.0 版本开始引入的快速扫描功能 (FastScan),性能上符合预期,但是使用方式上不够灵活。因此,TiFlash 在 v6.3.0 版本调整 FastScan 功能的使用方式:废弃了
ALTER TABLE ...SET TiFLASH MODE ...
语法启用方式,改为使用系统变量 进行控制。从 v6.2.0 版本升级到 v6.3.0 版本时,在 v6.2.0 版本的 FastScan 设置将失效,但不影响数据的正常读取。你需要重新使用变量方式设置 FastScan。从 v6.2.0 及更早版本升级到 v6.3.0 时,所有会话默认不开启 FastScan 功能,而是保持一致性的数据扫描功能。
TiFlash 优化提升多并发场景下的数据扫描性能 #5376 @
TiFlash 通过合并相同数据的读取操作,减少了对相同数据的重复读取,优化了多并发任务情况下的资源开销,提升多并发下的数据扫描性能。避免了以往在多并发任务下,如果涉及相同数据,同一份数据需要在每个任务中分别进行读取的情况,以及可能出现在同一时间内对同一份数据进行多次读取的情况。
该功能在 v6.2.0 版本以实验特性发布,在 v6.3.0 版本作为正式功能发布。
TiFlash 副本同步性能优化 @breezewish
TiFlash 针对单个
COUNT(DISTINCT)
进行三阶段聚合 @fixdbTiFlash 将有且仅有单个
COUNT(DISTINCT)
聚合的查询改写为,从而提高并发度,并提升性能。TiKV 支持日志回收 #214 @
TiKV Raft Engine 支持日志回收功能。该特性能够显著降低网络磁盘上 Raft 日志追加过程中的长尾延迟,提升了 TiKV 写入负载下的性能。
TiDB 支持 Null-Aware Anti Join @Arenatlx
TiDB v6.3.0 引入了新的连接类型 。NAAJ 在处理集合操作时能够感知集合是否为空,或是否有空值,优化了
IN
和= ANY
等操作的执行效率,提升 SQL 性能。增加优化器 hint 控制哈希连接的驱动端 #35439 @
在 v6.3.0 版本中,优化器引入了两个新的 hint,HASH_JOIN_BUILD() 和 HASH_JOIN_PROBE(),用于隐式地指定哈希连接的行为,同时分别指定哈希连接的构建端和探测端。如果优化器未选到最优执行计划,可以使用这两个 hint 来干预执行计划。
允许在会话级别内联展开公共表表达式 (CTE) @elsa0520
在 v6.2.0 中,引入了优化器提示
MERGE
,允许对 CTE 内联进行展开,使得 CTE 查询结果的消费者能够在 TiFlash 内并行执行。在 v6.3.0 中,又进一步添加了会话级变量 ,允许在会话中修改这个行为,提升了易用性。
悲观事务可以延迟唯一约束检查 @ekexium
你可以通过系统变量 来控制悲观事务中唯一约束检查的时间点。该变量默认关闭。当开启该变量时(设为
ON
),TiDB 会将悲观事务中的加锁操作和唯一约束检测推迟到必要的时候进行,以此提升批量 DML 操作的性能。优化 Read-Committed 隔离级别中对 TSO 的获取 @TonsnakeLin
在 Read-Committed 隔离级别中,引入新的系统变量 控制语句对 TSO 的获取方式。在 Plan Cache 命中的情况下,通过降低对 TSO 的获取频率,提升批量 DML 的执行效率,降低跑批类任务的执行时间。
稳定性
降低资源消耗型查询对轻量查询响应时间的影响 @glorv
当资源消耗型查询与轻量查询同时运行时,轻量查询的响应时间会被严重影响。在这种情况下,通常希望优先快速处理轻量查询,以保证交易类负载的服务质量。因此 TiKV 在 v6.3.0 中优化了读请求的调度机制,使资源消耗型的查询在每一轮执行的时间更符合预期。这个特性大幅降低了资源消耗型查询对轻量查询的影响,使混合工作负载的 P99 延迟降低了 50% 以上。
修改优化器统计信息过期时的默认统计信息使用策略 @xuyifangreeneyes
在 v5.3.0 版本,TiDB 引入系统变量 控制优化器在统计信息过期时的行为,默认为
ON
,即保持旧版本行为不变:当 SQL 涉及的对象的统计信息过期时,优化器认为该表上除总行数以外的统计信息不再可靠,转而使用 pseudo 统计信息。经过一系列测试和用户实际场景分析,TiDB 在新版本中将tidb_enable_pseudo_for_outdated_stats
的默认值改为OFF
,即使统计信息过期,优化器也仍会使用该表上的统计信息,这有利于执行计划的稳定性。TiKV 正式支持关闭 Titan 引擎 @tabokie
正式支持对在线 TiKV 节点。
缺少 GlobalStats 时自动选择分区静态剪裁 #37535 @
当启用分区动态剪裁时,优化器依赖 进行执行计划的选择。在 GlobalStats 收集完成前,使用 pseudo 统计信息可能会造成性能回退。在 v6.3.0 版本中,如果在 收集未完成的情况下打开动态分区裁剪开关,TiDB 会维持静态分区剪裁的状态,直到 GlobalStats 收集完成。该方式确保在切换分区剪裁策略时系统性能保持稳定。
易用性
解决基于 SQL 的数据放置规则功能和构建 TiFlash 副本功能的冲突 @lcwangchao
TiDB 在 v6.0.0 版本提供基于 SQL 的数据放置规则功能,但是由于实现机制问题,该功能和构建 TiFlash 副本功能有冲突。v6.3.0 版本进行改进优化,,使这两个功能更加方便易用。
MySQL 兼容性
新增支持
REGEXP_INSTR()
、REGEXP_LIKE()
、REGEXP_REPLACE()
和REGEXP_SUBSTR()
4 个正则表达式函数,提升 TiDB 与 MySQL 8.0 的兼容性 @windtalker这些函数与 MySQL 的兼容性可参考。
CREATE USER
和ALTER USER
支持ACCOUNT LOCK/UNLOCK
选项 #37051 @在执行 CREATE USER 创建用户时,允许使用
ACCOUNT LOCK/UNLOCK
选项,限定被创建的用户是否被锁定。锁定后的用户不能正常登录数据库。对于已存在的用户,可以通过 使用
ACCOUNT LOCK/UNLOCK
选项,修改用户的锁定状态。JSON 数据类型和 JSON 函数 GA #36993 @
JSON 是一种流行的数据格式,被大量的程序设计所采用。TiDB 在早期版本就引入了 JSON 支持,兼容 MySQL 的 JSON 数据类型和一部分 JSON 函数。在 v6.3.0 版本中,这些功能正式 GA,为 TiDB 提供了更丰富的数据类型支持,同时和生成列也增加了对 JSON 函数的支持,进一步提升了 TiDB 对 MySQL 的兼容能力。
PITR 支持 GCS 和 Azure Blob Storage 作为备份存储 @
BR 支持 AWS S3 Object Lock #13442 @
你可以在 AWS 开启 S3 Object Lock 功能来防止备份数据写入后被修改或者删除。
数据迁移
TiDB Lightning 支持将 Apache Hive 导出的 Parquet 文件导入到 TiDB @buchuitoudegou
DM 新增配置项
safe-mode-duration
@okJiangDM 任务配置文件中新增一个配置项 ,用户可以自行调节 DM 异常重启后进入安全模式的持续时间,默认值 60 秒。当设置为 “0s” 时,表示 DM 异常重启后尝试进入安全模式会报错。
数据共享与订阅
TiCDC 支持对多个异地目标数据源进行数据复制 @sdojjy
为了支持从一个 TiDB 集群复制数据到多个不同的异地数据系统,自 v6.3.0 开始,TiCDC 节点可以中,用于分别负责对应机房的数据复制任务,以支撑各种复杂的异地数据复制使用场景和部署形态。
TiCDC 支持维护上下游数据一致性快照 (Sync point) #6977 @
在灾备复制场景下,TiCDC 支持周期性地维护一个下游数据快照,使得该下游快照能与上游数据的快照保持一致。借助此能力,TiCDC 能更好地匹配读写分离应用场景,帮助用户降本增效。
TiCDC 支持平滑升级 @overvenus @
用户使用 TiUP (>=v1.11.0) 和 (>=v1.3.8) 可以平滑滚动升级 TiCDC 集群。升级期间数据同步延时保持在 30 秒内,提高了稳定性,让 TiCDC 能更好地支持延时敏感型业务。
兼容性变更
系统变量
配置文件 | 配置项 | 修改类型 | 描述 |
---|---|---|---|
TiDB | 新增 | TiDB 用于存放临时数据的路径。需要使用 TiDB 节点本地存储的功能会将数据临时存放在这个目录下。默认值为 /tmp/tidb 。 | |
TiKV | auto-adjust-pool-size | 新增 | 控制是否开启自动调整线程池的大小。开启此配置可以基于当前的 CPU 使用情况,自动调整统一处理读请求的线程池 (UnifyReadPool) 的大小,优化 TiKV 的读性能。 |
TiKV | 修改 | 扩展可选值范围:增加 sm4-ctr 。设置为 sm4-ctr 时,数据将采用国密算法 SM4 加密后进行存储。 | |
TiKV | enable-log-recycle | 新增 | 控制 Raft Engine 是否回收过期的日志文件。该配置项启用时,Raft Engine 将保留逻辑上被清除的日志文件,用于日志回收,减少写负载的长尾延迟。仅在 format-version 的值大于等于 2 时,该配置项才生效。 |
TiKV | 新增 | 指定 Raft Engine 的日志文件格式版本。v6.3.0 以前的默认值为 1 。v6.1.0 及以后版本的 TiKV 可以读取该格式。v6.3.0 及以后版本,该配置项默认值为 2 ,TiKV 可以读取该格式。 | |
TiKV | log-backup.enable | 修改 | 默认值在 v6.3.0 以前是 false ,v6.3.0 开始设为 true 。 |
TiKV | 修改 | 默认值在 v6.3.0 以前是 5min ,v6.3.0 开始设为 3min 。 | |
PD | enable-diagnostic | 新增 | 控制是否开启诊断功能。默认值为 false 。 |
TiFlash | 废弃 | 该参数从 v6.3.0 开始废弃,默认开启此功能且不能关闭。 | |
DM | safe-mode-duration | 新增 | 自动安全模式的持续时间。 |
TiCDC | 新增 | 控制是否开启 sync point 功能。 | |
TiCDC | sync-point-interval | 新增 | 控制 sync point 功能对齐上下游 snapshot 的时间间隔。 |
TiCDC | 新增 | sync point 功能在下游表中保存的数据的时长,超过这个时间的数据会被清理。 | |
TiCDC | sink-uri.memory | 废弃 | 废弃 memory 排序方式,不建议在任何情况下使用。 |
其他
- 日志备份功能兼容分区交换 (Exchange Partition) DDL。
- 不再支持通过
ALTER TABLE ...SET TiFLASH MODE ...
语法启用或禁用 FastScan 功能。从 v6.2.0 版本升级到 v6.3.0 版本时,在 v6.2.0 版本的 FastScan 设置将失效,但不影响数据的正常读取。你需要重新使用变量方式设置 FastScan。从 v6.2.0 及更早版本升级到 v6.3.0 时,所有会话默认不开启 FastScan 功能,而是保持一致性的数据扫描功能。 - 在 Linux AMD64 架构的硬件平台部署 TiFlash 时,CPU 必须支持 AVX2 指令集。确保命令
cat /proc/cpuinfo | grep avx2
有输出。而在 Linux ARM64 架构的硬件平台部署 TiFlash 时,CPU 必须支持 ARMv8 架构。确保命令cat /proc/cpuinfo | grep 'crc32' | grep 'asimd'
有输出。通过使用向量扩展指令集,TiFlash 的向量化引擎能提供更好的性能。 - TiDB 支持的最小 HAProxy 版本为 v1.5。使用 v1.5 到 v2.1 之间的 HAProxy 时,需要在
mysql-check
中配置post-41
。建议使用 HAProxy v2.2 或更高版本。
自 v6.3.0 起,TiCDC 不再支持配置 Pulsar Sink。建议使用 StreamNative 官方维护的 kop 作为替代方案。
改进提升
TiDB
TiKV
PD
- 更新 TiDB Dashboard 中 TiKV IO MBps 指标的计算方式 @YiniXu9506
- 将 TiDB Dashboard 中
metrics
更改为monitoring
@YiniXu9506
TiFlash
- 支持下推
elt
到 TiFlash @Willendless - 支持下推
leftShift
到 TiFlash @AnnieoftheStars - 支持下推
castTimeAsDuration
到 TiFlash @AntiTopQuark - 支持下推
HexIntArg/HexStrArg
到 TiFlash @YangKeao - 重构改进 TiFlash 的执行流解释器,支持新的解释器 Planner @SeaRise
- 改进了 TiFlash memory tracker 的准确度 @bestwoody
- 提升了 UTF8_BIN/ASCII_BIN/LATIN1_BIN/UTF8MB4_BIN collation 的列相关运算的速度 @solotzg
- 在后台计算 ReadLimiter 的 I/O 吞吐量 #5091 @
- 支持下推
Tools
Backup & Restore (BR)
TiCDC
TiDB Data Migration (DM)
TiDB Lightning
- 在 S3 URL 中添加新参数
role-arn
和external-id
,支持从其他账户访问 S3 数据 @dsdashun
- 在 S3 URL 中添加新参数
TiDB
- 修复权限检查跳过
PREAPRE
语句的问题 #35784 @ - 修复系统变量
tidb_enable_noop_variable
能够设置为 的问题 #36647 @ - 修复存在表达式索引定义时,
INFORMAITON_SCHEMA.COLUMNS
表的ORDINAL_POSITION
列可能不正确的问题 #31200 @ - 修复时间戳大于
MAXINT32
时 TiDB 不报错的问题 #31585 @ - 修复使用企业版插件时无法启动 TiDB server 的问题 #37319 @
- 修复
SHOW CREATE PLACEMENT POLICY
输出结果不正确的问题 #37526 @ - 修复临时表能用于交换分区的问题 #37201 @
- 修复查询
INFORMATION_SCHEMA.TIKV_REGION_STATUS
返回不正确结果的问题 @zimulala - 修复使用
EXPLAIN
查询视图时不进行权限检查的问题 @hawkingrei - 修复 JSON
null
不能被更新为NULL
的问题 @YangKeao - 修复 DDL 任务的
row_count
不准确的问题 @Defined2014 - 修复
FLASHBACK TABLE
运行不正常的问题 @tiancaiamao - 修复无法处理典型 MySQL 协议中
prepared
语句 flag 的问题 @dveeden - 修复在极端情况下,启动 TiDB 可能进入错误状态的问题 @xhebox
- 修复
INFORMATION_SCHEMA.VARIABLES_INFO
不遵循安全增强模式 (SEM) 的问题 @CbcWestwolf - 修复带 UNION 算子的查询中转换字符串出错的问题 @cbcwestwolf
- 修复在 TiFlash 中为分区表开启动态模式时结果出错的问题 @wshwsh12
- 修复 TiDB 中二进制字符串和 JSON 之间的转换和对比行为与 MySQL 不兼容的问题 #25053 @
- 修复 TiDB 中的
JSON_OBJECTAGG
和JSON_ARRAYAGG
在二进制值上与 MySQL 不兼容的问题 #25053 @ - 修复比较 JSON opaque 值时造成崩溃的问题 #37315 @
- 修复 JSON 聚合函数不能使用单精度浮点数的问题 #37287 @
- 修复
castRealAsTime
表达式的结果和 MySQL 不兼容的问题 #37462 @ - 修复悲观 DML 操作锁定非唯一索引键的问题 #36235 @
- 修复与自动提交 (auto-commit) 模式更改相关的事务提交行为 #36581 @
- 修复带 DML 算子的
EXPLAIN ANALYZE
语句可能在事务提交完成前返回结果的问题 #37373 @ - 修复在某些情况下
UPDATE
语句错误地消除了 projection 导致Can't find column
报错的问题 #37568 @ - 修复执行 Join Reorder 操作时,会错误地下推 Outer Join 条件的问题 #37238 @
- 修复
IN
和NOT IN
子查询在某些 pattern 下会报Can't find column
的问题 #37032 @ - 修复
UPDATE
语句中带公共表表达式 (CTE) 的情况下会报Can't find column
的问题 #35758 @ - 修复错误的
PromQL
#35856 @
- 修复权限检查跳过
TiKV
- 修复 PD Region heartbeat 连接异常中断后未重新连接的问题 #12934 @
- 修复 Raftstore 线程繁忙时,可能会出现 Region 重叠的问题 #13160 @
- 修复 PD 客户端可能会出现死锁的问题 #13191 @ #12933 @
- 修复关闭加密时 TiKV panic 的问题 #13081 @
- 修复 Dashboard 中 Unified Read Pool CPU 表达式错误的问题 #13086 @
- 修复当有一个 TiKV 实例出现网络隔离时,一段时间内服务不可用问题 #12966 @
- 修复误报
PessimisticLockNotFound
的问题 #13425 @ - 修复某些场景下 PITR 可能丢失数据的问题 #13281 @
- 修复存在时间较长的悲观事务时,checkpoint 没有推进的问题 #13304 @
- 修复 TiKV 无法区分 JSON 中时间类型(
DATETIME
、DATE
、TIMESTAMP
和TIME
)和STRING
类型的问题 #13417 @ - 修复 JSON bool 和其他 JSON value 的比较行为与 MySQL 不兼容的问题 #13386 @YangKeao
PD
- 修复开启
enable-forwarding
时,gRPC 处理返回错误不当导致 PD panic 的问题 @bufferflies - 修复不健康的 Region 可能导致 PD panic 的问题 @nolouch
- 修复 PD 可能没创建 TiFlash Learner 副本的问题 @HunDunDM
- 修复开启
TiFlash
- 修复取消查询时 window function 可能会导致 TiFlash 崩溃的问题 @SeaRise
- 修复
CAST(value AS datetime)
输入数据无法转成DATETIME
时会导致 TiFlash sys CPU 异常高的问题 @xzhangxian1008 - 修复
CAST(Real/Decimal AS time)
函数执行结果与 MySQL 不一致的问题 @mengxin9014 - 修复存储中的过时数据可能无法删除的问题 @JaySon-Huang
- 修复 page GC 可能导致无法创建表格的问题 @JaySon-Huang
- 修复使用包含
NULL
值的列创建主键时导致崩溃的问题 @JaySon-Huang
Tools
Backup & Restore (BR)
- 修复导致 PITR 的 checkpoint 信息过时的问题 @YuJuncen
- 修复在恢复时配置过高的 concurrency 会导致 Region 不均衡的问题 @3pointer
- 修复在 TiCDC 存在时,PITR 进度无法推进的问题 @YuJuncen
- 修复当外部存储的鉴权 Key 中存在某些特殊符号时,会导致备份恢复失败的问题 @MoCuishle28
TiCDC
- 修复 TiCDC 对含有 grpc 服务的非法 PD 地址报错不准确的问题 @crelax
- 修复
cdc cli changefeed list
命令不返回 failed changefeed 的问题 @asddongmen - 修复如果 changefeed 初始化失败会导致 TiCDC 不可用的问题 @asddongmen
TiDB Binlog
- 修复 compressor 设为
gzip
时 Drainer 无法正确发送请求至 Pump 的问题 @lichunzhu
- 修复 compressor 设为
TiDB Data Migration (DM)
- 修复 DM 报错
Specified key was too long
的问题 @lance6716 - 修复 relay 报错时可能导致 goroutine 泄露问题 @lance6716
- 修复当
collation_compatible
设置为"strict"
时,DM 可能生成有重复排序规则的 SQL 语句的问题 @lance6716 - 修复 DM-worker 日志中出现过多警告信息 “found error when get timezone from binlog status_vars” 的问题 @lyzx2001
- 修复数据同步过程中,latin1 字符集数据可能损坏的问题 @lance6716
- 修复 DM 报错
TiDB Lightning
- 修复 TiDB Lightning 不支持 Parquet 文件中以斜线 ()、数字、非 ASCII 字符开头的特殊列名的问题 @D3Hunter
贡献者
感谢来自 TiDB 社区的贡献者们:
- @An-DJ
- @
- @AntiTopQuark
- @
- @BurtonQin(首次贡献者)
- @
- @eltociear
- @
- @erwadba
- @
- @joycse06
- @
- @onlyacat
- @
- @rzrymiak
- @
- @whitekeepwork