SQL Serverの2つのデータベースの同期


16

2つのSQL Serverデータベースがあります。1つはクライアント(Windowsアプリケーション)で、もう1つはサーバー上にあります。これらの2つのデータベースを頻繁に(たとえば2分ごとに)同期したいです。

レプリケーション、タイムスタンプ、トリガーを使用したログテーブル、Microsoft Sync Frameworkなど、さまざまな同期方法について読みました。

実際、ブラックボックス(レプリケーションなど)になる可能性のある同期方法を使用するのは好きではありません。SQLServer固有のテーブルを更新し、サーバーと同期している間はブロックされないようにするためです。

  1. そのような状況でどの方法を使用すべきだと思いますか?数分ごとに、いくつかのテーブル変更をクライアントからサーバーに送信し、サーバーから2つのテーブル変更もフェッチする必要があることに注意してください。

  2. 私は奇妙だが新しいメソッドを見つけました。クライアントで実行されたすべての(特定の優先)ストアドプロシージャをログに記録し、.sqlファイル内のパラメーターと共にサーバーに送信し、そこで実行することは可能ですか?同じことがサーバーで発生し、クライアントに送信されます。これはシンプルだが便利な方法だと思いますか?

  3. 可能であれば、便利なアプローチを提案してください。どうもありがとうございます。

編集:これはリアルタイムの同期であり、これが特別なものになることを忘れないでください。つまり、クライアントユーザーがテーブルを使用している場合、サーバーとの同期プロセスは数分ごとに行われる必要があるため、テーブルをロックする必要はありません。


1
これらの「ブラックボックス」は、その動作方法、保守と監視の方法、および一般的な(あまり一般的ではない)障害シナリオでそれらを修正するためにできることに関して比較的よく文書化されています。私は自分の同期方法をローリングし、見つけて修正バグがあれば、「ブラックボックス」は長い時間前に対処することをエッジケースに関連した検討する場合にのみ、私は非常にアプリケーション固有のニーズ(部分同期、またはUSER-の必要性を持っていました対話型の競合解決など)。
デビッドスピレット

@DavidSpillett:リアルタイム同期プロジェクトでレプリケーションを正常に使用しましたか?私の主な関心事は、リアルタイムの同期と「ロックとブロッキング」です。
エマド・ファロキ

回答:


14

よくわからないかもしれませんが、答えようとします。

頻繁に実行する(2分以上)高性能のソリューションが必要であり、ロックせずに高速に動作する適切なアプローチが必要だと言いました。しかし、ブラックボックスシステムは必要ありません。

何百万ものインストールで良好な結果が得られるブラックボックスシステムの代わりに、あなたは再び車輪を発明して独自のソリューションを構築しようとしますか?うーん、少し奇妙に聞こえます。

実際、これらは私の提案です。

  1. 使用しないと言っても、複製します。これは非常に簡単で最適なソリューションです。複製は簡単にセットアップでき、高速で複製できるため、車輪を再発明する必要はありません。ロックがおかしい場合は、をに設定しISOLATION LEVELてみてくださいREAD_COMMITTED_SNAPSHOT。詳細については、こちらをご覧ください。これはtempdbの一部を使い果たしますが、テーブルは常に読み書き可能であり、レプリケーションはバックグラウンドで機能します。

以下の例を参照してください。

ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
  1. CDC(Change Data Capture)も解決策となります。しかし、この方法では、ほぼすべてを自分で構築する必要があります。そして、私はCDC状況によっては壊れやすい経験をしたことがあります。CDC監視対象テーブルのすべてのデータをキャプチャします(監視対象の各テーブルを手動で指定する必要があります)。その後、あなたは後に前の値と値を取得しますINSERTUPDATEまたはDELETECDCこれらの情報を一定期間保持します(独自に指定できます)。アプローチはCDC、監視する必要がある特定のテーブルで使用し、それらの変更を他のデータベースに手動で複製することです。ところで、CDCSQL Serverレプリケーションも内部で使用しています。;-) ここで詳細を読むことができます

警告:-changesはCDC認識しませんDDL。つまり、テーブルを変更して新しい列を追加するCDCと、テーブルは監視されますが、新しい列への変更はすべて無視されます。実際、NULL前の値と後の値としてのみ記録します。DDL監視対象のテーブルに-Changesを追加した後、再初期化する必要があります。

  1. 上記の方法は、SQL Server Profilerを使用してワークロードをキャプチャし、いくつかのベンチマークのために別のデータベースで再度実行するようなものです。まあそれは動作する可能性があります。しかし、副作用が多すぎるという事実は、私にとっては少なすぎます。クライアントでプロシージャコールをキャプチャする場合はどうしますか。その後、同期していないのと同じコマンドを基本データベースで実行しますか?手順は実行されますが、クライアントに存在しない行を削除/更新/挿入する場合があります。または、1つの原則で複数のクライアントをどのように処理しますか。これはトリッキーすぎると思います。最悪の場合、おそらく整合性を破壊します。
  2. 別のアイデアは、アプリケーションベースまたはトリガーを使用することです。同期するテーブルの数に応じて。すべての変更を個別のステージングテーブルに書き込み、SQL Serverエージェントジョブをすべてx分実行して、ステージングテーブルのこれらの行をマスターと同期できます。ただし、150個のテーブルを同期(たとえば)しようとすると、これは少々重いかもしれません。大きなオーバーヘッドが発生します。

まあ、これらは私の2セントです。うまくいけば、良い概要があり、多分あなたに合った解決策を見つけたと思います。


9

