スキームの変更によって引き起こされるテーブルロックは、ビジネスにとって危険です。 この問題を解決するために、データベース管理 (DMS) は、トリガーレス設計を採用したロックフリーDDL機能を提供しています。 この機能により、テーブルをロックすることなく、大きなテーブルのスキーマを変更できます。 このトピックでは、いくつかのロックフリースキーマ変更ソリューションを比較します。
オンライン環境では、テーブルに対してDDL操作を直接実行しないことをお勧めします。 次のソリューションを使用して、DDL操作によるビジネスへの影響を防ぐことができます。
オフピーク時にテーブルを変更します。
オフピーク時にテーブルを変更するための適切で十分な期間を指定します。 ただし、過度に大きなテーブルで指定された期間内に変更操作が完了しない場合でも、ビジネスは影響を受けます。
セカンダリデータベースのテーブルを変更し、プライマリデータベースとセカンダリデータベースの切り替えを実行します。
適切な期間にデータベースを切り替える前に、プライマリデータベースとセカンダリデータベースを作成する必要があります。
オンラインスキーマ変更ツール:
pt-online-schema-change: テーブルAを変更する場合、このツールはテーブルA_gstという名前の一時テーブルを作成し、テーブルA_gstに対してDDL操作を実行します。 さらに、このツールはテーブルaでDMLトリガーを作成し、テーブルAからテーブルA_gstにデータをコピーします。 テーブルAからテーブルA_gstにデータをコピーするプロセスにおいて、DMLトリガは、テーブルAへの増分変更を捕捉し、その変更をテーブルA_gstに同期的に適用する。 データがテーブルAからテーブルA_gstにコピーされた後、このツールはテーブルA_gstの名前をテーブルAの後に変更します。
オンラインスキーマ変更 (OSC): このツールは、基本的にpt-Online-Schema-Changeツールと同じように機能します。 違いは、このツールが非同期設計を採用していることです。 ログテーブルは、テーブルA_gstに基づいて作成されます。 テーブルAへの変更は、DMLトリガによってキャプチャされ、ログテーブルに記録されます。 次に、バックエンドプロセスは、ログテーブルに記録された変更をテーブルA_gstに適用します。 プロセス全体が非同期です。 したがって、テーブルA_gstに変更を適用するプロセスを管理できます。
gh-ost: このツールは基本的に前の2つのツールと同じように動作します。 ただし、このツールはトリガーを使用しません。 代わりに、このツールはバイナリログを使用して増分テーブルの変更をキャプチャします。 このツールは、バイナリログに記録されたテーブルAの変更を読み取ります。 次に、このツールはテーブルA_gstの変更を分析して適用します。 バイナリログにはテーブルAへの変更のみが含まれているため、これらの変更を取得してテーブルA_gstに簡単に適用できます。
説明トリガーの詳細については、このトピックの「トリガーベースとトリガーレスのデザインの比較」をご参照ください。
DMSのロックフリースキーマ変更機能とgh-ostツールの比較の詳細については、このトピックの「DMSのロックフリースキーマ変更機能とgh-ostツールの比較」をご参照ください。
トリガーベースとトリガーレスのデザインの比較
トリガーベースのデザイン
トリガーベースのツールには、単純なコードロジックがあります。 ほとんどの場合、トリガーを使用してデータを処理できます。 たとえば、トリガーを使用してデータを暗黙的に処理し、データ型を変換できます。 これにより、テーブルデータをリアルタイムで移行する複雑なプロセスが簡素化されます。
Triggerlessデザイン
トリガーレス設計の主な利点は、データベースワークロードの分離です。 トリガーベースの設計では、各DML操作を元のテーブルから一時テーブルに同期または非同期で同期します。 トリガレス設計では、一時テーブルにデータを書き込むプロセスは、元のテーブルにデータを書き込むプロセスから切り離される。
項目 | トリガーベースのデザイン | Triggerlessデザイン |
データベースのオーバーヘッド | トリガーはストアドプロシージャです。 ビジネスが発展するにつれて、より多くのDML運用が必要になります。 これにより、特にピーク時にトリガーを使用して生成されるオーバーヘッドが増加します。 | トリガーベースのオーバーヘッドは生成されません。 トリガーレスツールは、プライマリおよびセカンダリデータベースのバイナリログを読み取り、元のテーブルのイベントを一時テーブルに適用するレプリケートサーバーとして機能します。 このプロセスは、元のテーブルの変更とは関係がなく、データベースのストアドプロシージャを必要としません。 |
ロック競合 | トリガーは、同じトランザクション内の元のテーブルと一時テーブルで実行される操作をグループ化します。 この場合、2つのテーブルに対する同時動作は、同じオブジェクトに対するロックを取得することができる。 これは、ロック競合を激化させる。 さらに、トリガーベースのツールは、データのコピーとデータの変更を同時に行う必要があります。 これは、ロック競合をさらに激化させる。 | 一時テーブルにデータを書き込むプロセスは、元のテーブルにデータを書き込むプロセスとは分離されている。 これにより、ロック競合が防止される。 さらに、ロック競合を論理的に防止および低減するために、DMSは、異なる期間に一時テーブル内のデータをコピーおよび更新する。 これはテーブル変更の効率に影響しますが、データベースの負荷を大幅に削減します。 |
例外処理 | トリガーベースのデザインでは、トリガーは実行し続ける必要があり、中断することはできません。 プライマリデータベースとセカンダリデータベース間の同期のピーク時間、例外、待ち時間にもかかわらず、スキーマの変更中はいつでもトリガーをキャンセルすることはできません。 強制キャンセルは、スキーマ変更を中断するか、データ損失を引き起こします。 これは、テーブルA_gstのデータ精度に影響します。 | デカップリング機能を使用すると、バイナリログの取得に使用されるスレッドをいつでも中断またはスローダウンできます。 ピーク時またはプライマリデータベースとセカンダリデータベース間の同期の遅延が大きい場合は、実行中のアプリケーションに対してスロットリングを有効にできます。 これはさらなる問題を防ぐのに役立ちます。 |
信頼性検証 | ソリューションを確認するには、タスクの期間を確認する必要があります。 トリガーベースのソリューションでSQL文を実行してデータを複製する場合、トリガーを作成して使用し、セカンダリデータベースでのデータ複製をシミュレートできます。 ただし、データが行に基づいてレプリケートされる場合、セカンダリデータベースでトリガーは必要ありません。 これは、トリガーがプライマリデータベースでのみ実行され、セカンダリデータベースが変更を直接適用するためです。 さらに、SQL文を実行してデータをレプリケートしても、プライマリデータベースでの同時レプリケーションプロセスをシミュレートすることはできません。 これは、MySQLデータベースが単一のスレッドを使用してレプリケーションプロセスを再生するためです。 したがって、並行性とロックの問題を検証またはテストすることはできません。 | プライマリおよびセカンダリデータベースでのバイナリログベースの操作とオンライン操作に違いはありません。 また、セカンダリデータベースでデータ変更プロセスをシミュレートする場合、元のテーブルと一時テーブルは切り替えられません。 これにより、元のテーブルと一時テーブルの両方のデータをチェックすることで、信頼性を引き続き検証できます。 |
コードの複雑さ | トリガーベースの設計では、ほとんどのタスクはデータベースによって実行され、トリガーは同期を担当します。 したがって、ツールは比較的小さな役割を果たします。 | triggerlessデザインは、バイナリログを使用してデータを同期します。 この方法は柔軟であるが複雑である。 トリガーレスツールは、複製サーバーとして登録し、元のテーブルのイベントを取得し、イベントをSQL文に変換してから、SQL文を実行してイベントを一時テーブルに適用する必要があります。 triggerlessツールのコードには、接続障害、レプリケーション待ち時間、データタイプの不一致、アプリケーションへの不適切な負荷、制御不能な例外などの例外の処理方法が組み込まれています。 したがって、トリガレスツールは、より大きなコードベースと、同時実行制御のためのより複雑なロジックを有する。 |
ネットワークトラフィック | トリガーベースの設計では、データはデータベース内で処理されます。 | トリガーレス設計では、ツールがソーステーブルへの変更をキャプチャし、バイナリログに基づいて記録された変更をターゲットテーブルに適用する必要があります。 これにより、ホスト間のトラフィックが生成され、MySQLプロセスが占有されます。 さらに、堅牢で安定したコードロジックを確保するために、コードを厳密に開発し、豊富なテストを実行する必要があります。 前述の課題にもかかわらず、トリガレス設計は実質的な利点を提供する。 たとえば、一時テーブルと元のテーブルの名前を交換するタイミングを指定できます。 データレプリケーションのプロセスを管理し、スロットリングを実装できます。 |
DMSのロックフリースキーマ変更機能とgh-ostツールの比較
次の表に、DMSのロックフリースキーマ変更機能とgh-ostツールの比較を示します。
項目 | DMSのロックフリースキーマ変更機能 | gh-ost | |
履歴データコピー | 調整をコピー | Y: 手動または自動 | Y: マニュアル |
データ整合性検証 | Y | N | |
フォールトトレランス | Y | Y: 部分的にサポート | |
アダプティブコピー処理 | Y | N | |
増分変更のリプレイ | リプレイスロットリング | Y: 手動または自動 | Y: マニュアル |
マルチスレッド再生 | Y | N | |
データ整合性検証 | Y | N | |
フォールトトレランス | Y | Y: 部分的にサポート | |
アダプティブ再生処理 | Y | N | |
セカンダリデータベースサブスクリプション | N | Y | |
テーブルの切り替え | スイッチングの原子性 | Y | Y |
テーブルレプリカの削除の遅延 | Y | N | |
ウィンドウ切り替えの設定 | Y | Y | |
ロック保護メカニズム | Y | N | |
機能 | セカンダリデータベースの変更 | N | Y |
データ伝送サービス (DTS) とのシームレスな统合 | Y | N | |
DDLアルゴリズム認識に基づくポリシー変更の設定 | Y | N | |
RocksDBエンジン | Y | N | |
TokuDBエンジン | Y | N | |
InnoDBエンジン | Y | Y | |
仮想列の変更 | Y | N | |
JSON列の変更 | Y | Y | |
多値インデックスと関数インデックス | Y | - | |
テーブルスペースの最適化 | Y | N | |
テーブルレプリカの削除の遅延 | Y | N | |
インストールとデプロイ | Y: インストールフリー | Y: データベースサーバへのインストール | |
視覚化されたO&M | Y | N | |
実行の進行状況の可視化 | Y | N |
Y: 機能がサポートされていることを示します。
N: 機能がサポートされていないことを示します。
-: 機能がサポートされているかどうかが不明であることを示します。