CData Software Blog

クラウド連携のCData Software の技術ブログです。

差分更新未対応のデータソースでもCDataSyncで差分更新させる方法

f:id:sennanvolar44:20200805155049p:plain こんにちは、CDataSyncをよく触っている宮本です!

今回は差分更新未対応データソースの場合でも差分更新させる方法をご紹介いたします。

CDataSync の差分更新対象のデータソース

そもそも、CDataSync では差分更新ができるデータソースはSalesforceやMarketo、kintoneやスマレジなど、一部のものに限定されています。

以下のリンクにてCDataSyncで使用できるデータソースの一覧が確認できますが、その中でもアイコンの右上に★印があるものが差分更新対応のデータソースとなります。
https://www.cdata.com/jp/sync/connections/
f:id:sennanvolar44:20200817160305p:plain

CDataSync の差分更新機能について

まずは通常の差分更新についてです。CDataSyncの差分更新の仕組みは、初回レプリケート実行時にジョブ内容やレプリケートしたデータの最終更新日時をCDataSync 内部のデータベースに保存します。
2回目以降のジョブでは、その保持している更新日時を使用して、データソース側へのリクエストで渡します。
その結果、対象データがあれば同期先DB にMERGEで連携します。
f:id:sennanvolar44:20200817163141p:plain

差分更新未対応のデータソースの場合には?

差分更新未対応のデータソースでは、REPLICATE構文を使用してレプリケートジョブを実行するたびに同期先DB のテーブルを一旦削除してから新たに作り直すようになっています。
REPLICATE構文について

ただし、CACHE構文というものでレプリケートジョブのクエリを以下のように日付関数などを使用して作成しますと、欲しいデータの範囲をユーザー自身で調整してリクエストを行うことができ、同期先にて差分更新されるようになります。

CACHE [Table] SELECT * FROM [Table] WHERE [ActivityDate] > DATEADD('hh',-24,CURRENT_TIMESTAMP()) 

CACHE 構文の実行イメージ
f:id:sennanvolar44:20200817163844p:plain

CDataSync での実際の設定イメージ

MySQL からSQLServer へのレプリケートで、ジョブはMySQLにあるAccountテーブルをそのままレプリケートする内容で確認します。クエリを設定後、再度クエリエリアをクリックすると以下のような画面が表示され、インクリメンタルロード(差分更新)がUnsupported になっているのがわかります。
f:id:sennanvolar44:20200817225847p:plain

この状態で何度かレプリケートを実行すると、毎回全件更新しにいっているのがステータスで確認できます。

1回目
f:id:sennanvolar44:20200817230403p:plain
2回目
f:id:sennanvolar44:20200817230456p:plain

2回ジョブを実行した後のSQLServerのレコード件数
f:id:sennanvolar44:20200817231351p:plain 複数回ジョブを実行しても36件ではありますが、毎回テーブル再作成&全件insertしているので、レプリケート件数が大量の場合は時間が掛かってしまいます。

ではここで、先ほどご紹介した「Cache構文+日付関数」で取得期間を絞りながら複数回ジョブを実行して36件にしてみたいと思います。
内容は現在時刻から-24時間以内に変更したデータのみを連携してみます。
※なお、MySQLにあるレコードは36件で、全てが-24時間以内に更新されたデータを準備しております。

CACHE [account-0817cache-test1] SELECT * FROM [account] WHERE [LastModifiedDate] > DATE_SUB(CURRENT_DATE, INTERVAL 24 Hour);

f:id:sennanvolar44:20200818002137p:plain

連携結果は36件でした。
ではここで、MySQL側のレコードを2件更新してみました。これでジョブの内容を1時間以内に更新されたレコードのみに対象を絞るため、「INTERVAL 1 Hour」に変更し、再度ジョブを実行してみます。
そうしますと、今度はレプリケート件数が2件のみになりました。
f:id:sennanvolar44:20200818002544p:plain

では最後にMySQL側のテーブルには正しく36件となっているか確認してみると、36件のままになっていることが確認できました。
f:id:sennanvolar44:20200818002936p:plain

REPLICATE 構文とCACHE 構文のそれぞれの特徴

■Replicate

  • 前回取り込んだ情報をStatusテーブルで保持
  • 次回ジョブ実行時にStatusテーブルで保持した最終更新日時を用いて、差分データをUpsert
  • Where句に"更新日時"の項目を設定することは不可。具体的には一度レプリケートしたレコード(過去データ)を指定するような内容

■Cache

  • ジョブ実行の度にクエリをそのまま実行し、取得したレコードをUpsert
  • Statusテーブルにはジョブ実行時の情報は保存しないので、条件指定をしないと毎回全件更新となってしまう
  • Where句に"更新日時"項目を使った指定ができるため、過去データも取得対象に含めることができる
  • RDBをデータソースにした場合でも、CACHE構文で差分更新が可能となる

おわりに

いかがでしたでしょうか。差分更新未対応のデータソースでも今回のような指定方法で差分更新を行うことができるようになります。
CDataSync のインストールや仕様方法はこちらをご参照ください。

www.cdatablog.jp