# DDL 的执行 

__*owner 角色*__
__*worker*__
__*load schema*__
__*start job*__
__*online DDL*__

![left](./student-guide/diagram/DDLExecution01_aa_002_20220512.png)
-------------------------------------------------------------
TiDB 数据库支持 online DDL ,也就是 DDL 操作不会锁表,DML 语句是不会阻塞的。下面,我们一起来看一下 DDL 的执行所需要的各个模块。

首先,整个 TiDB 数据库同一时刻只允许一个 TiDB Server 做 DDL 操作。每一个 TiDB Server 中都有一个 worker 模块,这个 worker 模块负责处理 DDL 操作,只有当前 TiDB Server 的角色为 owner 时才会启用。

如果您的 TiDB 数据库中有多个 TiDB Server,那么这些 TiDB Server 会按照一个固定时间轮流（通过选举的方式）成为 owner 角色,这个时间就叫做任期,当一个 TiDB Server 是 owner 角色并且在任期中,它的 worker 模块就可以处理 DDL 操作。

数据库当前的 owner 角色信息被持久化到 PD 中,woker 模块可以查看自己所在的 TiDB Server 当前是否为 ownere 角色,当 owner 的任期到期后,PD 会发起并负责选举,选择新的 owner。

其次,除了 worker 模块以外,还有 load schema 模块,用于在当前 TiDB Server 成为 ownere 角色后加载最新的 schema 信息,这样可以保证当前 owner 角色的 TiDB Server 拥有最新的 schema 信息。

最后,start job 模块负责接收 DDL 请求,为 DDL 操作分配 ID,在这里我们把每个分配了 ID 的 DDL 操作叫做 job。

综上所述,DDL 操作的第一部分可以概括为:

1. DDL 语句从客户端发送给 TiDB Server,TiDB Server 进行解析（Parse）和编译（Compile）,生成执行计划。这个过程与 DML 语句相同,这里请参考 DML 语句的相关介绍。

2. start job 模块将 DDL 操作封装起来,并且持久化到 TiKV 中。之后,start job 还会做一个工作,就是通知自己所在的 TiDB Server 的 worker 模块来执行 TiKV 中的 job,于是这个 worker 就首先判断自己所在的 TiDB Server 是不是 owner 角色,如果是则执行,如果不是则放弃。

3. 如果上一步中 start job 所在 TiDB Server 不是 owner 角色,那么我们只能等待 TiDB 数据库中 owner 角色的 TiDB Server 定期检查到 TiKV 中有需要执行的 job,接下来就会进行 job 的处理。