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)処理は高速に実行されるため、特にネットワークトラフィックが要因となり、ターゲットテーブルにレコードがすべて存在しない時間が長引いている場合には、このステージングリフレッシュ機能を使用することで影響を軽減することができます。
関連したトピックス
- DBMotoレプリケーションに必要なOracleユーザ権限
- DBMotoレプリケーションに必要なMySQLユーザ権限
- レプリケーション対象テーブル構成変更後のSyniti Data Replication (旧DBMoto) マッピング対応について
- DBMotoレプリケーションに必要なPostgreSQLユーザ権限
- Syniti(旧DBMoto)レプリケーションに必要なOracleユーザ権限 Trigger使用時
- Oracleトランザクションセットアップ例(Log ReaderまたはLog Server Agent)[Syniti Data Replication]
- DBMotoレプリケーションに必要なOracle 12c(PDB/CDB)権限
- [ DB2 Connectivity ] 開発キット C# Toolkit で出来ること :プログラミング無しで検証可能
- DBMotoレプリケーションに必要なSQL Serverユーザ権限
- 外部キーが設定された親子テーブルのリフレッシュの注意点と簡単設定方法