# DDLの実行

![`smart`](DDLExecution01_aa_005_20220512.png)

-----------------------------------------------------------
TiDBは、DDL操作がテーブルをロックせず、DML文がブロックされないオンラインDDLをサポートしています。

TiDBクラスタ内に複数のTiDBサーバーがある場合、これらのTiDBサーバーは定期的に（`term`と呼ばれる）固定時間になって`Owner`の役割を交代していきます。まず、TiDB全体でDDL操作を実行するのは1つのTiDBサーバーだけが許可されています。それぞれのTiDBサーバーには`Worker`モジュールがあり、現在のTiDBサーバーの役割が`Owner`である場合にのみ有効になります。現在のデータベースの`Owner`役割情報はPDに永続化されており、`Worker`モジュールは自身が配置されているTiDBサーバーが現在`Owner`の役割を持っているかどうかを確認できます。`Owner`の`term`が期限切れになると、PDは新しい`Owner`を選出するための選挙を開始します。

2番目に、`Worker`モジュールのほかに、現在のTiDBサーバーが`Owner`役割になった後に最新のスキーマ情報をロードするための`Load Schema`モジュールもあります。そのため、現在の`Owner`役割のTiDBサーバーは最新のスキーマ情報を持つことができます。

最後に、Start Jobモジュールは、DDLリクエストを受け取り、DDL操作のためのIDを割り当て、そしてここでは、割り当てられたIDを持つ各DDL操作をJobと呼びます。

要約すると、DDL操作の最初の部分は次のようにまとめることができます：

1. DDL文はクライアントからTiDBサーバーへ送られ、それらを解析して実行計画を生成するためにコンパイルされます。このプロセスはDML文についても同じです。

2. Start JobモジュールはDDL操作をカプセル化し、TiKVに永続化します。その後、Start Jobは別の仕事を行います。それは、自身があるTiDBサーバーの`Worker`モジュールにジョブの実行を通知することです。そして、`Worker`はまず自身があるTiDBサーバーが`Owner`ロールかどうかを判断します。もしそうならば、実行します。そうでなければ、あきらめます。

3. TiDBデータベース内の`Owner`ロールを持つTiDBサーバーが、キュー内のタスクを定期的にチェックするまで、Start Jobが配置されているTiDBサーバーが`Owner`ロールでない場合、Jobの処理を待つしかありません。
