初期同期(リフレッシュ)がより便利に! ステージングリフレッシュ機能


Syniti Data Replication (以下Syniti DR)では初回のレプリケーション時や任意のタイミングで全件転送を行うリフレッシュ機能が提供されています。
この全件転送の流れとしては、まずターゲットテーブルをキレイにするため、ターゲットテーブルのデータをすべて削除(TruncateまたはDelete)し、その後ソーステーブルのデータをSelect、ターゲットテーブルにInsertするものとなります。

ざっくりと、以下のような流れになります。
===============================
① ターゲットテーブルのデータを削除(TruncateやDelete)
② ソーステーブルのデータを取得(Select)
③ Syniti DRサーバ内部でInsertクエリの生成
④ ターゲットテーブルにデータを挿入(Insert)
===============================

上記④では、ターゲットデータベース側でバルクインサート機能が提供されている場合、
ブロックサイズタブで指定された数値に基づいて、複数レコードを1つのSQLクエリにまとめることで、大量レコードを転送する場合でも、ある程度高速な処理が可能です。

ただ、バルクインサート使用時でもSyniti DRサーバとデータベースサーバ間のネットワークトラフィックの負荷状況や、データベースサーバ自身のI/Oパフォーマンスなど環境に依存する部分が大きく、環境によってはレコードの処理に時間かかかることがあります。
つまり、上記①~③の間には、ターゲットテーブル側でコミットされるまでレコードが存在しない、またブロックサイズに基づいてコミットが発行されるため、別アプリケーションなどからターゲットテーブルをSelectした時に一部データしか確認できない状況は想定されます。

この影響を少しでも軽減するため、Syniti DR 9.7.2.28より、ステージングリフレッシュ機能が追加されました。
レプリケーションジョブのリフレッシュオプションにて、リフレッシュステージングタブをTrueとすることで機能が使用できます。

この機能を使用する場合、リフレッシュ時には通常のリフレッシュとは異なり以下のような流れになります。
通常のリフレッシュには無い部分は赤文字にしています。
====================================
① ステージングテーブルが存在しない場合には、
Create Tableクエリからステージング
テーブルを作成
② ソーステーブルのデータを取得(Select)
③ Syniti DRサーバ内部でInsertクエリの生成
④ ステージングテーブルに対してデータを挿入(Insert)
⑤ ステージングテーブルへのデータ挿入完了後、コミット
⑥ ターゲットテーブルのデータを削除(TruncateやDelete)
⑦ ⑤のステージングテーブルをデータソースとして、
ターゲットテーブルにデータを挿入(Insert into Select)
====================================

このように、処理自体は増えていますが、通常同一データベース内部で実行される操作(Insert into Select)処理は高速に実行されるため、特にネットワークトラフィックが要因となり、ターゲットテーブルにレコードがすべて存在しない時間が長引いている場合には、このステージングリフレッシュ機能を使用することで影響を軽減することができます。

関連したトピックス

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください