web-dev-qa-db-ja.com

DB2テーブルをSQL Server 2008に複製する

DB2データベースからSQL Serverデータベースにデータを複製する必要があります(約80テーブルの行に沿って)。 SSISパッケージを作成して、データを別のデータにフラットコピーするだけで非常に簡単ですが、レコード数は数百万であるため、実行にはしばらく時間がかかりますが、初期設定では問題ありません。ただし、「ほぼ」リアルタイムで更新する必要があるため、この方法は実行できません。変更を追加してDB2からSQL Serverへのレプリケーションを削除するための最良の方法と方法は何ですか?

4
D-S

レプリケートされたテーブルのDB2に非表示のタイムスタンプ列を作成できます。レプリケーションジョブを実行すると、最後のレプリケーション以降に変更されたデータのみをプルできます。これにより、送信されるデータの量が減少します。

たとえば、SSISパッケージを1分ごとに実行して、最後の数分のデータだけを取得します。

または、タイムスタンプフィールドの代わりに、自動インクリメントintを使用して、複製された最後のint値を記録する複製されたインスタンスに小さなテーブルを保持することもできます。複製プロセスは新しいレコードを取得し、複製された最後の値を反映するように小さなテーブルの値を更新します。

2
Richard Slim

DB2側で十分なロギングがある場合、最後のほぼリアルタイムの更新以降に作成、変更、または削除されたレコードを簡単に識別できるはずです。しかし、それが簡単だった場合は、Stack Exchangeは必要ありません。

上記のロギングに失敗した場合、最も速いオプションはおそらくMERGEコマンドです。リンク全体で、これは遅い場合があります。その場合は、DB2データベースをSQLデータベースのステージングテーブルに一括コピーし、SQLサーバー上のローカルテーブルと永続テーブルの間でMERGEをローカルで実行することを検討してください。ステージングテーブルにデータが入力されるまでにはしばらく時間がかかりますが、ライブテーブルの更新は、スキーマを変更せずに行うのとほぼ同じくらい速くなります。

データが多すぎて5分ごとにすべてコピーできない場合(またはほぼリアルタイムのスケジュールで必要な場合)、おそらくトリガーを使用して、DB2側でイベントのロギングを開始するしかありません。

別のアプローチは、更新ごとにレコードのスライスを調べることです。 5:20に、DB2からSQLにゼロで終わるすべてのレコードをコピーします(ID % 10 = 0)、そしてそれらをメインテーブルにマージします。 5:25に、IDが1で終わるすべてのレコードをコピーしてマージします。これは明らかに、かなり均一に分散されたある種の合成キーがあることを前提としています。データは常に最新であるとは限りませんが、ほとんどの場合は最新です。最良の通貨を得るには、時間枠内にとどまりながらスライスをできるだけ厚くします。 10で割ると、ほんの一例です。必要に応じて、テーブルをパーティション分割することにより、このアプローチを拡張できます。

0