TiDB 5.3 Release Notes

    TiDB 版本:5.3.0

    在 v5.3.0 版本中,你可以获得以下关键特性:

    • 引入临时表,简化业务逻辑并提升性能
    • 支持设置表和分区的表属性
    • 支持为 TiDB Dashboard 创建最小权限用户,提高系统安全性
    • 优化 TiDB 时间戳处理流程,提升系统的整体性能
    • 提高 DM 同步性能,实现以更低的延迟将数据从 MySQL 同步数据到 TiDB
    • 支持 TiDB Lightning 分布式并行导入,提升全量数据迁移效率
    • 支持“一键”保存和恢复现场问题的相关信息,提升查询计划问题诊断的效率
    • 支持持续性能分析 (Continuous Profiling) 实验特性,提高数据库性能的可观测性
    • 持续优化存储和计算引擎,提升系统性能和稳定性
    • 降低 TiKV 写入延迟,从 Raftstore 线程池中分离出 IO 线程池(默认不开启)

    注意

    当从一个早期的 TiDB 版本升级到 TiDB v5.3.0 时,如需了解所有中间版本对应的兼容性更改说明,请查看对应版本的 。

    配置文件参数

    配置文件配置项修改类型描述
    TiDBprepared-plan-cache.capacity修改此配置项用于控制缓存语句的数量。默认值从 100 修改为 1000
    TiKVstorage.reserve-space修改此配置项用于控制 TiKV 启动时用于保护磁盘的预留空间。从 v5.3.0 起,预留空间的 80% 用作磁盘空间不足时运维操作所需要的额外磁盘空间,剩余的 20% 为磁盘临时文件。
    TiKVmemory-usage-limit修改以前的版本没有 memory-usage-limit 参数, 升级后该参数值根据 storage.block-cache.capacity 来计算。
    TiKV新增表示处理 Raft I/O 任务的线程池中线程的数量,即 StoreWriter 线程池的大小。
    TiKVraftstore.raft-write-size-limit新增触发 Raft 数据写入的阈值。当数据大小超过该配置项值,数据会被写入磁盘。当 raftstore.store-io-pool-size 的值为 0 时,该配置项不生效。
    TiKVraftstore.raft-msg-flush-interval新增Raft 消息攒批发出的间隔时间。每隔该配置项指定的间隔,Raft 消息会攒批发出。当 raftstore.store-io-pool-size 的值为 0 时,该配置项不生效。
    TiKVraftstore.raft-reject-transfer-leader-duration删除控制迁移 leader 到新加节点的最小时间。
    PD修改此配置项用于控制日志保留的最长天数。默认值从 1 修改为 0
    PDlog.file.max-backups修改此配置项用于控制日志文件保留的最大个数。默认值从 7 修改为 0
    PD修改此配置项用于控制 replicaChecker 检查 Region 健康状态的运行频率,越短则运行越快,通常状况不需要调整。默认值从 100ms 修改为 10ms
    PDmax-snapshot-count修改此配置项用于控制单个 store 最多同时接收或发送的 snapshot 数量,调度受制于这个配置来防止抢占正常业务的资源。默认值从 3 修改为 64
    PD修改此配置项用于控制单个 store 的 pending peer 上限,调度受制于这个配置来防止在部分节点产生大量日志落后的 Region。默认值从 16 修改为 64
    TiD Lightningmeta-schema-name新增在目标集群保存各个 TiDB Lightning 实例元信息的 schema 名字,默认值为 “lightning_metadata”。

    其他

    • 临时表:

      • 对于本地临时表,如果在 v5.3.0 升级前创建了本地临时表,这些临时表实际为普通表,在升级至 v5.3.0 或更高版本后,也会被 TiDB 当成普通表处理。对于全局临时表,如果在 v5.3.0 上创建了全局临时表,当 TiDB 降级至 v5.3.0 以前版本后,这些临时表会被当作普通表处理,导致数据错误。
      • TiCDC 和 BR 从 v5.3.0 开始支持。如果使用 v5.3.0 以下版本同步全局临时表到下游,会导致表定义错误。
      • 通过 TiDB 数据迁移工具导入的集群、恢复后的集群、同步的下游集群必须是 TiDB v5.3.0 及以上版本,否则创建全局临时表时报错。
      • 关于临时表的更多兼容性信息,请参考与 MySQL 临时表的兼容性和。
    • 对于 v5.3.0 之前的版本,当系统变量设置为非法值时,TiDB 会报错。从 v5.3.0 起,当系统变量设置为非法值时,TiDB 会返回成功,并报类似 |Warning | 1292 | Truncated incorrect xxx: 'xx' 的警告。

    • 修复 SHOW CREATE VIEW 不需要 SHOW VIEW 权限的问题,现在用户必须具有 SHOW VIEW 权限才允许执行 SHOW CREATE VIEW 语句。

    • 系统变量 被加入 Noop Function 中,当 tidb_enable_noop_functions = 0/OFF 时,修改该变量会报错。

    • 不再允许执行 GRANT ALL ON performance_schema.* 语法,在 TiDB 上执行该语句会报错。

    • 修复 v5.3.0 之前的版本中新增索引会导致在规定时间外触发 auto-analyze 的问题。在 v5.3.0 中,用户通过 tidb_auto_analyze_start_timetidb_auto_analyze_end_time 设定时间段后,只会在该时间段内触发 auto-analyze。

    • plugin 默认存放目录从 "" 改为 /data/deploy/plugin

    • DM 代码迁移至 TiCDC 代码仓库的 dm 文件夹。从 DM v5.3.0 起,DM 采用与 TiDB 相同的版本号。DM v2.0 的下一个主版本为 DM v5.3。DM v2.0 到 v5.3 无兼容性变更,升级过程与正常升级无差异。

    • 默认部署 Prometheus ,它是 2021 年 5 月发布的版本,提供了更多的功能并解决了安全风险。相对于 5.3.0 之前版本 TiDB 默认使用的 Prometheus v2.8.1,v2.27.1 存在 Alert 时间格式变化,详情见 Prometheus commit

    新功能

    • 使用 SQL 接口设置数据放置规则(实验特性)

      新增对 [CREATE | ALTER] PLACEMENT POLICY 语句的支持,提供 SQL 接口设置数据放置规则。通过该功能,用户可以指定任意连续数据按照不同地域、机房、机柜、主机、硬件、副本数规则进行部署,满足低成本、高可用、灵活多变的业务诉求。该功能可以实现以下业务场景:

      • 合并多个不同业务的数据库,大幅减少数据库常规运维管理的成本,并通过规则配置实现业务资源隔离。

      • 增加重要数据的副本数,提高业务可用性和数据可靠性。

      • 将最新数据存入 SSD,历史数据存入 HDD,降低归档数据存储成本。

      • 把热点数据的 leader 放到高性能的 TiKV 实例上。

      • 将冷数据分离到不同的存储中以提高可用性。

        #18030

    • 临时表

      新增对 CREATE [GLOBAL] TEMPORARY TABLE 语句的支持。支持创建临时表,方便管理业务中间计算的临时数据。临时表中的数据均保存在内存中,用户可通过 tidb_tmp_table_max_size 变量限制临时表的内存大小。TiDB 支持以下两种临时表:

      • Global 临时表

        • 对集群内所有 session 可见,表结构持久化。
        • 提供事务级别的数据隔离,数据只在事务内有效,事务结束后自动删除数据。
      • Local 临时表

        • 只对当前 session 可见,表结构不持久化。

        • 支持重名,用户无需为业务设计复杂的表命名规则。

        • 提供会话级别的数据隔离,降低业务设计复杂度,会话结束后删除临时表。

          #24169

    • 支持 FOR UPDATE OF TABLES 语法

      对于存在多表 join 的语句,支持只对 OF TABLES 中包含的表关联的行进行悲观锁加锁操作。

      #28689

    • 设置表属性

      增加 ALTER TABLE [PARTITION] ATTRIBUTES 语句支持,允许用户为表和分区设置属性。目前 TiDB 仅支持设置 merge_option 属性。通过为表或分区添加 merge_option 属性,用户可以显式控制 Region 是否合并。

      应用场景:当用户 SPLIT TABLE 之后,如果超过一定时间后(由 PD 参数 控制)没有插入数据,空 Region 默认会被自动合并。此时,可以通过该功能设置表属性为 merge_option=deny,避免 Region 的自动合并。

      用户文档

    安全

    • 支持为 TiDB Dashboard 创建最小权限用户

      TiDB Dashboard 的账号体系与 TiDB SQL 用户一致,并基于 TiDB SQL 用户的权限进行 TiDB Dashboard 授权验证。TiDB Dashboard 所需的权限较少,甚至可以只有只读权限。可以基于最小权限原则配置合适的用户访问 TiDB Dashboard,减少高权限用户的使用场景。

      建议为访问 TiDB Dashboard 创建一个最小权限的 SQL 用户,并用该用户登录 TiDB Dashboard,避免使用高权限用户,提升安全性。

    性能

    • 优化 PD 时间戳处理流程

      • 支持通过系统变量 设置 PD Follower Proxy 功能开关。在 PD 时间戳请求负载过高的情况下,通过开启 PD Follower Proxy,可以将 follower 上请求周期内收集到的 TSO request 批量转发到 leader 节点,从而有效减少 client 与 leader 的直接交互次数,降低 leader 的负载,提升 TiDB 整体性能。

        5.3.0 - 图2

        注意

        在 client 数较少、PD leader 负载不高的情况下,不建议开启 PD Follower Proxy 功能。

      • 支持通过 tidb_tso_client_batch_max_wait_time 系统变量设置 PD client 批量请求 TSO 时所需的最大 batch 等待时间,单位为毫秒。在 PD TSO 请求负载过高的情况下,可以通过调大等待时间获得更大的 batch size,从而降低 PD 负载,提升吞吐。

        注意

        在 TSO 请求负载不高的情况下,不建议调整该参数。

        #3149

    • 支持多节点永久损坏后的在线有损恢复(实验特性)

      新增对 pd-ctl unsafe remove-failed-stores 命令的支持,实现在线数据有损恢复。当多数副本发生了永久性损坏(如磁盘损坏)等问题,导致无法在业务层读写一段数据时,PD 可以执行在线数据恢复,使该数据恢复至可读写状态。

      进行该功能相关操作时,建议在 TiDB 团队支持下完成。

      用户文档

    数据迁移

    • 提高 DM 同步性能

      支持以下功能,实现以更低的延迟将数据从 MySQL 同步数据到 TiDB。

      • 合并单行数据的多次变更 (Compact multiple updates on a single row into one statement)
      • 点查更新合并为批量操作 (Merge batch updates of multiple rows into one statement)
    • 增加 DM 的 OpenAPI 以更方便地管理集群(实验特性)

      DM 提供 OpenAPI 功能,用户可通过 OpenAPI 对 DM 集群进行查询和运维操作。OpenAPI 的总体功能和 类似。

      当前 OpenAPI 功能为实验特性,默认关闭,不建议在生产环境中使用。

      用户文档

    • TiDB Lightning 执行任务前的检查项

      TiDB Lightning 增加了执行前检查配置的功能。默认开启。该功能会自动进行一些磁盘空间和执行配置的常规检查,主要目的是确保后续的整个导入过程顺利。

    • TiDB Lightning 支持导入 GBK 编码的文件

      通过指定源数据文件的字符集,TiDB Lightning 会在导入过程中将源文件从指定的字符集转换为 UTF-8 编码。

      用户文档

    • Sync-diff-inspector 优化

      • 大幅提升了对比速度,由原来的 375 MB/s 提升至 700 MB/s。

      • 对比过程中对 TiDB 节点的内存消耗降低近一半。

      • 优化了用户交互界面,在对比过程中可以显示进度。

    问题诊断效率

    • 保存和恢复集群现场信息

      在定位排查 TiDB 集群问题时,用户经常需要提供系统和查询计划相关的信息。为了帮助用户更方便地获取相关信息,更高效地排查集群问题,TiDB 在 v5.3.0 中引入了 PLAN REPLAYER 命令,用于“一键”保存和恢复现场问题的相关信息,提升查询计划问题诊断的效率,同时方便将问题归档管理。

      PLAN REPLAYER 主要功能如下:

      • 导出排查现场 TiDB 集群的相关信息,导出为 ZIP 格式的文件用于保存。

      • 在任意 TiDB 集群上导入另一 TiDB 集群现场信息的 ZIP 文件。

        #26325

    • TiCDC 支持灾备场景下的最终一致性复制

      在主从灾备架构下,当生产集群(即 TiCDC 同步的上游集群)发生灾难、且短时间内无法恢复对外提供服务时,TiCDC 具备保证从集群数据一致性的能力,并允许业务快速的将流量切换至从集群,避免数据库长时间不可用而对业务造成影响。

      用户文档

    • TiCDC 支持 HTTP 协议 OpenAPI 对 TiCDC 任务进行管理

      从 TiDB v5.3.0 起,TiCDC 提供的 OpenAPI 功能成为正式特性,用户可通过 OpenAPI 对 TiCDC 集群进行查询和运维操作。

    部署及运维

    • 持续性能分析(实验特性)

      TiDB Dashboard 引入持续性能分析功能,提供在集群运行状态时自动保存实例性能分析结果的能力,通过火焰图的形式提高了 TiDB 集群性能的可观测性,有助于缩短故障诊断时间。

      该功能默认关闭,需进入 TiDB Dashboard 持续性能分析页面开启。

      持续性能分析功能必须使用 TiUP 1.7.0 及以上版本升级或安装的集群才可使用。

    TiDB 在遥测中新增收集 TEMPORARY TABLE 功能的开启情况。收集的数据中不包含任何实际业务的表名或表数据。

    关于所收集的信息详情及如何禁用该行为,参见文档。

    移除功能

    从 TiCDC v5.3.0 版本开始,TiDB 集群之间的环形同步功能(v5.0 实验特性)被移除。如果在升级 TiCDC 前已经使用过环形同步功能复制数据,升级后此部分数据的环形同步不受影响。

    • TiDB

      • 当 coprocessor 遇到锁时,在调试日志中显示受影响的 SQL 语句帮助诊断问题 #27718
      • 在 SQL 逻辑层备份和恢复数据时,支持显示备份和恢复数据的大小
      • 改进 tidb_analyze_version=2 时 ANALYZE 默认的收集逻辑,提高收集速度并且降低资源开销
      • 引入语法 ANALYZE TABLE table_name COLUMNS col_1, col_2, ..., col_n,为宽表提供只收集一部分列统计信息的方案,提高宽表收集统计信息的速度
    • TiKV

      • 增强磁盘空间防护能力,提升存储稳定性。

        针对 TiKV 遇到磁盘写满错误时可能 Panic 的问题,为磁盘剩余空间引入两级阈值防御机制,避免超额流量耗尽磁盘空间。同时,提供阈值触发时的空间回收能力。当剩余空间触发阈值时,部分写操作会失败,并返回 disk full 错误和盘满节点列表。此时,可以通过 Drop/Truncate Table 或者扩容等方式来回收空间,恢复服务。

      • 简化 L0 层流控算法 #10879

      • 优化 raft client 错误日志的收集

      • 优化日志线程以避免其成为性能瓶颈 #10841

      • 添加更多的写入查询统计类型

      • 降低写入延迟,从 Raftstore 线程池中分离出 IO 线程池(默认不开启)。具体调优操作,请参考 TiKV 线程池性能调优

    • PD

      • 热点调度器的 QPS 维度支持更多的写请求类型 #3869
      • 通过动态调整 Balance Region 调度器的重试上限,优化该调度器的性能
      • 将 TiDB Dashboard 升级至 v2021.10.08.1 #4070
      • 允许 Evict Leader 调度器调度拥有不健康副本的 Region
      • 优化调度器退出的速度 #4146
    • TiFlash

      • 显著优化了 TableScan 算子的执行效率

      • 优化了 Exchange 算子的执行效率

      • 减少了存储引擎的 GC 过程中的写放大和内存使用(实验功能)

      • 改进了 TiFlash 重启时的稳定性和可用性,减少了重启结束后短时间内查询可能失败的情况

      • 增加支持下推多个新的字符串,时间等函数到 MPP 引擎

        • 字符串函数:LIKE pattern,FORMAT(),LOWER(),LTRIM(),RTRIM(),SUBSTRING_INDEX(),TRIM(),UCASE(),UPPER()
        • 数学函数:ROUND(decimal, int)
        • 日期时间函数:HOUR(),MICROSECOND(),MINUTE(),SECOND(),SYSDATE()
        • 类型转换函数:CAST(time, real)
        • 聚合函数:GROUP_CONCAT(),SUM(enum)
      • 提供了 512 位 SIMD 支持

      • 增强了对过期的数据版本的清理算法,减少磁盘使用量及提高读文件性能

      • 解决了用户在某些非 Linux 平台系统上查看 dashboard 时,无法获取内存或 CPU 等相关信息的问题

      • 统一 TiFlash 日志文件的命名风格(与 TiKV 保持一致),并支持动态修改 logger.count、logger.size

      • 完善了列存文件的数据校验能力(checksums,实验功能)

    • Tools

      • TiCDC

        • 通过修改 Kafka sink 配置项 MaxMessageBytes 的默认值,由 64 MB 减小为 1 MB,以修复消息过大会被 Kafka Broker 拒收的问题
        • 减少同步链路中的内存占用 #2553 #2726
        • 优化监控项和告警规则,提升了同步链路、内存 GC、存量数据扫描过程的可观测性 #1606 #2985
        • 当同步任务状态正常时,不再显示历史错误信息,避免误导用户 #2242

    Bug 修复

    • TiDB

      • 修复在分区中下推聚合算子时,因浅拷贝 schema 列导致执行计划出错,进而导致执行时报错的问题 #27797
      • 修复 plan cache 无法感知 unsigned 标志变化的问题 #28254
      • 修复当分区功能出现 out of rangepartition pruning 出错的问题
      • 修复在某些情况下 Planner 可能缓存无效 join 计划的问题 #28087
      • 修复 hash 列为 enum 时构建错误 IndexLookUpJoin 的问题
      • 修复批处理客户端在某些罕见情况下回收空闲连接可能会阻塞发送请求的问题 #27688
      • 修复当 TiDB Lightning 在目标集群上执行校验失败时 panic 的问题
      • 修复某些情况下 date_adddate_sub 函数执行结果错误的问题 #27232
      • 修复 hour 函数在向量化表达式中执行结果错误的问题
      • 修复连接到 MySQL 5.1 或更早的客户端时存在的认证问题 #27855
      • 修复当新增索引时自动分析可能会在指定时间之外触发的问题
      • 修复设置任何会话变量都会使 失效的问题 #28683
      • 修复当不支持的 cast 被下推到 TiFlash 时出现的非预期错误,例如 tidb_cast to Int32 is not supported
      • 修复 %s value is out of range in '%s' 报错中缺失 DECIMAL overflow 信息的问题 #27964
      • 修复 MPP 节点的可用性检测在某些边界场景中无法工作的问题
      • 修复分配 MPP task ID 时出现 DATA RACE 的问题 #27952
      • 修复删除空的 dual table 后 MPP 查询出现 index out of range 报错的问题
      • 修复运行 MPP 查询时出现 invalid cop task execution summaries length 相关日志的问题 #1791
      • 修复运行 MPP 查询时出现 cannot found column in Schema column 报错的问题
      • 修复 TiDB 在 TiFlash 关闭时可能出现 panic 的问题 #28096
      • 移除对基于 3DES (三重数据加密算法) 不安全的 TLS 加密套件的支持
      • 修复因 Lightning 前置检查会连接已下线的 TiKV 节点而导致导入失败的问题 #27826
      • 修复在导入太多文件到表时前置检查花费太多时间的问题
      • 修复表达式重写时 between 推断出错误排序规则的问题 #27146
      • 修复 group_concat 函数没有考虑排序规则的问题
      • 修复 extract 函数处理负值时的问题 #27236
      • 修复当设置 NO_UNSIGNED_SUBTRACTION 时创建分区失败的问题
      • 避免在列修剪和聚合下推中使用有副作用的表达式 #27106
      • 删除无用的 gRPC 日志
      • 限制有效的小数点长度以修复精度相关的问题 #3091
      • 修复 plus 表达式中检查溢出方法出错的问题
      • 修复当导出带有 new collation 数据的表的统计信息时报 data too long 错误的问题 #27024
      • 修复 TIDB_TRX 中不包含重试事务的问题
      • 修复配置项 plugin_dir 的默认值错误问题 #28084
      • 修复 CONVERT_TZ 函数在指定时区和 UTC 偏移量时返回 NULL 的问题
      • 修复如果 character_set_servercollation_server 指定的字符集未在 CREATE SCHEMA 语句中指定时,那么创建的新表结构不使用 character_set_servercollation_server 指定的字符集的问题 #27214
    • TiKV

      • 修复 Region 迁移时 Raftstore 模块出现死锁导致 TiKV 不可用的问题。用户可通过关闭调度并重启出问题的 TiKV 来临时应对。
      • 修复因 Congest 错误而导致的 CDC 频繁增加 scan 重试的问题 #11082
      • 修复因 channel 打满而导致的 Raft 断连情况
      • 修复 Raft client 中 batch 消息过大的问题 #9714
      • 修复 resolved_ts 中协程泄漏的问题
      • 修复当 response 大小超过 4 GiB 时 Coprocessor panic 的问题 #9012
      • 修复当一个 snapshot 文件无法被垃圾清理 (GC) 时 snapshot GC 会缺失 GC snapshot 文件的问题
      • 修复当处理 Coprocessor 请求时因超时而导致 panic 的问题 #10852
      • 修复因统计线程监控数据导致的内存泄漏
      • 修复在某些平台获取 cgroup 信息导致 panic 的问题 #10980
      • 修复 Compaction Filter GC 无法清除 MVCC Deletion 版本导致 scan 性能下降的问题
    • PD

      • 修复因超过副本配置数量而导致错误删除带有数据且处于 pending 状态的副本的问题 #4045
      • 修复 PD 未能及时修复 Down Peer 副本的问题
      • 修复 Scatter Range 调度器无法对空 Region 进行调度的问题 #4118
      • 修复 key manager 占用过多 CPU 的问题
      • 修复热点调度器变更配置的过程中可能会存在的数据竞争问题 #4159
      • 修复因 Region syncer 卡住而导致 leader 选举慢的问题
    • TiFlash

      • 修复 TiFlash Store Size 统计结果不准确的问题
      • 修复 TiFlash 在部分平台上由于缺失 nsl 库而无法启动的问题
      • 阻止 wait index 无限等待,防止写入压力较重时 TiFlash 长时间等待数据同步而无法提供服务的问题(新增默认超时为 5 分钟)
      • 解决了当日志体量很大时,用户搜索日志很慢或搜索不出的问题
      • 解决了搜索比较久远的历史日志时,只能搜索出最近的一部分日志的问题
      • 修复在打开 new collation 的情况下可能出现的结果错误
      • 修复 SQL 语句中含有极长嵌套表达式时可能出现的解析错误
      • 修复 Exchange 算子中可能出现的 Block schema mismatch 错误
      • 修复 Decimal 类型比较时可能出现的 Can't compare 错误
      • 修复 left/substring 函数中的 3rd arguments of function substringUTF8 must be constants 错误
    • Tools

      • TiCDC

        • 修复当上游 TiDB 实例意外退出时,TiCDC 同步任务推进可能停滞的问题 #3061
        • 修复当 TiKV 向同一 Region 发送重复请求时,TiCDC 进程 panic 的问题
        • 修复在验证下游 TiDB/MySQL 可用性时产生的不必要的 CPU 消耗 #3073
        • 修复 TiCDC 产生的 Kafka 消息体积不受 约束的问题
        • 修复当写入 Kafka 消息发生错误时,TiCDC 同步任务推进可能停滞的问题 #2978
        • 修复当开启 force-replicate 时,可能某些没有有效索引的分区表被忽略的问题
        • 修复当扫描存量数据耗时过长时,可能由于 TiKV 进行 GC 而导致存量数据扫描失败的问题 #2470
        • 修复在将某些类型的列编码为 Open Protocol 格式时,TiCDC 进程可能 panic 的问题
        • 修复在将某些类型的列编码为 Avro 格式时,TiCDC 进程可能 panic 的问题 #2648