Skip to content

Online DDL の技術進化と実践

概要

Online DDL(オンラインデータ定義言語)は、テーブルのスキーマ変更を実行中のワークロードに対して最小限の影響で実施するための技術です。TDSQL Boundless は MySQL 互換の Online DDL 機能を提供しつつ、分散環境に最適化された拡張を行っています。

本ドキュメントでは、Online DDL の3つの主要方式の技術的進化と、大規模テーブルでの実践的な使用方法について解説します。

Online DDL の3つの方式

Copy 方式

Copy 方式は、最も伝統的な DDL 実行方式です。

動作原理:

  1. 新しいテーブル構造でテンポラリテーブルを作成する
  2. 元テーブルから新テーブルへデータをコピーする
  3. コピー完了後、テーブル名を入れ替える

特徴:

  • テーブル全体のコピーが必要なため、大規模テーブルでは処理時間が長い
  • コピー中はテーブルロックが発生するため、書き込みがブロックされる
  • ディスク容量が一時的に倍必要になる
sql
ALTER TABLE large_table ADD COLUMN new_col VARCHAR(255), ALGORITHM=COPY;

Inplace 方式

Inplace 方式は、Copy 方式の欠点を改善するために導入されました。

動作原理:

  1. テーブルデータを直接変更する(テンポラリテーブルを作成しない)
  2. 変更中の DML 操作はオンラインログに記録される
  3. DDL 完了後にオンラインログを適用する

特徴:

  • テーブル全体のコピーが不要で、処理が高速
  • 大部分の操作で読み取り・書き込みが並行して可能
  • メタデータロックの取得は開始時と終了時のみ
sql
ALTER TABLE large_table ADD INDEX idx_name (column_name), ALGORITHM=INPLACE;

Instant 方式

Instant 方式は、最も新しい DDL 実行方式で、メタデータの変更のみで完了します。

動作原理:

  1. データディクショナリ内のメタデータのみを更新する
  2. 実際のテーブルデータには一切変更を加えない

特徴:

  • 瞬時に完了する(テーブルサイズに依存しない)
  • ロックの取得が最小限
  • カラムの追加(末尾への追加)など、限定的な操作にのみ対応
sql
ALTER TABLE large_table ADD COLUMN new_col INT DEFAULT 0, ALGORITHM=INSTANT;

方式の比較

項目CopyInplaceInstant
テーブルコピー必要不要不要
DML 並行実行不可可能可能
処理時間テーブルサイズに比例操作による瞬時
ディスク使用量倍必要最小限なし
対応操作すべて大部分限定的

大規模テーブルでの実践

DDL 方式の選択基準

大規模テーブル(数百GB以上)に対して DDL を実行する際は、以下の基準で方式を選択してください。

  1. Instant が使用可能な場合は Instant を最優先で使用する
  2. Inplace が使用可能な場合は Inplace を使用する
  3. 上記が使用できない場合にのみ Copy を検討する

ベストプラクティス

事前確認

DDL を実行する前に、以下の確認を行ってください。

sql
-- テーブルサイズの確認
SELECT 
    table_name,
    ROUND(data_length / 1024 / 1024 / 1024, 2) AS data_size_gb,
    ROUND(index_length / 1024 / 1024 / 1024, 2) AS index_size_gb
FROM information_schema.tables
WHERE table_schema = 'your_database'
AND table_name = 'your_table';

-- 実行中のトランザクションの確認
SELECT * FROM information_schema.innodb_trx;

低負荷時間帯での実行

  • 大規模テーブルの DDL はピーク時間帯を避けて実行する
  • 実行前にレプリケーションの遅延状況を確認する

段階的な実行

複数のカラム追加が必要な場合は、1つの ALTER TABLE 文にまとめることを推奨します。

sql
-- 推奨:1つの文にまとめる
ALTER TABLE large_table 
    ADD COLUMN col1 VARCHAR(100),
    ADD COLUMN col2 INT DEFAULT 0,
    ADD COLUMN col3 DATETIME;

-- 非推奨:個別に実行する
ALTER TABLE large_table ADD COLUMN col1 VARCHAR(100);
ALTER TABLE large_table ADD COLUMN col2 INT DEFAULT 0;
ALTER TABLE large_table ADD COLUMN col3 DATETIME;

分散環境での注意事項

TDSQL Boundless の分散環境では、DDL 操作が各ノードで順次実行されるため、以下の点に注意が必要です。

  • DDL の完了時間はノード数に応じて増加する可能性がある
  • 各ノードでのメタデータロックの伝播にタイムラグが生じる場合がある
  • 大規模な DDL 操作の前にはバックアップを取得することを推奨する

まとめ

Online DDL は Copy → Inplace → Instant と進化し、スキーマ変更の影響を最小限に抑える技術が向上してきました。TDSQL Boundless 環境では、分散ノード特有の考慮事項がありますが、適切な方式の選択と事前準備により、安全かつ効率的なスキーマ変更が可能です。

詳細な仕様およびパラメータについては、元ドキュメントをご参照ください。

Tencent Cloud プロダクトドキュメント