ロックフリーのデータ定義言語 (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 タイプはサポートしていません。
利用シーン
データベーステーブルのスキーマを変更する。
テーブルの文字セットと照合順序を変更するか、タイムゾーンを調整する。
領域を再利用し、断片化率を低減する `OPTIMIZE TABLE` 操作によるテーブルロックを回避する。詳細については、ロックフリーのスキーマ変更を使用して領域の断片化を解消するをご参照ください。
サポートされるデータベースタイプ
RDS MySQL、PolarDB for MySQL、MyBase 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 は自動的に次の手順を実行して、テーブルをロックせずに変更を完了します。
一時テーブルの作成。DMS は、ソーステーブルのスキーマをミラーリングする新しいテーブルを作成します。
SQL 構文は
CREATE TABLE tmp_table_name LIKE table_nameです。一時テーブルのスキーマ変更。DMS は、リクエストされた DDL 変更を一時テーブルに適用します。
SQL 構文は
ALTER TABLE tmp_table_name XXXXです。完全データのコピー。DMS は、ソーステーブルから一時テーブルにすべてのデータをコピーします。
SQL 構文は
INSERT IGNORE INTO tmp_table_name (SELECT %s FROM table_name FORCE INDEX (%s) WHERE XXX LOCK IN SHARE MODE)です。binlog を解析して増分データを同期。DMS は、ソーステーブルの binlog からの進行中の変更を一時テーブルに適用します。
SQL 構文は
UPDATE/INSERT/DELETE tmp_table_nameです。テーブルのスワップ。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 ではありません。
関連ドキュメント
ロックフリーのスキーマ変更について学習した後、次の操作を実行します。
インスタンスのロックフリーのスキーマ変更機能を有効にします。詳細については、ロックフリーのスキーマ変更の有効化をご参照ください。
ロックフリーのスキーマ変更のチケットを送信します。詳細については、チケットを使用したロックフリーのスキーマ変更の実行をご参照ください。
(オプション) ロックフリーのスキーマ変更タスクの進捗状況を表示します。詳細については、ロックフリーのスキーマ変更の進捗状況の表示をご参照ください。
API を使用して、ロックフリーのスキーマ変更チケットを設定および管理することもできます。
API
説明
ロックフリーのスキーマ変更のチケットを作成します。
タスクの実行ステータスや影響を受けるデータ行数など、ロックフリーのスキーマ変更チケットタスクの詳細を取得します。
よくある質問
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;