Out Of Syncはソース側でUPDATE文やDELETE文を実行した際に対象のデータが
ターゲット側でヒットしない場合に非同期に陥っていると判断し、検出します。
検出時にはターゲット側のevent_logに次のようなエラーが出力されます。
-----
Error 2013-02-25 22:11:04.872922 32313 1107929408 s:2 Table "ORAUSER1"."ORATABLE5" out of sync for queue yy-rhel55-src at source rowid AAATnjAAEAAAAMvAAB: Row Not Found (posting from ora112a, queue yy-rhel55-src, to ora112b)
-----
ここで、以下のテーブルに対して、UPDATE文を実行した場合の例を紹介します。
・ソース側のテーブル
-----------
A列 B列 C列
--- --- ---
1 2 3
-----------
・ターゲット側のテーブル
-----------
A列 B列 C列
--- --- ---
1 4 5
-----------
・ソース側で実行するUPDATE文
update <table_name> set A列=6 where A列=1;
本UPDATE文を実行した場合、WHERE句にて指定したA列の値がPrimaryキー等、
ユニークなキー(記事 4369458)であるかどうかによって以下のように挙動が異なります。
▼A列がPrimaryキーなどユニークなキーである(表にユニークなキーの(一つまたは複数の列から成る)列を持つ)場合
ターゲット側で下記のようなUPDATE文が実行されます。
update <table_name> set A列=6 where A列=1;
▼A列がPrimaryキーなどのユニークなキーではない(表がユニークなキーを構成する列を持たない)場合
ターゲット側で下記のようなUPDATE文が実行されます。
update <table_name> set A列=6 where A列=1 and B列=2 and C列=3;
従いまして、A列がユニークなキーの場合、Out Of Syncは検出しませんが
ユニークなキーではない場合、ターゲット側ではレコードがヒットしないためOut Of Syncとして検知されます。