web-dev-qa-db-ja.com

同じインスタンス上の異なるデータベース間で複数のテーブルを複製/同期する

SQL Server2008クラスター内の複数のデータベース間で複製/同期する必要のあるテーブルがいくつかあります。

複数のインスタンス間で複製できることは知っていますが、データベースの特定のテーブル間で同じインスタンス内で複製または同期を探しています。

レプリケーション/同期は30分ごとに発生するはずですが、常に発生してもかまいません。

多くの制約があるため、ターゲットテーブルのDROPとソーステーブルのINSERT(コピー)を使用できません。

これは、アプリケーション層で管理せず、2つの異なるデータベースに同時に書き込むためです。

例:

DB1にはT1、T2、T3があります。これらはアプリケーションによって常に更新されており、APP1はDB1で実行されています。

DB2は常にT1の更新されたコピーを持っている必要があります。また、別のアプリケーションがあり、APP2はDB2でのみ実行されます。

DB1とDB2の両方が同じインスタンスINST1にあります。

T1、T2、およびT3をDB1からDB2に複製することは可能でしょうか?

2
Idan

まず、SQL Serverのレプリケーション機能は、同じインスタンス上の異なるデータベース間でセットアップできます。

SQL Serverレプリケーションのセットアップと管理は、必要以上に手間がかかる場合があります。行うべき決定はたくさんあります(レプリケーションの種類は何ですか?すべての列または一部のみですか?すべての行または一部のみですか?ターゲットテーブルにインデックスを付けますか?一部の種類のレプリケーションでは、基になるデータモデルを変更する必要があります。アプリケーションのソースコードを制御しない場合、データモデルを変更することは可能ですか?など)、レプリケーションが中断し、気付かない場合があります。一方、ログファイルは予期せず大きくなる可能性があります。

トリガーを使用すると、基になるテーブルが変更された場合に備えてトリガーコードを維持する必要があります。トリガーが機能しなくなった場合はどうなりますか?テーブルをどのように再同期しますか?それにはどれくらい時間がかかりますか?等.

コメントで述べたように、レプリケーションの1つの代替手段はビューを使用することです。潜在的に、これは、ベーステーブル(T1、T2、T3)が何らかの理由で変更された場合にコードを維持することを意味します。そのため、ビューは私の2番目の提案になります。

私の最初の提案は、「同義語」機能を使用して、元のテーブルを単に参照することです。ビューまたはシノニムを使用する場合、データは1つの場所(DB1)にのみ保存されるため、データのコピー間で変更を同期する心配はありません。

ここで考えられるマイナスの点(ビューまたはシノニムの場合)は、DB2に実際にはT1データが含まれないため、DB2のバックアップと復元(テストサーバーまたは開発サーバーへの)にもDB1のバックアップと復元が必要になることです。

2
darin strait

同義語の使用に関して、同様の問題と特定の課題があります。同じサーバー上に2つのデータベースがあり、2つの別々のアプリケーションにサービスを提供しています。 DB1には、保険代理店情報に関連する情報が含まれています。 DB2には、ダイレクトメールやその他のマーケティングプログラムに関連する情報が含まれています。

DB1のAGENTテーブルのエージェント情報はDB2で必要です。これにより、エージェントをダイレクトメールやその他のマーケティングプログラムに関連付けることができます。この関連付けは、PK/FK関係を使用して定義する必要があります。問題#1:DB1のAGENTテーブルを参照するDB2のビューまたはテーブル値関数を使用すると、ビュー/関数のPKをDB2の関連テーブルのFKとして参照できません。問題#2:DB1のエージェントテーブルからDB2にシノニムを定義する場合、シノニムを参照するDB2の他のテーブルにFKを定義することはできません。

DB1のエージェントテーブルがマスターであり、DB2にDB1のサブスクライバーであるエージェントテーブルがある場合、アプリケーションのDB2のエージェントテーブルに追加の関係を定義したり、一意のインデックスを追加したりすることはできません。のデータを提供しています。

例として、DB1で実行されているアプリケーションでは、エージェントの郡にインデックスを付ける必要はありません。 DB2で実行されているアプリケーションでは、エージェントの郡にインデックスを付ける必要があります。レプリケーションを使用して、サブスクライバーがDB2で一意の関係とインデックスを持つことができるようにするにはどうすればよいですか?

1
Mike

同じインスタンス上にある場合、簡単な解決策は、3つの部分名(database.schema.tableビュー)を使用して、各データベースにデータテーブルの同義語を作成することです。次に、各データベースのテーブル/シノニムをローカルリソースとして参照し、テーブル名を同じに保つだけで、後でレプリケーションに切り替えるオプションがあります。

0

dB1-> DB2からだけですか?または、DB2-> DB1で発生する変更が必要ですか?
トリガーを使用するソリューションについて考えたことはありますか?

また、あるデータベースから別のデータベースへの同じインスタンス間でSQLサーバーレプリケーションを使用しても問題はありません。

0
Nick Kavadias