## モジュール 5: オンライン DDL を使用してオンラインスキーマ変更を実行する

+ このモジュールでは、進行中の**INSERT ジョブ**が中断されることなく継続実行されることを確保しながら、**TiDB**で**オンラインスキーマ変更（DDL操作）**を実行する方法を説明します。このプロセスにおける重要な課題は、スキーマ変更がトランザクションを一時的にブロックする際に発生する**エラーコード8028**の処理です。このデモでは、スキーマ変更にもかかわらず**insertジョブ**が回復して継続できるようにする堅牢なアプローチを示します。

+ このモジュールは主に2つの操作で構成されています：

1. **挿入ジョブ（`--insert`）**
   + 指定されたテーブルに新しいレコードを継続的に挿入します。
   + 同時DDL操作により発生する可能性のあるスキーマ変更例外（エラーコード**8028**）を処理します。
   + サービスの可用性を維持するために、失敗した場合は挿入操作を再試行します。

2. **スキーマ変更（`--alter`）**
   + 挿入が進行中の間にテーブル構造を変更する`ALTER TABLE`コマンドを実行します。
   + TiDBが**オンラインスキーマ変更**を許可することを示しますが、スキーマ変更によりトランザクションが一時的に失敗する可能性があります。
   + 進行中のトランザクションが適切に適応する間、新しいスキーマが正常に適用されることを確保します。

> [!TIP]
> **主な実装の詳細：**
>
> + **TiDBメタデータロックの処理**: スクリプトは**メタデータロックを無効化**（`SET GLOBAL tidb_enable_metadata_lock = OFF`）して、クエリをブロックせずにDDL変更を許可します。
> + **自動エラー処理**: 挿入ジョブは**エラーコード8028を検出**し、クラッシュを防ぐために**失敗したトランザクションを再試行**します。
> + **並行実行**: スクリプトは**挿入ジョブ**と**スキーマ変更**を別々のターミナルで実行できるようにし、データベース更新が進行中のトランザクションと並行して発生する実際のシナリオをシミュレートします。

+ まず、挿入ジョブを実行します。

  ```bash
  poetry run python mysql_connector_python_demo/online_ddl.py --insert
  ```

  ```output
  Starting insert job on table online_ddl_test
  You can now run ALTER TABLE in another terminal with:
  python online_ddl.py --alter online_ddl_test
  Connected to TiDB: 2nR9s2Y6oh4rkp7.6z3VQEZ4@gateway01.us-west-2.prod.aws.tidbcloud.com:4000 using database test
  Disabled TiDB metadata lock for online DDL operations
  Current setting: tidb_enable_metadata_lock = OFF
  Created table online_ddl_test
  Inserting record 0
  Inserting record 1
  Inserting record 2
  Inserting record 3
  Inserting record 4
  Inserting record 5
  ...
  ```

  ![90%](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-405/405-online-ddl-0319.jpg)

+ VS Codeで`+`ボタンをクリックして、新しいターミナルを作成します。

  ![90%](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-405/405-add-terminal-0319.jpg)

+ 新しいターミナルでスキーマ変更を実行します。

  ```bash
  poetry run python mysql_connector_python_demo/online_ddl.py --alter
  ```

  ```output
  Executing ALTER TABLE on online_ddl_test
  Connected to TiDB: 2nR9s2Y6oh4rkp7.6z3VQEZ4@gateway01.us-west-2.prod.aws.tidbcloud.com:4000 using database test
  Table online_ddl_test exists, proceeding with ALTER TABLE
  Executing: ALTER TABLE online_ddl_test ADD COLUMN (ed VARCHAR(10) DEFAULT 'N/A')
  ALTER TABLE completed successfully in 0.39 seconds

  Updated table structure:
    id: int(11)
    k: int(11)
    c: char(120)
    pad: char(60)
    ed: varchar(10)
  ```

  ![90%](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-405/405-alter-table-0319.jpg)

+ VS Codeで最初のターミナルに戻り、挿入ジョブが再試行ログとともに引き続き実行されていることを確認します。

  ```output
  ...
  Inserting record 105
  Inserting record 106
  Schema mutation encountered, retrying...
  Inserting record 107
  Inserting record 108
  ...
  ```

  ![90%](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-405/405-error-catch.jpg)

+ 挿入DMLもDDL操作もブロックされていません。
