ソースデータベース内のトリガーが同期または移行対象のテーブルを更新すると、DTS は増分データフェーズより前にトリガーをターゲットデータベースにコピーする可能性があり、その結果、ソースとターゲットの間でデータの不整合が発生します。本トピックでは、この問題を防止するための DTS タスク実行時のトリガー対応方法について説明します。
前提条件
開始する前に、以下の点をご確認ください。
ソースおよびターゲットのデータベースタイプがサポートされています。詳細については、「サポートされるデータベースタイプ」セクションをご参照ください。
DTS インスタンスの設定時に、スキーマ同期/移行および増分データ同期/移行の両方が選択されていること:
データ移行: [スキーマ移行] および [増分データ移行] を [移行タイプ] として選択します。
データ同期:「同期タイプ」では 増分データ同期 がデフォルトで選択されています。また、スキーマ同期 も選択してください。
ソースオブジェクト が、データベース全体またはスキーマ全体に設定されていること。
サポートされるデータベースタイプ
| ソース | 宛先 | 自動移行動作 |
|---|---|---|
| MySQL、PolarDB for MySQL、ApsaraDB RDS for MariaDB | MySQL、PolarDB for MySQL、ApsaraDB RDS for MariaDB | DTS は、ターゲットデータベース内の各トリガーにトリガー制御文を追加します。この制御文により、DTS の書き込みフェーズ中にトリガーが実行されなくなります。詳細については、「自動移行の仕組み」をご参照ください。 |
| SQL Server | SQL Server | DTS はトリガーをターゲットデータベースにコピーします。 重要 ソースデータベースにおける増分変更によって、ソースおよびターゲットの両方のデータベース内のトリガーが同時にデータを更新した場合、ターゲットデータベースにダーティデータが発生する可能性があります。SQL Server をソースとする場合は、「手動移行」を選択し、その後の操作を行ってください。 |
ターゲットデータベースが PostgreSQL、PolarDB for PostgreSQL、または PolarDB for PostgreSQL (Compatible with Oracle) の場合、DTS はデータの不整合を自動的に防止します。
DTS インスタンスが特権またはスーパーパーミッションを持つターゲットデータベースアカウントを使用している場合、DTS はトリガーの同期または移行後に、セッションレベルでトリガーを無効化します。
アカウントに十分な権限がない場合は、タスク実行中のみ、ターゲットデータベースでsession_replication_roleパラメーターをreplicaに設定してください。その他のトリガーを含むデータベースタイプについては、「トリガーを含むソースデータベース向けのデータ同期タスクの設定」をご参照ください。
移行方法の選択
DTS インスタンスの設定手順「オブジェクトの設定」で、「ソースデータベース内のトリガーの移行方法」を設定します。
以前の Data Management (DMS) コンソールバージョンを使用している場合、このオプションは「オブジェクトおよび高度な設定の設定」ステップに表示されます。
| 方法 | DTS の処理内容 | 使用タイミング |
|---|---|---|
| 自動移行 | トリガーをターゲットデータベースにコピーし、制御文を追加します。追加の操作は不要です。 | MySQL ファミリー系のソースで、トリガー制御機構が十分に機能する場合。 |
| 手動移行 | スキーマ移行時にトリガーをスキップし、「増分移行が有効であるため、オブジェクトが無視されました」というアラートを生成します。増分データ同期/移行が完了する前に、トリガーを手動で移行してください。 | SQL Server をソースとする場合。 |
自動移行の仕組み
「自動移行」を選択すると、DTS はソースデータベースからトリガーのコードをコピーし、トリガーボディを制御文でラップしたうえで、変更後のトリガーをターゲットデータベースに書き込みます。
ソースデータベースのトリガー:
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
END;ターゲットデータベースのトリガー(DTS による変更後):
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
IF (SELECT @`__#aliyun_dts_writer#__) IS NULL THEN
INSERT INTO test2 SET a2 = NEW.a1;
END IF;
END;トリガーの手動移行
トリガーの手動移行手順は、手動同期の手順と同一です。以下に手動同期の例を示します。
Data Management (DMS) コンソール にログインします。上部ナビゲーションバーで Data + AI をクリックします。左側のナビゲーションウィンドウで、DTS (DTS) > データ同期 を選択します。
新しい DTS コンソールの「データ同期タスク」ページに直接アクセスすることもできます。コンソールのレイアウトに関する情報は、「シンプルモード」および「DMS コンソールのレイアウトおよびスタイルのカスタマイズ」をご参照ください。
右側の「データ同期タスク」一覧で、データ同期インスタンスが存在するリージョンを選択します。
新しい DTS コンソールでは、上部ナビゲーションバーからリージョンを選択します。
DTS インスタンスを検索し、インスタンス ID をクリックします。
(任意)左側のペインで タスク管理 をクリックします。
「進行状況」セクションで、「増分書き込み」モジュールをクリックします。
「基本情報」タブで、「トリガーの移行」をクリックします。
「トリガーの移行」が表示されない場合、スキーマ同期または移行時にトリガーが検出されていません。トリガー同期結果を確認するには、「進行状況」セクション内の「スキーマ移行3」モジュールを確認してください。
よくある質問
DTS インスタンスの設定時に、スキーマおよび増分同期/移行タイプをどのように選択すればよいですか?
データ同期タスクの場合、「スキーマ同期」および「増分データ同期」を「同期タイプ」として選択します。データ移行タスクの場合、「スキーマ移行」および「増分データ移行」を「移行タイプ」として選択します。
増分データ同期または移行を完了するにはどうすればよいですか?
DTS インスタンスを終了、リセット、またはリリースします。詳細については、「DTS インスタンスの終了」、「DTS インスタンスのリセット」および「DTS インスタンスのリリース」をご参照ください。