TiDB 5.1 现已发布。在 5.1 版本中,你可以获得以下关键特性:
- 支持 MySQL 8 中的公共表表达式 (Common Table Expression),提高了 SQL 语句的可读性与执行效率。
- 支持对数据表列类型的在线变更,提高了业务开发的灵活性。
- 引入一种新的统计信息类型,默认作为实验特性启用,提升查询稳定性。
- 支持 MySQL 8 中的动态权限 (Dynamic Privileges) 配置,实现对某些操作更细粒度的控制。
- 支持通过 Stale Read 功能直接读取本地副本数据,降低读取延迟,提升查询性能(实验特性)。
- 新增锁视图 (Lock View) 功能方便 DBA 观察事务加锁情况以及排查死锁问题(实验特性)。
- 新增 TiKV 后台任务写入限制(TiKV Write Rate Limiter),保证读写请求的延迟稳定性。
兼容性更改
注意:
当从一个早期的 TiDB 版本升级到 TiDB 5.1 时,如需了解所有中间版本对应的兼容性更改说明,请查看对应版本的 Release Note。
系统变量
配置文件参数
其他
- 为了提升 TiDB 性能,TiDB 的 Go 编译器版本从 go1.13.7 升级到了 go1.16.4。如果你是 TiDB 的开发者,为了能保证顺利编译,请对应升级你的 Go 编译器版本。
- 请避免在对使用 TiDB Binlog 的集群进行滚动升级的过程中新创建聚簇索引表。
- 请避免在 TiDB 滚动升级时执行
alter table ... modify column 或 alter table ... change column。
- 当按表构建 TiFlash 副本时,v5.1 版本及后续版本将不再支持设置系统表的 replica。在集群升级前,需要清除相关系统表的 replica,否则会导致升级失败。
- 在 TiCDC 的
cdc cli changefeed 命令中废弃 --sort-dir 参数,用户可在 cdc server 命令中设定 --sort-dir。#1795
新功能
SQL
-
新增 MySQL 8 中的公共表表达式 (Common Table Expression,简称 CTE)。
CTE 为 TiDB 带来递归或非递归查询层次结构数据的能力,满足了人力资源、制造业、金融市场和教育在内的多种应用领域需要使用树形查询实现业务逻辑的需求。
在 TiDB 中,你可以通过 WITH 语句使用公共表表达式。用户文档,#17472
-
新增 MySQL 8 中的动态权限 (Dynamic Privileges)。
动态权限用于限制 SUPER 权限,为 TiDB 提供更灵活的权限配置,实现对某些操作更细粒度的控制。例如,你可以使用动态权限来创建一个只能执行 BACKUP 和 RESTORE 操作的用户帐户。
支持的动态权限包括:
-
新增安全增强模式 (Security Enhanced Mode) 配置项,用于对 TiDB 管理员进行更细粒度的权限划分。
安全增强模式默认关闭,如需开启,请参考用户文档。
-
全面加强列类型的在线变更能力,支持通过 ALTER TABLE 语句进行列的在线类型修改,包括但不限于:
-
引入新的语法 AS OF TIMESTAMP,支持通过 Stale Read 功能从指定的时间点或时间范围内读取历史数据(实验特性)。
用户文档,#21094
AS OF TIMESTAMP 语法示例如下:
SELECT * FROM t AS OF TIMESTAMP '2020-09-06 00:00:00';
START TRANSACTION READ ONLY AS OF TIMESTAMP '2020-09-06 00:00:00';
SET TRANSACTION READ ONLY as of timestamp '2020-09-06 00:00:00';
-
引入一种新的统计信息类型 tidb_analyze_version = 2 (实验特性)。
tidb_analyze_version = 2 默认启用,避免了 Version 1 中因为哈希冲突导致的在较大的数据量中可能产生的较大误差,并保持了大多数场景中的估算精度。
用户文档
事务
性能
-
数据副本非一致性读 (Stale Read)(实验特性)
直接读取本地副本数据,降低读取延迟,提升查询性能
用户文档,#21094
-
默认开启 Hibernate Region 特性。
如果 Region 长时间处于非活跃状态,即被自动设置为静默状态,可以降低 Leader 和 Follower 之间心跳信息的系统开销。
用户文档,#10266
稳定性
-
TiCDC 复制稳定性问题解决
-
TiFlash 存储内存控制
优化了 Region 快照生成的速度和内存使用量,减少了 OOM 的可能性
-
新增 TiKV 后台任务写入限制 (TiKV Write Rate Limiter)
TiKV Write Rate Limiter 通过平滑 TiKV 后台任务如 GC,Compaction 等的写入流量,保证读写请求的延迟稳定性。TiKV 后台任务写入限制默认值为 "0MB",建议将此限制设置为磁盘的最佳 I/O 带宽,例如云盘厂商指定的最大 I/O 带宽。
用户文档,#9156
-
解决多个扩缩容时的调度稳定性问题
遥测
TiDB 在遥测中新增收集集群请求的运行状态,包括执行情况、失败情况等。
若要了解所收集的信息详情及如何禁用该行为,请参见遥测文档。
提升改进
-
TiDB
-
支持 VITESS_HASH() 函数 #23915
-
支持枚举类型下推到 TiKV ,提升 WHERE 子句中使用枚举类型时的性能 #23619
-
优化 Window Function 计算过程,解决了使用 ROW_NUMBER() 对数据分页时 TiDB OOM 的问题 #23807
-
优化 UNION ALL 的计算过程,解决了使用 UNION ALL 连接大量 SELECT 语句时 TiDB OOM 的问题 #21441
-
优化分区表动态模式,提升其性能和稳定性 #24150
-
解决多种情况下出现的 Region is Unavailable 问题 project#62
- 修复频繁调度情况下可能出现的多个
Region is Unavailable 问题
- 解决部分高压力写入情况下可能出现的
Region is Unavailable 问题
-
当内存中的统计信息缓存是最新的时,避免后台作业频繁读取 mysql.stats_histograms 表造成高 CPU 使用率 #24317
-
TiKV
-
TiFlash
- 新增对
Union All、TopN、Limit 函数的支持
- 新增 MPP 模式下对笛卡尔积 left outer join 和 semi anti join 的支持
- 优化锁操作以避免 DDL 语句和读数据相互阻塞
- 优化 TiFlash 对过期数据的清理
- 新增支持对
timestamp 列的查询过滤条件在 TiFlash 存储层进一步过滤
- 在集群中有大量表时,优化 TiFlash 的启动速度及扩容速度
- 提升 TiFlash 在未知 CPU 上运行的兼容性
-
PD
-
Tools
-
Backup & Restore (BR)
- 支持备份和恢复
mysql schema 下的用户数据表 #1143 #1078
- BR 支持 S3 兼容的存储(基于 virtual-host 寻址模式)#10243
- BR 改进 backupmeta 格式,减少内存占用 #1171
-
TiCDC
- 改进了部分日志信息的描述使其更加明确清晰,对诊断问题更有帮助 #1759
- 为 TiCDC 扫描的速度添加感知下游处理能力的 (back pressure) 功能 #10151
- 减少 TiCDC 进行初次扫描的内存使用量 #10133
- 提升了悲观事务中 TiCDC Old Value 的缓存命中率 #10089
-
Dumpling
- 改善从 TiDB v4.0 导出数据的逻辑避免 TiDB OOM #273
- 修复备份失败却没有错误输出的问题 #280
-
TiDB Lightning
- 提升导入速度。优化结果显示,导入 TPC-C 数据速度提升在 30% 左右,导入索引比较多(5 个索引)的大表 (2TB+) 速度提升超过 50% #753
- 导入前对导入数据和目标集群进行检查,如果不符合导入要求,则报错拒绝导入程序的运行 #999
- 优化 Local 后端更新 checkpoint 的时机,提升断点重启时的性能 #1080
Bug 修复
-
TiDB
- 修复投影消除在投影结果为空时执行结果可能错误的问题 #23887
- 修复列包含
NULL 值时查询结果在某些情况下可能错误的问题 #23891
- 当有虚拟列参与扫描时不允许生成 MPP 计划 #23886
- 修复 Plan Cache 中对
PointGet 和 TableDual 错误的重复使用 #23187 #23144 #23304 #23290
- 修复优化器在为聚簇索引构建
IndexMerge 执行计划时出现的错误 #23906
- 修复 BIT 类型相关错误的类型推导 #23832
- 修复某些优化器 Hint 在
PointGet 算子存在时无法生效的问题 #23570
- 修复 DDL 遇到错误回滚时可能失败的问题 #23893
- 修复二进制字面值常量的索引范围构造错误的问题 #23672
- 修复某些情况下
IN 语句的执行结果可能错误的问题 #23889
- 修复某些字符串函数的返回结果错误的问题 #23759
- 执行
REPLACE 语句需要用户同时拥有 INSERT 和 DELETE 权限 #23909
- 修复点查时出现的的性能回退 #24070
- 修复因错误比较二进制与字节而导致的
TableDual 计划错误的问题 #23846
- 修复了在某些情况下,使用前缀索引和 Index Join 导致的 panic 的问题 #24547 #24716 #24717
- 修复了
point get 的 prepare plan cache 被事务中的 point get 语句不正确使用的问题 #24741
- 修复了当排序规则为
ascii_bin 或 latin1_bin 时,写入错误的前缀索引值的问题 #24569
- 修复了正在执行的事务被 GC worker 中断的问题 #24591)
- 修复了当
new-collation 开启且 new-row-format 关闭的情况下,点查在聚簇索引下可能出错的问题 #24541
- 为 Shuffle Hash Join 重构分区键的转换功能 #24490
- 修复了当查询包含
HAVING 子句时,在构建计划的过程中 panic 的问题 #24045
- 修复了列裁剪优化导致
Apply 算子和 Join 算子执行结果错误的问题 #23887
- 修复了从 Async Commit 回退的主锁无法被清除的问题 #24384
- 修复了一个统计信息 GC 的问题,该问题可能导致重复的 fm-sketch 记录 #24357
- 当悲观锁事务收到
ErrKeyExists 错误时,避免不必要的悲观事务回滚 #23799
- 修复了当 sql_mode 包含
ANSI_QUOTES 时,数值字面值无法被识别的问题 #25015
- 禁止如
INSERT INTO table PARTITION (<partitions>) ... ON DUPLICATE KEY UPDATE 的语句从 non-listed partitions 读取数据 #24746
- 修复了当 SQL 语句包含
GROUP BY 以及 UNION 时,可能会出现的 index out of range 的问题 #24281
- 修复了
CONCAT 函数错误处理排序规则的问题 #24296
- 修复了全局变量
collation_server 对新会话无法生效的问题 #24156
-
TiKV
- 修复了 Coprocessor 未正确处理
IN 表达式有符号整数或无符号整数类型数据的问题 #9821
- 修复了在批量 ingest SST 文件后产生大量空 Region 的问题 #964
- 修复了 file dictionary 文件损坏之后 TiKV 无法启动的问题 #9886
- 修复了由于读取旧值而导致的 TiCDC OOM 问题 #9996 #9981
- 修复了聚簇主键列在次级索引上的
latin1_bin 字符集出现空值的问题 #24548
- 新增
abort-on-panic 配置,允许 TiKV 在 panic 时生成 core dump 文件。用户仍需正确配置环境以开启 core dump。 #10216
- 修复了 TiKV 不繁忙时
point get 查询性能回退的问题 #10046
-
PD
- 修复在 store 数量多的情况下,切换 PD Leader 慢的问题 #3697
- 修复删除不存在的 evict leader 调度器时出现 panic 的问题 #3660
- 修复 offline peer 在合并完后未更新统计的问题 #3611
-
TiFlash
- 修复
TIME 类型转换为 INT 类型时产生错误结果的问题
- 修复
receiver 可能无法在 10 秒内找到对应任务的问题
- 修复
cancelMPPQuery 中可能存在无效迭代器的问题
- 修复
bitwise 算子和 TiDB 行为不一致的问题
- 修复当使用
prefix key 时出现范围重叠报错的问题
- 修复字符串转换为
INT 时产生错误结果的问题
- 修复连续快速写入可能导致 TiFlash 内存溢出的问题
- 修复 Table GC 时会引发空指针的问题
- 修复向已被删除的表写数据时 TiFlash 进程崩溃的问题
- 修复当使用 BR 恢复数据时 TiFlash 进程可能崩溃的问题
- 修复并发复制共享 Delta 索引导致结果错误的问题
- 修复 TiFlash 在 Compaction Filter 特性开启时可能崩溃的问题
- 修复了从 Async Commit 回退的锁无法被 TiFlash 清除的问题
- 修复当
TIMEZONE 类型的转换结果包含 TIMESTAMP 类型时返回错误结果的问题
- 修复 TiFlash 在 Segment Split 期间异常退出的问题
-
Tools
-
TiDB Lightning
-
修复在生成 KV 数据时可能发生的 panic 问题 #1127
-
修复数据导入期间 Batch Split Region 因键的总大小超过 Raft 条目限制而可能失败的问题 #969
-
修复在导入 CSV 文件时,如果文件的最后一行未包含换行符(\r\n)会导入报错的问题 #1133
-
修复待导入的目标表中包含 double 类型的自增列时会导致表的 auto_Increment 值异常的问题 #1178
-
Backup & Restore (BR)
- 修复备份期间少数 TiKV 节点不可用导致的备份中断问题 #980
-
TiCDC
- 修复 Unified Sorter 中的并发问题并过滤无用的错误消息 #1678
- 修复同步到 MinIO 时,重复创建目录会导致同步中断的问题 #1463
- 默认开启会话变量
explicit_defaults_for_timestamp,使得下游 MySQL 5.7 和上游 TiDB 的行为保持一致 #1585
- 修复错误地处理
io.EOF 可能导致同步中断的问题 #1633
- 修正 TiCDC 面板中的 TiKV CDC endpoint CPU 统计信息 #1645
- 增加
defaultBufferChanSize 来避免某些情况下同步阻塞的问题 #1259
- 修复 Avro 输出中丢失时区信息的问题 #1712
- 支持清理 Unified Sorter 过期的文件并禁止共享
sort-dir 目录 #1742
- 修复存在大量过期 Region 信息时 KV 客户端可能锁死的问题 #1599
- 修复
--cert-allowed-cn 参数中错误的帮助消息 #1697
- 修复因更新
explicit_defaults_for_timestamp 而需要 MySQL SUPER 权限的问题 #1750
- 添加 sink 流控以降低内存溢出的风险 #1840
- 修复调度数据表时可能发生的同步终止问题 #1828
- 修复 TiCDC changefeed 断点卡住导致 TiKV GC safe point 不推进的问题 #1759
更新说明:https://docs.pingcap.com/zh/tidb/v5.1/release-5.1.0