すべてのプロダクト
Search
ドキュメントセンター

Data Management:ロックフリーのスキーマ変更

最終更新日:Apr 09, 2026

ロックフリーのデータ定義言語 (DDL) 変更により、スキーマ変更中のテーブルロックを防ぎます。これにより、ネイティブのオンライン DDL 操作に起因するビジネスの中断やレプリケーションラグを回避できます。

背景情報

大規模なテーブルでスキーマ変更を実行する場合、テーブルロックによって書き込み操作がブロックされるリスクを考慮する必要があります。

  • MySQL 5.5 以前のバージョンでは、DDL は Table-Copy と In-Place の 2 つの実行アルゴリズムをサポートしています。

    • Table-Copy:このアルゴリズムは、データを一時テーブルにコピーし、変更が完了するまでソーステーブルをロックして書き込み操作を禁止します。

    • In-Place (MySQL 5.5 以降で利用可能):このアルゴリズムは、操作中に読み取りおよび書き込み操作を許可しますが、インデックス関連の操作のみをサポートします。

  • MySQL 5.6 以降のバージョンでは、Innodb-OnlineDDL も導入されました。Innodb-OnlineDDL の詳細については、Innodb-OnlineDDL をご参照ください。

    この機能は、列の追加/削除、列名の変更、インデックスの追加/変更など、幅広い DDL タイプをカバーしています。ただし、列のデータ型の変更、列の長さの変更、文字セットの変更など、一部の一般的な DDL タイプはサポートしていません。

利用シーン

サポートされるデータベースタイプ

RDS MySQLPolarDB for MySQLMyBase for MySQL、およびその他の MySQL 互換データベース。

特徴

  • ネイティブのデータベース操作とは異なり、DMS のロックフリーのスキーマ変更機能では、実行速度を制御できます。これにより、レプリケーションラグを防ぎ、データベースパフォーマンスへの影響を最小限に抑え、ネイティブのオンライン DDL では通常テーブルをロックするような変更をサポートします。

  • pt-online-schema-change や OSC などのツールとは異なり、DMS のロックフリーのスキーマ変更機能はトリガーに依存しません。非同期で実行され、データベースへの影響は最小限であり、いつでも安全に中断できます。

  • DMS のロックフリーのスキーマ変更機能は、Data Transmission Service (DTS) との互換性が高く、テーブルレベルの DTS レプリケーションリンクを中断しません。

    説明

    DTS レプリケーションリンクは、2020 年 2 月 14 日以降に再起動されている必要があります。

  • 次の表は、ネイティブの MySQL オンライン DDL と DMS のロックフリーのスキーマ変更機能の比較です。

    操作

    MySQL 5.5 以前

    MySQL 5.6 以降

    DMS ロックフリーのスキーマ変更

    列の追加

    列の削除

    列名の変更

    インデックスの追加

    インデックスの変更

    テーブルのデフラグ

    列のデータ型の変更

    列の長さの変更

    文字セットの変更

    文字セットの変換

    タイムゾーンの調整

    読み取り専用レプリカの遅延の緩和または解消

    一意キーの追加

    制約の追加

    重要

    DMS のロックフリーのスキーマ変更機能を使用して一意キーまたは制約を追加する場合、ソーステーブル内の新しい一意キーまたは制約に違反するデータは、一時テーブルへのコピープロセス中に MySQL によって自動的に破棄されることにご注意ください。

DMS のロックフリーのスキーマ変更機能と他のソリューションとの比較については、ロックフリーのスキーマ変更ソリューションの比較をご参照ください。

注意事項

  • DMS は、既存のパーティションテーブルのスキーマ変更をサポートしています。

  • 単一のロックフリーのスキーマ変更チケットを使用して、同じデータベース内の複数のテーブルを変更できます。

    チケットの SQL ステートメントを設定する際、異なるテーブルのステートメントをセミコロン (;) で区切ることができます。

  • テーブル上の唯一のキーである場合、ロックフリーのスキーマ変更中にテーブルのプライマリキーまたは一意キーを更新することはできません。これを試みると、タスクは失敗します。

仕組み

ロックフリーのスキーマ変更チケットを送信すると、DMS は自動的に次の手順を実行して、テーブルをロックせずに変更を完了します。

  1. 一時テーブルの作成。DMS は、ソーステーブルのスキーマをミラーリングする新しいテーブルを作成します。

    SQL 構文は CREATE TABLE tmp_table_name LIKE table_name です。

  2. 一時テーブルのスキーマ変更。DMS は、リクエストされた DDL 変更を一時テーブルに適用します。

    SQL 構文は ALTER TABLE tmp_table_name XXXX です。

  3. 完全データのコピー。DMS は、ソーステーブルから一時テーブルにすべてのデータをコピーします。

    SQL 構文は INSERT IGNORE INTO tmp_table_name (SELECT %s FROM table_name FORCE INDEX (%s) WHERE XXX LOCK IN SHARE MODE) です。

  4. binlog を解析して増分データを同期。DMS は、ソーステーブルの binlog からの進行中の変更を一時テーブルに適用します。

    SQL 構文は UPDATE/INSERT/DELETE tmp_table_name です。

  5. テーブルのスワップ。DMS は、ソーステーブルをバックアップ名に、一時テーブルを元のテーブル名にアトミックに名前変更します。

    SQL 構文は RENAME TABLE table_name to old_tmp_table_name, tmp_table_name to table_name です。

説明

`tmp_table_name` は一時テーブル名の例です。特定の一次テーブル名は、ロックフリーのスキーマ変更タスクの進捗エリアで確認できます。詳細については、ロックフリーのスキーマ変更の進捗状況の表示をご参照ください。

一時テーブル名のフォーマットは次のとおりです。

  • データテーブル:tp_{change_ID}_ogt_{original_table_name}、tp_{change_ID}_g_{original_table_name}

  • ハートビートテーブル:tp_{change_ID}_ogl_{original_table_name}、tp_{change_ID}_l_{original_table_name}

  • スイッチオーバー前の補助テーブルとスイッチオーバー後の元のテーブル:tp_{change_ID}_del_{original_table_name}、tp_{change_ID}_d_{original_table_name}

  • テーブルロック検出:tpa_xxx_xxx

説明

変更 ID は、内部 DMS エンジンの実行 ID です。チケット ID やタスク ID ではありません。

関連ドキュメント

よくある質問

  • Q:ロックフリーのスキーマ変更はサービスに影響しますか?

    A:通常、ロックフリーのスキーマ変更はサービスに影響しません。このプロセスにはデータコピーが含まれるため、インスタンスのパフォーマンスに影響を与える可能性があります。

  • Q: ロックフリースキーマ変更のチケットで CREATE_INDEX を使用してインデックスを追加しようとしたところ、エラーが発生しました。DMS はインデックスの追加をサポートしていませんか?

    A: はい、DMS はインデックスの追加をサポートしています。次の ALTER TABLE 文を実行してインデックスを追加してください:

    ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) ;
  • Q: ロックフリースキーマ変更チケットで rename column を使用して列名を変更しようとしたところ、エラーが発生しました。DMS では列名の変更をサポートしていませんか?

    A: はい、DMS は列名の変更をサポートしています。列名を変更するには、次の ALTER TABLE 文を実行します:

    ALTER TABLE table_name CHANGE COLUMN old_column_name new_column_name datatype;