ロックフリーの 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 column、drop column、rename column、add index、modify indexなどの幅広い DDL 操作をサポートしますが、modify column type、modify column length、modify character setなどの一部の一般的な操作は対象外です。
利用シーン
データベーステーブルのスキーマを変更します。
テーブルの文字セットと照合順序を変更するか、タイムゾーンの修正を実行します。
OPTIMIZE TABLE操作を使用して、テーブルをロックせずにテーブルスペースを再利用し、断片化を削減します。詳細については、「ロックフリーのスキーマ変更による断片化された領域の再利用」をご参照ください。
サポートされるデータベースタイプ
ApsaraDB RDS for MySQL、PolarDB for MySQL、MyBase for MySQL、およびその他の MySQL ソース。
主な特徴
ネイティブのデータベース操作と比較して、Data Management Service (DMS) のロックフリーのスキーマ変更では、変更の実行速度を制御できます。これにより、データベースパフォーマンスへの影響を最小限に抑え、プライマリ/スタンバイ間のレイテンシーを防ぎ、ネイティブのオンライン DDL がテーブルをロックする多くのシナリオをサポートします。
PT-OnlineやOSCなどの他のツールと比較して、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 は自動的に以下の手順を実行して、テーブルをロックせずに変更を実行します:
一時テーブルの作成。DMS は、ターゲットデータベースに元のテーブルのスキーマをミラーリングした一時テーブルを作成し、データコピーの準備をします。
SQL 構文:
CREATE TABLE tmp_table_name LIKE table_name。一時テーブルのスキーマの変更。DMS は、指定された変更に従って一時テーブルのスキーマを変更します。
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 は、コピープロセス中に元のテーブルに加えられた変更を一時テーブルに同期します。
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_{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 ではありません。
参考文献
ロックフリーのスキーマ変更の背景と原則を理解した後、次の操作を実行できます:
ご利用のインスタンスでロックフリーのスキーマ変更機能を有効にします。詳細については、「ロックフリーのスキーマ変更の有効化」をご参照ください。
ロックフリーのスキーマ変更チケットを送信します。詳細については、「チケットを使用したロックフリーのスキーマ変更の実行」をご参照ください。
(オプション) ロックフリー変更タスクの進捗状況を表示します。詳細については、「ロックフリー変更の進捗状況の表示」をご参照ください。
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;