元ドキュメント: Online DDL の技術進化と実践
Online DDL の技術進化と実践
概要
Online DDL(オンラインデータ定義言語)は、テーブルのスキーマ変更を実行中のワークロードに対して最小限の影響で実施するための技術です。TDSQL Boundless は MySQL 互換の Online DDL 機能を提供しつつ、分散環境に最適化された拡張を行っています。
本ドキュメントでは、Online DDL の3つの主要方式の技術的進化と、大規模テーブルでの実践的な使用方法について解説します。
Online DDL の3つの方式
Copy 方式
Copy 方式は、最も伝統的な DDL 実行方式です。
動作原理:
- 新しいテーブル構造でテンポラリテーブルを作成する
- 元テーブルから新テーブルへデータをコピーする
- コピー完了後、テーブル名を入れ替える
特徴:
- テーブル全体のコピーが必要なため、大規模テーブルでは処理時間が長い
- コピー中はテーブルロックが発生するため、書き込みがブロックされる
- ディスク容量が一時的に倍必要になる
sql
ALTER TABLE large_table ADD COLUMN new_col VARCHAR(255), ALGORITHM=COPY;Inplace 方式
Inplace 方式は、Copy 方式の欠点を改善するために導入されました。
動作原理:
- テーブルデータを直接変更する(テンポラリテーブルを作成しない)
- 変更中の DML 操作はオンラインログに記録される
- DDL 完了後にオンラインログを適用する
特徴:
- テーブル全体のコピーが不要で、処理が高速
- 大部分の操作で読み取り・書き込みが並行して可能
- メタデータロックの取得は開始時と終了時のみ
sql
ALTER TABLE large_table ADD INDEX idx_name (column_name), ALGORITHM=INPLACE;Instant 方式
Instant 方式は、最も新しい DDL 実行方式で、メタデータの変更のみで完了します。
動作原理:
- データディクショナリ内のメタデータのみを更新する
- 実際のテーブルデータには一切変更を加えない
特徴:
- 瞬時に完了する(テーブルサイズに依存しない)
- ロックの取得が最小限
- カラムの追加(末尾への追加)など、限定的な操作にのみ対応
sql
ALTER TABLE large_table ADD COLUMN new_col INT DEFAULT 0, ALGORITHM=INSTANT;方式の比較
| 項目 | Copy | Inplace | Instant |
|---|---|---|---|
| テーブルコピー | 必要 | 不要 | 不要 |
| DML 並行実行 | 不可 | 可能 | 可能 |
| 処理時間 | テーブルサイズに比例 | 操作による | 瞬時 |
| ディスク使用量 | 倍必要 | 最小限 | なし |
| 対応操作 | すべて | 大部分 | 限定的 |
大規模テーブルでの実践
DDL 方式の選択基準
大規模テーブル(数百GB以上)に対して DDL を実行する際は、以下の基準で方式を選択してください。
- Instant が使用可能な場合は Instant を最優先で使用する
- Inplace が使用可能な場合は Inplace を使用する
- 上記が使用できない場合にのみ 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 環境では、分散ノード特有の考慮事項がありますが、適切な方式の選択と事前準備により、安全かつ効率的なスキーマ変更が可能です。
詳細な仕様およびパラメータについては、元ドキュメントをご参照ください。