データ管理 (DMS) は、テーブルをロックする必要なしにスキーマを変更するのに役立つロックフリーDDL機能を提供します。 これにより、スキーマの変更によって引き起こされるテーブルロックの影響をビジネスが受けないようにします。 これにより、ネイティブのオンラインDDL操作を使用してテーブルスキーマを変更したときに、プライマリデータベースとセカンダリデータベース間の同期遅延が発生するのを防ぎます。 オフピーク時にロックフリーの変更チケットを提出することを推奨します。
背景情報
スキーマを変更するテーブルに大量のデータが含まれている場合、スキーマを変更するときにテーブルがロックされる可能性があります。 この場合、テーブルにデータを書き込むことはできません。 MySQLは次のネイティブ機能を提供します。
MySQL 5.5以前では、テーブルコピーおよびインプレースアルゴリズムをDDL文に使用できます。
Table-Copy: システムは、一時テーブルを生成し、元のテーブルから一時テーブルにデータをコピーすることによって、テーブルのスキーマを変更します。 このプロセスでは、元のテーブルがロックされ、元のテーブルにデータを書き込むことはできません。
In-Place: MySQL 5.5以降では、In-Placeアルゴリズムを使用できます。 このアルゴリズムを使用してテーブルのインデックスを追加または変更すると、テーブルに対するデータの読み取りおよび書き込み操作がサポートされます。
MySQL 5.6以降では、InnoDBベースのオンラインDDL操作がサポートされています。 詳細については、「InnoDBおよびOnline DDL」をご参照ください。
これにより、幅広いDDL操作をオンラインで実行できます。 たとえば、列を作成、削除、または名前変更したり、インデックスを追加または変更したりできます。 ただし、一部の通常のDDL操作はサポートされていません。 たとえば、列のデータ型や長さを変更したり、文字セットをオンラインで変更したりすることはできません。
シナリオ
データベーステーブルのスキーマを変更します。
テーブルの文字セットと照合順序を変更し、タイムゾーンを調整します。
OPTIMIZE tableステートメントを実行してスペースフラグメントをリサイクルするときに発生するテーブルロックを防止します。 詳細については、「テーブルスペースフラグメントのリサイクル」をご参照ください。
サポートされるソースデータベースタイプ
ApsaraDB RDS for MySQL、PolarDB for MySQL、MyBase for MySQL、および他のソースからのMySQLデータベース
メリット
MySQLのネイティブ機能と比較して、DMSを使用すると、管理可能な速度でスキーマを変更できます。 これにより、プライマリデータベースとセカンダリデータベース間の同期の遅延が防止され、データベースのパフォーマンスへの影響が少なくなります。 さらに、ネイティブのオンラインDDL操作を使用してスキーマが変更されたときにテーブルがロックされるさまざまなシナリオにこの機能を適用できます。
pt-online-schema-changeやOnline Schema Change (OSC) などの他のツールと比較して、DMSではトリガーなしでロックフリーのスキーマ変更を実行できます。 スキーマは非同期で変更できますが、これはデータベースに与える影響が小さいです。 さらに、いつでも安全な方法でスキーマの変更を中断できます。
DMSのロックフリースキーマ変更機能は、Data Transmission Service (DTS) とシームレスに連携できます。 テーブルにDTSコピーリンクが設定されている場合、テーブルのスキーマが変更されてもテーブルコピーは中断されません。
説明DTSコピーリンクは、2020年2月14日から再起動されている必要があります。
次の表では、MySQLのオンラインDDL機能とDMSのロックフリーDDL機能を比較しています。
操作
オンラインDDL in MySQL 5.5およびそれ以前
オンラインDDL in MySQL 5.6以降
DMSでのロックフリーDDL
列の作成
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
N: 操作がサポートされていないことを示します。
Y: 操作がサポートされていることを示します。
DMSのロックフリーDDL機能と他のスキーマ変更ソリューションとの比較の詳細については、「ロックフリースキーマ変更ソリューションの比較」をご参照ください。
使用上の注意
DMSを使用すると、パーティションテーブルのスキーマを変更できます。
ロックフリースキーマ変更機能を使用して、データ変更チケットを使用して、同じデータベース内の複数のテーブルを変更できます。
スキーマ変更にSQL文を指定する場合は、異なるテーブルのSQL文をセミコロン (;) で区切ります。
スキーマを変更するテーブルに主キーまたは一意キーのみが含まれている場合、スキーマの変更中に主キーまたは一意キーを更新することはできません。 それ以外の場合、スキーマ変更タスクは失敗します。
ロックフリースキーマ変更の原理
一時テーブルを作成します。 ステートメント: CREATE TABLE tmp_table_name LIKE table_name.
一時テーブルのスキーマを変更します。 ステートメント: ALTER TABLE tmp_table_name XXXX。
元のテーブルの全データを一時テーブルにコピーします。 ステートメント: INSERT IGNORE INTO tmp_table_name (SELECT % s FROM table_name FORCE INDEX (% s) WHERE xxx。
バイナリログを使用して増分データを同期します。 ステートメント: UPDATE/INSERT/DELETE tmp_table_name
一時テーブルと元のテーブルの名前を入れ替えます。 ステートメント: RENAME TABLE table_nameからold_tmp_table_name、tmp_table_nameからtable_name。
DMSは、一時テーブルを次の形式で指定します。
データテーブル: tp_{変更ID}_ogt_{元のテーブル名} またはtp_{変更ID}_g_{元のテーブル名}
ハートビートテーブル: tp_{IDの変更}_ogl_{元のテーブル名} またはtp_{IDの変更}_l_{元のテーブル名}
切り替え前の一時テーブルと切り替え後の元のテーブル: tp_{変更ID}_del_{元のテーブル名} またはtp_{変更ID}_d_{元のテーブル名}
DMSがロックされているかどうかを確認するテーブル: tpa_xxx_xxx
変更IDはDMSエンジンの内部IDであり、チケットIDやタスクIDではありません。
関連ドキュメント
ロックフリースキーマ変更機能の背景情報と原則を理解した後、次の操作を実行できます。
インスタンスのロックフリースキーマ変更機能を有効にします。 詳細については、「ロックフリースキーマ変更機能の有効化」をご参照ください。
ロックフリーのスキーマ変更チケットを送信します。 詳細については、「ロックフリーDDL操作の実行」をご参照ください。
(オプション) ロックフリーの変更タスクの進行状況を表示します。 詳細については、「ロックフリースキーマ変更タスクの進行状況の表示」をご参照ください。
次のAPIを呼び出して、ロックフリーのスキーマ変更チケットを設定および管理することもできます。
API操作
説明
ロックフリーの変更チケットを作成します。
GetDataCorrectTaskDetail
タスクのステータスや影響を受けるデータ行数など、ロック不要の変更チケットの詳細を照会します。
よくある質問
Q: ロックフリースキーマの変更はビジネスに影響しますか?
A: ロックフリースキーマの変更中、ビジネスは影響を受けません。 ただし、ロックフリースキーマの変更中にデータがコピーされるため、インスタンスのパフォーマンスに影響があります。
Q: ロックフリーの変更チケットでCREATE_INDEXステートメントを実行してインデックスを追加するときにエラーが報告された場合はどうすればよいですか? DMSを使用してインデックスを追加できますか?
A: DMSを使用すると、インデックスを追加できます。 インデックスの追加時にエラーが報告された場合は、
ALTER TABLE 'table_name' add index index_name ( 'column' ) ;
などの別のステートメントの実行を試みることができます。