ここでいくつかのオプションを、利点と欠点を挙げて列挙します。

  1. SQL Serverレプリケーション -これは、このタスクに最適で最も最適化されたネイティブSQL Serverツールです。しかし、いくつかの問題があります すべてのクライアントについて、SQL Expressデータベースであるかどうかに関係なく、SQL Server CALライセンスが必要です。これは、プロセッサごとのライセンスを使用して回避できます。b。こちらのようにSQL CEクライアントを同期することはできません。c。SQL ExpressまたはLocalDBはパブリッシャーまたはディストリビューターとして機能することができないため、レプリケーションプロセスに対するクライアントの制御が低下します。
  2. Microsoft Sync Framework-モバイルアプリの小規模なデータベースに適しているようです。データベースに非常に多くのテーブルを追加し、レプリケーションほど効率的ではありません。コンポーネントとしてSQL Serverの外部に実装されるため、構成がより困難になります。私はそれを使った経験がなく、試してみて、使わないことにしました。

  3. データベースの変更の追跡。これは、挿入、更新、削除などの変更追跡を行う組み込みのSQL Server機能です。変更の送信と適用、競合の解決など、他のすべては自分でコーディングする必要があります。

  4. Rowversion(timestamp)列すべての削除を許可しない場合(削除されたレコードの同期なし)-rowversion情報のみに基づいて独自のソリューションを実装できます。Rowversion列はSQL Serverレプリケーションでも使用されるため、とにかく追加する必要があります。
  5. Ionicの回答に記載されているCDC-エンタープライズ版またはデベロッパー版でのみ利用可能であるため、私はそれについては経験がありません。

  6. 実行されたストアドプロシージャをログに記録する独自のトリックを使用する-データベースアプリケーションの性質に大きく依存します。しかし、手順がほとんど変わらない場合、データに大きな混乱が生じる可能性があります。そして、あなたはどのように紛争に対処しますか?

あなたの質問から、大きなデータベース全体ではなく、いくつかのテーブルだけを同期する必要があるようです。この目的のために、質問で指定したよりも詳細にニーズを分析する必要があります。

  • 削除はできますか?
  • 競合は発生する可能性がありますか?それらを防ぐ方法と解決する方法は?
  • テーブル構造の変更にどのように対処しますか?
  • ...

最終的に、削除と競合が問題ではなく、構造があまり変わらないことがわかった場合は、独自のロジックを書くことを検討できますが、コードは1000行に簡単に成長できます。


2

ご意見ありがとうございます。

実行されたストアドプロシージャを束としてではなく、1つずつキャプチャして、同期化プロセスを正常に解決しました。整合性とすべてが慎重に検討されているため、システムはこれまでリアルタイムで機能していました。


しかし、あなたがしたことをより詳細に説明してください。単に実行されたストアドプロシージャの呼び出しをログに記録し、一時テーブル/スクリプトに保存し、ジョブでこのスクリプトを実行し、フィールド(ビットフィールドや日時フィールドなど、これらすべてに対して言う処理されていないレコードはそれらを処理し、ビットフィールドを更新しますか?)問題を解決したことを嬉しく思いますが、他の人が学習するのを助けるためにあなたがしたことについてより多くの洞察を与える必要がありますか?
JonH

0

遅い答えですが、訪問者をスレッド化するのに役立つかもしれません

私は別のサーバー間でデータを分散しようとしている同様の課題を有しており、サードパーティ製のツールを使用して、それを解決した(差分は、スキーマの変更のためにとDataDiffデータの同期を変更)し、PowerShellのスクリプトは、プロセスを自動化するために必要な次のとおりです。

#check for the existence of the Outputs folder
function CheckAndCreateFolder($rootFolder, [switch]$Outputs)
{
$location = $rootFolder

#setting up location 
if($Outputs -eq $true)
{
    $location += "\Outputs"
}

#if the folder doesn't exist it will be created
if(-not (Test-Path $location))
{ mkdir $location -Force:$true -Confirm:$false | Out-Null }

return $location
}

#root folder for the schema sync process
$rootFolder = "SchemaSync"

#schema output summaries location 
$outsLoc = CheckAndCreateFolder $rootFolder -Outputs

#ApexSQL Diff location, date stamp variable is defined, along with tools parameters 
$diffLoc   = "ApexSQLDiff"
$stamp = (Get-Date -Format "MMddyyyy_HHMMss") 
$Params = "/pr:""MyProject.axds""    /out:""$outsLoc\SchemaOutput_$stamp.txt"" /sync /v /f" 
$returnCode = $LASTEXITCODE

#initiate the schema comparison and synchronization process
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params))

#write output to file
"$outsLoc\SchemaOutput_$dateStamp.txt"

#schema changes are detected
if($returnCode -eq 0)
{
"`r`n $returnCode - Schema changes were successfully synchronized" >> 

}
else
{
#there are no schema changes
if($returnCode -eq 102)
{
"`r`n $returnCode - There are no schema changes. Job aborted" >> 
}
#an error is encountered
else
{
"`r`n $returnCode - An error is encountered" >> 

#output file is opened when an error is encountered
Invoke-Item "$outsLoc\SchemaOutput_$stamp.txt"
}

}

この方法では、2つのデータベース間の比較をスケジュールし、見つかった変更をリアルタイムで同期します。手順を追った説明を提供する記事は次のとおりです。

https://solutioncenter.apexsql.com/automatically-compare-and-synchronize-sql-server-data/ https://solutioncenter.apexsql.com/how-to-automatically-keep-two-sql-server-database- schemas-in-sync /

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.