2011-11-03 19 views
3

私はサーバAのテーブルと別のサーバの同じテーブルを持っています。 サーバAのテーブルをサーバBのデータで一日一回更新します。サーバーAのテーブルには1億以上のレコードがあります。どのようにしてこれを行うことができるので、サーバAのテーブルのデータを更新している間も、以前の情報で読めるようになります。SQLサーバの2つのテーブルを同期する

意図した動作:

サーバーA:

create table tbl_transaction_test (
    tabid int identity, 
    first_name nvarchar(255), 
    last_name nvarchar(255), 
    [address] nvarchar(255), 
    update_dt datetime 
) 

サーバーB:

create table tbl_transaction_test (
    tabid int identity, 
    first_name nvarchar(255), 
    last_name nvarchar(255), 
    [address] nvarchar(255), 
    update_dt datetime 
) 

begin transaction transaction1 
truncate table A 
Insert into A.tbl_transaction_test 
    select * from B.tbl_transaction_test 
commit transaction transaction1 

そして同時に、私は、サーバーA.

上の表から選択します

サーバA上のテーブル内のデータが変更される動作を取得するには、tr ansactionはコミットされ、これはすぐに(ほぼ即座に)行われます。

+0

同様に:http://stackoverflow.com/questions/5082585/drop-and-create-table-inside-transaction-on-sql-server-impact-on-other-processe –

答えて

2

Andomarは既に、ステージングテーブルと良い「sp_rename」トリックを使用して、新しいデータセット全体を「一度に」表示する方法を提案しました。このテーマには、パーティションテーブルを使用して既存のデータを切り替えた後、ステージングテーブルを切り替えるなどのバリエーションがあります。Transferring Data Efficiently by Using Partition Switchingを参照してください。

もう1つのアプローチは、スナップショット分離を使用することです。スナップショットアイソレーションを使用すると、テーブル内のすべての行を削除し、新しいトランザクションをトランザクションに挿入することができます。すべての読者が古い行バージョンを使用し続けるため、読者をブロックしません。 Understanding Row Versioning-Based Isolation Levelsを参照してください。

しかし、100Mを毎日転送する計画の正当性について疑問を投げかけなければなりません。ただ実現不可能です。 1つのトランザクションで100Mの行を操作するという考え方は、トランザクションログファイルがドライブ全体を満たすまで成長する可能性が最も高くなり、サーバーがロールオーバーして消滅します。

あなたが最も必要とするのは、複製、ミラーリング、またはログ配布のフィリップによって提案されたソリューションの1つです。これらのソリューションの良い比較は、High Availability with SQL Server 2008白書です。

1

1つの方法はステージングテーブルを使用することです。ソーステーブル全体を新しいテーブルにコピーし、コピーが完了したら古いテーブルを削除してステージングテーブルの名前を変更します。

select * 
into A.tbl_transaction_test_staging 
from B.tbl_transaction_test 

begin transaction 
drop A.tbl_transaction_test 
exec sp_rename 'A.tbl_transaction_test_staging', 'A.tbl_transaction_test' 
commit transaction 

リネーム操作はかなり高速です。

+0

これはOPが尋ねたものではありません。テーブルは異なるサーバー上にあり、同期と同期の間に両方のテーブルを照会して(ほぼ)瞬時に実行するシナリオを求めました。 –

+0

@FilipPopović:この回答では、どの部分が提供されていませんか? – Andomar

+0

問題は、テーブルを削除している間はテーブルをもうクエリできないということです。これはまた私の心を横切る解決策です –

2

多分、組み込み機能が必要な場合は、High Availability Solutions Overviewの記事から開始する必要があります。これらの機能を使用するには、両方のサーバーに適切な権限が必要です。要するに:

  • Replicationから
  • Log shippingによって同期ソース・データベースとターゲット・データベースを保持します - 一つまたは複数のデータベース/サーバにあるデータベース/サーバーからトランザクションログのバックアップを送信し、接続先データベースでそれらを適用する
  • Mirroring - 基本的に、アクティブなトランザクションログレコードのストリームを宛先サーバーに送信し、それを宛先データベースに適用します。

SQL Server Editionレプリケーション/ミラーリング/ログ配布(または使用する場合は記事に記載されているクラスタフェイルオーバー)をサポートしています。

か、ソース表にトリガーをカスタムソリューション(複製等)を行うことができます:

  1. トリガーは、タイムスタンプ列とステータス(更新、挿入、削除)をログテーブルに変更されたレコードを保持します。
  2. コピータイムスタンプが>
  3. 宛先サーバに変更を適用する予め定義された間隔(使用ジョブ)にlast_timestamp_you_transfered宛先サーバへのこの別個のテーブル(変更ここでタイムスタンプ> last_timestamp_applied)

  • ログテーブルを小さくして、タイムスタンプが最後に処理されたレコードよりも小さいレコードを削除することができます。
  • トランスを実行するアプリケーションを作成することで、毎秒x秒/分で

すべての提案されたソリューションは、これらのサーバーにいくつかのアクセス許可が必要です。レプリケーション、ミラーリング、ログ配布、またはトリガー+ジョブを作成する権限が必要です。

関連する問題