前言
TiDB 的最新 LTS 版本 v7.5.0 于 2023 年 12 月 1 日正式发版,包含很多期待已久的新特性。比如:
- 支持并行运行多个 ADD INDEX 语句
- 可以使用 SQL 实现 Lightning 物理导入
- 大大简化了数据导入的操作效率,极大改善了易用性
- DDL 支持暂停和恢复。
- 升级时更平滑,切再也不担心超大表加索引要加好几天而影响业务的情况了,可以对大表加索引错峰执行。
- TiDB Dashboard 性能分析支持 TiKV 堆内存分析。
- 通过 TiDB Dashboard 我们就可以直接获取 TiKV 的火焰图和调用图,非常方便!
此外还有优化全局排序 、 资源管控支持自动管理后台任务 、 支持管理资源消耗超出预期的查询等功能。
还有一点需要注意,从 v7.5.0 开始不再支持 TiDB Binlog 数据同步功能,强烈建议使用 TiCDC 实现高效稳定的数据同步。
背景
在以前的版本中,遇到过两个与 DDL 执行相关的痛点问题:
- 升级时有正在执行的 DDL,当时遗漏了检查,没有取消它就直接升级了导致升级后表数据异常。
- 对一个 50 亿行的大表添加索引,加了 3 天导致影响在线业务。
在 v7.2.0 中引入的 DDL 任务的暂停和恢复功能,v7.5.0 成为正式功能 (GA)。该功能允许临时暂停资源密集型的 DDL 操作(如创建索引),以节省资源并最小化对在线流量的影响。当资源允许时,可以无缝恢复 DDL 任务,而无需取消和重新开始。DDL 任务的暂停和恢复功能提高了资源利用率,改善了用户体验,并简化了 schema 变更过程。
现在,结合 v6.5 版本后添加索引加速的功能特性,现在可以说根本解决了我们之前遇到的这两个痛点问题。
本文对此进行原理了解和测试验证。
TiDB DDL 基本原理
TiDB 采用在线异步变更的方式执行 DDL 语句,从而实现 DDL 语句的执行不会阻塞其他会话中的 DML 语句。
逻辑及物理 DDL
按照是否需要操作表的数据来划分,DDL 语句可以划分为:
-
逻辑 DDL 语句
- 称为 General DDL,只修改元数据,不动表的存储数据。
- 如改表名或列名,耗时通常在 1s 左右,不会影响线上业务。
-
物理 DDL 语句
- 称为 Reorg DDL,会同时修改元数据和表数据。
- 如建索引,不仅需要变更表的定义,也要做一次全表扫描以构建新索引。物理 DDL 只包含加索引以及有损列类型变更(如从 INT 转成 CHAR )这两种类型,通常耗时较长,且执行时间与表数据量、机器配置及业务负载有关。
执行物理 DDL 对业务有影响主要在于两个方面,一方面需