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。
新功能
事务
新增锁视图 (Lock View(实验特性)
Lock View 用于提供关于悲观锁的锁冲突和锁等待的更多信息,方便 DBA 通过锁视图功能来观察事务加锁情况以及排查死锁问题等
用户文档:
查看集群中所有 TiKV 节点上当前正在发生的悲观锁等锁:DATA_LOCK_WAITS
查看 TiDB 节点上最近发生的若干次死锁错误:DEADLOCKS
查看 TiDB 节点上正在执行的事务的信息:TIDB_TRX
性能
数据副本非一致性读 (Stale Read(实验特性)
直接读取本地副本数据,降低读取延迟,提升查询性能
用户文档
默认开启 Hibernate Region 特性。
如果 Region 长时间处于非活跃状态,即被自动设置为静默状态,可以降低 Leader 和 Follower 之间心跳信息的系统开销。
稳定性
TiCDC 复制稳定性问题解决
网络不稳定情况下出现的同步中断问题
在部分 TiKV/PD/TiCDC 节点宕机情况下出现的同步中断问题
同步中断期间积累大量数据,超过 1TB,重新同步出现 OOM 问题
大量数据写入造成 TiCDC 出现 OOM 问题
改善 TiCDC 内存使用,避免在以下场景出现 OOM
改善 TiCDC 同步中断问题,缓解以下场景的问题 project
TiFlash 存储内存控制
优化了 Region 快照生成的速度和内存使用量,减少了 OOM 的可能性
新增 TiKV 后台任务写入限制 (TiKV Write Rate Limiter
TiKV Write Rate Limiter 通过平滑 TiKV 后台任务如 GC,Compaction 等的写入流量,保证读写请求的延迟稳定性。TiKV 后台任务写入限制默认值为 "0MB",建议将此限制设置为磁盘的最佳 I/O 带宽,例如云盘厂商指定的最大 I/O 带宽。
用户文档
解决多个扩缩容时的调度稳定性问题
遥测
TiDB 在遥测中新增收集集群请求的运行状态,包括执行情况、失败情况等。
若要了解所收集的信息详情及如何禁用该行为,请参见文档。
提升改进
TiDB
修复频繁调度情况下可能出现的多个 Region is Unavailable 问题
解决部分高压力写入情况下可能出现的 Region is Unavailable 问题
支持 VITESS_HASH( 函数
支持枚举类型下推到 TiKV ,提升 WHERE 子句中使用枚举类型时的性能
优化 Window Function 计算过程,解决了使用 ROW_NUMBER( 对数据分页时 TiDB OOM 的问题
优化 UNION ALL 的计算过程,解决了使用 UNION ALL 连接大量 SELECT 语句时 TiDB OOM 的问题
优化分区表动态模式,提升其性能和稳定性
解决多种情况下出现的 Region is Unavailable 问题 project
当内存中的统计信息缓存是最新的时,避免后台作业频繁读取 mysql.stats_histograms 表造成高 CPU 使用率
TiKV
增加各模块内存使用情况追踪
解决 Raft entries cache 过大导致的 OOM 问题
解决 GC tasks 堆积导致的 OOM 问题
解决一次性从 Raft log 取太多 Raft entries 到内存导致 OOM 问题
使用 zstd 压缩 Region Snapshot,防止大量调度或扩缩容情况下出现各节点之间空间差异比较大的问题
解决多种情况下的 OOM 问题
让 Region 分裂更均匀,缓解有写入热点时 Region 大小的增长速度超过分裂速度的问题
TiFlash
新增对 Union All、TopN、Limit 函数的支持
新增 MPP 模式下对笛卡尔积 left outer join 和 semi anti join 的支持
优化锁操作以避免 DDL 语句和读数据相互阻塞
优化 TiFlash 对过期数据的清理
新增支持对 timestamp 列的查询过滤条件在 TiFlash 存储层进一步过滤
在集群中有大量表时,优化 TiFlash 的启动速度及扩容速度
提升 TiFlash 在未知 CPU 上运行的兼容性
PD
优化副本 snapshot 生成流程,解决扩缩容调度慢问题:
解决由于流量变化引带来的心跳压力引起的调度慢问题
减少大集群由于调度产生的空间差异问题,并优化调度公式防止由于压缩率差异大引发的类似异构空间集群的爆盘问题
避免在添加 scatter region 调度器后出现的非预期统计行为
解决扩缩容过程中出现的多个调度问题
Tools
提升导入速度。优化结果显示,导入 TPC-C 数据速度提升在 30% 左右,导入索引比较多(5 个索引)的大表 (2TB+ 速度提升超过 50%
导入前对导入数据和目标集群进行检查,如果不符合导入要求,则报错拒绝导入程序的运行
优化 Local 后端更新 checkpoint 的时机,提升断点重启时的性能
改善从 TiDB v4.0 导出数据的逻辑避免 TiDB OOM
修复备份失败却没有错误输出的问题
改进了部分日志信息的描述使其更加明确清晰,对诊断问题更有帮助
为 TiCDC 扫描的速度添加感知下游处理能力的 (back pressure 功能
减少 TiCDC 进行初次扫描的内存使用量
提升了悲观事务中 TiCDC Old Value 的缓存命中率
支持备份和恢复 mysql schema 下的用户数据表
BR 支持 S3 兼容的存储(基于 virtual-host 寻址模式)
BR 改进 backupmeta 格式,减少内存占用
Backup & Restore (BR
TiCDC
Dumpling
TiDB Lightning
Bug 修复
TiDB
修复投影消除在投影结果为空时执行结果可能错误的问题
修复列包含 NULL 值时查询结果在某些情况下可能错误的问题
当有虚拟列参与扫描时不允许生成 MPP 计划
修复 Plan Cache 中对 PointGet 和 TableDual 错误的重复使用
修复优化器在为聚簇索引构建 IndexMerge 执行计划时出现的错误
修复 BIT 类型相关错误的类型推导
修复某些优化器 Hint 在 PointGet 算子存在时无法生效的问题
修复 DDL 遇到错误回滚时可能失败的问题
修复二进制字面值常量的索引范围构造错误的问题
修复某些情况下 IN 语句的执行结果可能错误的问题
修复某些字符串函数的返回结果错误的问题
执行 REPLACE 语句需要用户同时拥有 INSERT 和 DELETE 权限
修复点查时出现的的性能回退
修复因错误比较二进制与字节而导致的 TableDual 计划错误的问题
修复了在某些情况下,使用前缀索引和 Index Join 导致的 panic 的问题
修复了 point get 的 prepare plan cache 被事务中的 point get 语句不正确使用的问题
修复了当排序规则为 ascii_bin 或 latin1_bin 时,写入错误的前缀索引值的问题
修复了正在执行的事务被 GC worker 中断的问题
修复了当 new-collation 开启且 new-row-format 关闭的情况下,点查在聚簇索引下可能出错的问题
为 Shuffle Hash Join 重构分区键的转换功能
修复了当查询包含 HAVING 子句时,在构建计划的过程中 panic 的问题
修复了列裁剪优化导致 Apply 算子和 Join 算子执行结果错误的问题
修复了从 Async Commit 回退的主锁无法被清除的问题
修复了一个统计信息 GC 的问题,该问题可能导致重复的 fm-sketch 记录
当悲观锁事务收到 ErrKeyExists 错误时,避免不必要的悲观事务回滚修复了当 sql_mode 包含 ANSI_QUOTES 时,数值字面值无法被识别的问题
禁止如 INSERT INTO table PARTITION (<partitions> ... ON DUPLICATE KEY UPDATE 的语句从 non-listed partitions 读取数据
修复了当 SQL 语句包含 GROUP BY 以及 UNION 时,可能会出现的 index out of range 的问题
修复了 CONCAT 函数错误处理排序规则的问题
修复了全局变量 collation_server 对新会话无法生效的问题
TiKV
修复了 Coprocessor 未正确处理 IN 表达式有符号整数或无符号整数类型数据的问题
修复了在批量 ingest SST 文件后产生大量空 Region 的问题
修复了 file dictionary 文件损坏之后 TiKV 无法启动的问题
修复了由于读取旧值而导致的 TiCDC OOM 问题
修复了聚簇主键列在次级索引上的 latin1_bin 字符集出现空值的问题
新增 abort-on-panic 配置,允许 TiKV 在 panic 时生成 core dump 文件。用户仍需正确配置环境以开启 core dump。
修复了 TiKV 不繁忙时 point get 查询性能回退的问题
PD
修复在 store 数量多的情况下,切换 PD Leader 慢的问题
修复删除不存在的 evict leader 调度器时出现 panic 的问题
修复 offline peer 在合并完后未更新统计的问题
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
修复 Unified Sorter 中的并发问题并过滤无用的错误消息
修复同步到 MinIO 时,重复创建目录会导致同步中断的问题
默认开启会话变量 explicit_defaults_for_timestamp,使得下游 MySQL 5.7 和上游 TiDB 的行为保持一致
修复错误地处理 io.EOF 可能导致同步中断的问题
修正 TiCDC 面板中的 TiKV CDC endpoint CPU 统计信息
增加 defaultBufferChanSize 来避免某些情况下同步阻塞的问题
修复 Avro 输出中丢失时区信息的问题
支持清理 Unified Sorter 过期的文件并禁止共享 sort-dir 目录
修复存在大量过期 Region 信息时 KV 客户端可能锁死的问题
修复 --cert-allowed-cn 参数中错误的帮助消息
修复因更新 explicit_defaults_for_timestamp 而需要 MySQL SUPER 权限的问题
添加 sink 流控以降低内存溢出的风险
修复调度数据表时可能发生的同步终止问题
修复 TiCDC changefeed 断点卡住导致 TiKV GC safe point 不推进的问题
修复备份期间少数 TiKV 节点不可用导致的备份中断问题
修复在生成 KV 数据时可能发生的 panic 问题
修复数据导入期间 Batch Split Region 因键的总大小超过 Raft 条目限制而可能失败的问题
修复在导入 CSV 文件时,如果文件的最后一行未包含换行符(\r\n会导入报错的问题
修复待导入的目标表中包含 double 类型的自增列时会导致表的 auto_Increment 值异常的问题
TiDB Lightning
Backup & Restore (BR
TiCDC