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

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

最終更新日:Mar 28, 2026

ロックフリーの DDL (データ定義言語) 変更により、スキーマ変更中のテーブルロックを防ぐことができます。これにより、テーブルがロックされることによるビジネスの中断を回避し、ネイティブのオンライン DDL で発生する可能性のあるプライマリ/スタンバイ間のレイテンシーを解消します。オフピーク時にロックフリーの変更を送信できます。

背景情報

大規模なテーブルのスキーマを変更すると、テーブルがロックされ、アプリケーションからの書き込み操作がブロックされるリスクがあります。

  • MySQL 5.5 以前では、DDL (データ定義言語) 操作は Table-Copy または In-Place の 2 つのアルゴリズムのいずれかを使用します。

    • Table-Copy:このアルゴリズムは、一時テーブルを作成して変更を完了します。このプロセス中、元のテーブルはロックされ、書き込み操作が妨げられます。

    • In-Place:MySQL 5.5 で導入されたこのアルゴリズムは、変更中の読み取りおよび書き込み操作を許可しますが、インデックス関連の操作のみをサポートします。

  • MySQL 5.6 以降では、DDL には Innodb-OnlineDDL も含まれます。Innodb-OnlineDDL の詳細については、「Innodb-OnlineDDL」をご参照ください。

    Innodb-OnlineDDL は、add columndrop columnrename columnadd indexmodify index などの幅広い DDL 操作をサポートしますが、modify column typemodify column lengthmodify character set などの一部の一般的な操作は対象外です。

利用シーン

  • データベーステーブルのスキーマを変更します。

  • テーブルの文字セットと照合順序を変更するか、タイムゾーンの修正を実行します。

  • OPTIMIZE TABLE 操作を使用して、テーブルをロックせずにテーブルスペースを再利用し、断片化を削減します。詳細については、「ロックフリーのスキーマ変更による断片化された領域の再利用」をご参照ください。

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

ApsaraDB RDS for MySQLPolarDB for MySQLMyBase for MySQL、およびその他の MySQL ソース。

主な特徴

  • ネイティブのデータベース操作と比較して、Data Management Service (DMS) のロックフリーのスキーマ変更では、変更の実行速度を制御できます。これにより、データベースパフォーマンスへの影響を最小限に抑え、プライマリ/スタンバイ間のレイテンシーを防ぎ、ネイティブのオンライン DDL がテーブルをロックする多くのシナリオをサポートします。

  • PT-OnlineOSC などの他のツールと比較して、DMS のロックフリーのスキーマ変更はトリガーに依存しません。その非同期実行はデータベースへの影響が最小限であり、いつでも安全に中断できます。

  • DMS のロックフリーのスキーマ変更は DTS と互換性があります。変更中のテーブルに Data Transmission Service (DTS) のテーブルレベルのレプリケーションリンクがある場合、DMS のロックフリーのスキーマ変更を使用しても DTS レプリケーションは中断されません。

    説明

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

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

    操作

    MySQL 5.5 以前

    MySQL 5.6 以降

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

    列の追加

    N

    Y

    Y

    列の削除

    N

    Y

    Y

    列名の変更

    N

    Y

    Y

    インデックスの追加

    N

    Y

    Y

    インデックスの変更

    N

    Y

    Y

    デフラグメンテーション

    N

    Y

    Y

    列の型の変更

    N

    N

    Y

    列の長さの変更

    N

    N

    Y

    文字セットの変更

    N

    N

    Y

    文字変換

    N

    N

    Y

    タイムゾーンの修正

    N

    N

    Y

    スタンバイレイテンシーの軽減または解消

    N

    N

    Y

    一意キーの追加

    Y

    Y

    N

    制約の追加

    Y

    Y

    N

    • N:非対応

    • Y:対応

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

注意事項

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

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

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

  • プライマリキーまたは一意キーのみを持つテーブルでロックフリーのスキーマ変更を行う間、これらのキーを更新することはできません。更新すると、変更タスクは失敗します。

仕組み

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

  1. 一時テーブルの作成。DMS は、ターゲットデータベースに元のテーブルのスキーマをミラーリングした一時テーブルを作成し、データコピーの準備をします。

    SQL 構文:CREATE TABLE tmp_table_name LIKE table_name

  2. 一時テーブルのスキーマの変更。DMS は、指定された変更に従って一時テーブルのスキーマを変更します。

    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 は、コピープロセス中に元のテーブルに加えられた変更を一時テーブルに同期します。

    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_{ChangeID}_ogt_{OriginalTableName} または tp_{ChangeID}_g_{OriginalTableName}

  • ハートビートテーブル:tp_{ChangeID}_ogl_{OriginalTableName} または tp_{ChangeID}_l_{OriginalTableName}

  • 切り替え前の補助テーブルと切り替え後の元のテーブル:tp_{ChangeID}_del_{OriginalTableName} または tp_{ChangeID}_d_{OriginalTableName}

  • テーブルロック検出テーブル: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;