DTS が提供するリアルタイム同期機能は、トリガーと完全な互換性がありません。同期対象のオブジェクトがデータベース全体で、そのデータベースに同期テーブルを更新するトリガーが含まれている場合、同期データの整合性がとれていない可能性があります。
たとえば、同期データベースが jiangliu_trigger_test で、このデータベースに parent と child という 2 つのテーブルが含まれているとします。トリガーは parent テーブルにあります。行が parent テーブルに挿入されると、行は child テーブルに挿入されます。この場合、同期の初期化により、これら 2 つのテーブルとトリガーはターゲットインスタンスに移行されます。同期中、ソースインスタンスの parent テーブルで挿入操作が実行された場合、child テーブルのデータはソースインスタンスとターゲットインスタンスの間で一致しません。
parent テーブルは次のように定義されているとします。
CREATE TABLE `parent` (
`user_vs_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`user_vs_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2001 DEFAULT CHARSET=utf8
child テーブルは次のように定義されています。
CREATE TABLE `child` (
`sys_child_id` int(11) NOT NULL AUTO_INCREMENT,
`user_vs_id` int(11) DEFAULT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`sys_child_id`)
parent テーブルのトリガーは次のとおりです。
CREATE DEFINER= `dts`@`%` trigger data_check after
insert on parent for each row begin
insert into child(user_vs_id, name) values(new.user_vs_id, new.name) ;end
この問題を解決するには、ターゲットインスタンスの data_check トリガーを削除する必要があります。child テーブルのデータは、ソースインスタンスから同期されます。このトピックでは、データの不整合を回避するため、トリガーが存在する場合の同期リンクの設定方法について説明します。
トリガーが存在する場合の同期リンクの設定手順は次のとおりです。
オブジェクト構造移行
DTS コンソールにログインし、オブジェクト構造移行専用の移行タスクを作成し、同期対象のオブジェクトのすべてのオブジェクト構造をターゲットデータベースに移行します。
DTS コンソールにログインします。
DTS コンソールにログインし、右上の [移行タスクの作成] をクリックし、オブジェクト構造移行タスクを作成します。
インスタンス接続を設定します。
移行タスク名と、ソースインスタンスとターゲットインスタンスの接続情報を設定します。具体的には、次のとおりです。
ソースとターゲットのインスタンスタイプに RDS インスタンスを選択します。
移行タイプと移行オブジェクトを選択します。
移行タイプとしてオブジェクト構造移行のみを選択します。オブジェクト構造をターゲット RDS インスタンスに移行するだけでよいため、既存データ移行と変更データレプリケーションを選択しないでください。
事前チェックを実行します。
事前チェックが完了したら、オブジェクト構造移行を開始します。
ターゲットインスタンスのトリガーの削除
オブジェクト構造移行が完了したら、次の SQL 文を実行して、ターゲット RDS インスタンスに移行されたトリガーを手動で削除します。
show triggers;
drop trigger data_check;
data_check は、削除するトリガーです。
同期リンクの作成
トリガーがターゲットインスタンスから削除された後、同期リンクの作成を開始できます。
オブジェクト構造が既に移行されているため、同期初期化には既存データ初期化を選択する必要があります。
次のように同期リンクを設定します。
データ同期ページにアクセスし、右上の [同期タスクの作成] をクリックして、同期リンクを購入します。同期リンクの準備ができたら、DTS コンソールに戻り、リンクの右側にある [同期リンクの設定] をクリックして設定します。
インスタンス情報の設定
移行タスク名を設定し、ソースインスタンスとターゲットインスタンスの接続を設定します。具体的には、次のとおりです。
- タスク名
デフォルトでは、各タスクに自動的に名前が生成されます。タスク名は一意である必要はありません。名前は変更可能です。識別しやすい名前を使用することを推奨します。
ソースインスタンスの接続情報
- インスタンスタイプ:[RDS インスタンス] を選択します。
- RDS インスタンス ID:RDS インスタンスの ID を設定します。
- データベースアカウント:RDS インスタンスにアクセスするためのアカウントです。
- データベースのパスワード:上記のデータベースアカウントのパスワードです。
ターゲットインスタンス接続
- インスタンスタイプ:[RDS インスタンス] を選択します。
- RDS インスタンス ID:RDS インスタンスの ID を設定します。
- データベースアカウント:RDS インスタンスにアクセスするためのアカウントです。
- データベースのパスワード:上記のデータベースアカウントのパスワードです。
同期オブジェクトの選択
このステップで同期オブジェクトを選択します。選択する同期オブジェクトは、上記のオブジェクト構造移行のオブジェクトと一致している必要があります。
同期の初期化
注:ここでは、既存データ初期化のみを選択してください。前述のオブジェクト構造移行が完了した後、同期オブジェクトの構造定義はターゲット RDS インスタンスに移行されているため、オブジェクト構造初期化を選択しないでください。
事前チェック
事前チェックが成功したら、同期タスクを開始できます。
同期リンクの設定が完了しました。
データ整合性
ソースデータベースの parent テーブルにレコードを挿入します。
insert into parent values(1,'jiangliu');
child テーブルのデータがソースデータベースとターゲットデータベースの間で整合性がとれているかどうかを確認します。
ソースインスタンスとターゲットインスタンスの child テーブルに対して、別々にデータをクエリします。
select * from child;
結果は次のとおりです。
- ソースデータベース:
- ターゲットデータベース:
同期データの整合性がとれていることがわかります。