2012-04-17 2 views
2

SyncOrchestratorを使用して〜6 SQL Server 2008 Expressクライアントを同期させています(特にhttp://code.msdn.microsoft.com/windowsdesktop/Database-SyncSQL-Server-e97d1208を少し修正してベースとしています)。私の知る限り、これはすべての接続がピアまたはノードであることを意味します。SyncFramework 2.1の更新と削除が正しく適用されないようです

私は2つのスコープを持っています。 1つはダウンロードのみで、もう1つはアップロードのみです。主に私がそれ以上のことを知らず、依然としてクライアント側のPKとしてGuidsを紹介することで私の頭を包むことができなかったため、ダウンロード専用のスコープはIDカラムで乗り越えられます。すべてのクライアントが約8台程度のテーブルの正確な複製を持つ必要があり、これらのマシンがこのデータになんらかの形で触れることはなく、読み取るだけで問題はありません。

アップロード専用スコープはGuidsを使用しているため、データベースのその部分を制御でき、同じIDシードを使用するすべてのクライアントがサーバーに正しく同期することができません。両方のスコープは、バルクインサートと9ヤード全体でデフォルトのプロビジョニングを使用しているため、プロビジョニングの最後にこれを実行する必要はありません。

私はすべてPerformPostRestoreFixupを使用せずにすべてを最初に設定し、初期データベースはホストからの挿入ステートメントと手動で同期されます。これはうまくいったようですが、更新や削除は適用されていないようです。 VS2010データベースプロジェクトを使用してデータベースをスキーマにのみ再構築して&を同期させたので、これを無視しても問題ありません(歴史的な正確さと無能さを証明するためにのみ使用されます)。その後、ここで説明した手順を使用しました(http://social.microsoft.com/Forums/br/syncdevdiscussions/thread/9ac6d1a1-1565-4b82-a8d8-3d4a9ff5d07b)(sync、backup、restore、call performpostrestorefixup、xクライアントで同期)そして私がこのすべてを設定している私の開発者ボックスでは、私は更新と削除をうまく見ることができた。そのとき、私はこれをxクライアントに配備して、データベースのミラーが見えないと思っています。

最初の同期では、すべてのレコードを再度同期して同期しようとします。私はこれが期待されると信じています。クライアントのApplyChangeFailedイベント中に、DbConflictType.ErrorsOccurred以外のすべてをApplyAction.RetryWithForceWriteに設定しました。これは、クライアントに変更を強制的に強制するためにこれを行う必要があると当初考えていたため、問題の原因になる可能性があります。このシナリオではサーバーが常に勝つことを望んでいますが、トレース中に一括挿入/更新呼び出し中に「Local wins」というフレーズが常に表示されます。再適用が行われる前にエラーが表示されている可能性がありますが、見るのは面倒です。

私が抱いているように見える唯一の問題は、ダウンロード専用のスコープである。最初のクライアントデータベースは約1週間前です。私がperformpostrestorefixupの手順を使用すると、現在とその後の間に適用された更新が表示されません。 SyncFxがクライアント側の空のデータベースをほぼ優先して初期同期を開始しているような場合、ApplyChangesFailedイベントが一切発生せず、すべての更新がうまく適用されるようです。

誰もこれを以前に見たことがあるか、どこに行くのか手掛かりがある場合は、私は大いに感謝します。私の脳は何が起こっているのかを調べようとしている。私の最後の努力は、すべてのクライアントに空のデータベースを展開し、同期を開始させることです。私はdev側でこの問題はありませんでしたが、私は他のクライアントをテストして、何か違うことがあるかどうかを知ることができます。それ以外に、この目的を完全に破るマニュアル同期を続ける以外に何をすべきかわからない。私はPerformPostRestoreFixupが問題を完全に緩和すると思っていましたが、私は同じ問題があってもなくても、おそらく私は何が必要なのか見ていないようです。

ありがとうございました

+0

あなたが言及したダウンロードの範囲で、あなたはApplyChangesFailedイベントで何かを得るか、それとも単純に変更をダウンロードしませんか? – JuneT

+0

申し訳ありませんが、私はそれを言及すべきでした。ダウンロードは、常にLocalUpdateRemoteUpdateまたはLocalInsertRemoteInsertのいずれかでApplyChangesFailedを起動します。私が得意でないことは、クライアントがこれらのテーブルのどれにも触れないことです。 ModifiedOn(datetime)フィールドがありますが、コードを更新するためにコードが導入されたばかりです。データベースはこれをrowversionとして使用しませんが、スキーマに正しく構成されていない可能性があります。 –

答えて

1

私は結果を報告して終了したいと考えました。

私が以前に設定したクライアント・データベースを配備するでしょう

が、私は多くの場合、このログの形式でイベントをApplyChangeFailed取得したい:

「[5時30分41秒PM] - ApplyChange失敗しました:テーブル名:、ステージ: ApplyingInserts、ConflictType:LocalInsertRemoteInsert、Action:RetryWithForceWrite "

これは、既にそこにあるデータを再挿入しようとしたために予想されたことです。これを変更したのはRetryWithForceWriteの更新ステートメントでしたが、データが更新されていないことが判明しました。

完全に空のデータベースで各クライアントを起動し、ローカルにプロビジョニングすると、これらのエラーはすべて消えてしまいました。すべてのクライアントがそれが設定する一意のIDを期待しているかのようです。また、x86に比べてx64ビルドを使用しています。これは結果に何らかの影響を与える可能性があります。私は正確に何が起こったのか判断することができればいいと思っていますが、疑わしいとき、可能な限り絶対ゼロから始めて、データを同期させることが最も安全な選択です。

+0

この唯一の相違点は、同期が30分ごとに実行され、いくつかの変更がしきい値を超えて適用されるということです.1時間の間に17回の更新をカウントできますが、特定のクライアントは14 + 3、16 + 1などに触れます。結局私は満足しています。それは、おそらく私が賭けるサーバー上の時間と関係があります。 –

関連する問題