2つのテーブル(異なるサーバー上)がまったく同じデータを持っているかどうかの確認


10

したがって、SQL Serverをホストしている会社が、運用サーバーからバックアップサーバーへのレプリケーションに問題を抱えているようです...いくつかのテーブルは正しくレプリケートされていると思います。複製は毎日(時間外に)行われます。

同じテーブルの2つを比較する方法はありますか。1つはバックアップからで、もう1つは本番サーバーからです。昨夜のレプリケーションが機能したかどうかを確認できますか?

私が見つけることができた唯一の方法は、両方のサーバーで次のクエリを実行し、結果が一致するかどうかを確認することでした。

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

上記のコードを使用すると、チェックサム値が同じであるため、テーブルは正常に複製されたようですが、この方法の信頼性はわかりません。

これをチェックするより良い方法を知っている人はいますか?

Windows Server 2008コンピューターでSQL Server 2008を実行しています。

ありがとう。

回答:


11

私はあなたがそれを正確に行うことができるツールtablediffを探していると信じています-違いについて2つの複製されたテーブルを比較します。開始するには、この記事が役立つ場合があります。

これは tablediffのGUIです


ありがとう、ありがとう。これについて読むためにいくつかの読書を得ました。また、GUIへのリンクに感謝します。これにより、物事を非常に簡単に理解できるようになります。
ファンベレス


4

データの大きさとデータベースと相互(そしてあなた)との間のリンクの速度はどれくらいですか?いくつかのアイデアがあります:

これが実用的であるほどデータが小さい場合は、SELECT * FROM <table> ORDER BY <pk>各DB で実行し、結果をタブまたはカンマ区切りのファイルに保存し(結果のファイルサイズが大幅に増大するため、スペースを揃えないで)、結果の出力を優先するdiffタイプと比較します。 winmergeなどのユーティリティ。そうすれば、すべてのデータを完全に比較できます。

データベースが相互に認識でき(ほとんどの場合、それらは複製パートナーとして動作できるため)、それらの間のリンクが十分に高い帯域幅と十分に低い待ち時間である場合、リンクサーバー機能を使用できます(http://msdn.microsoftを参照) .com / en-us / library / ms190479.aspxと関連ドキュメント)を比較して、いくつかのSQLステートメントのテーブルの内容を比較します(<table>同じ行が含まれていない行を一覧表示します<linked_server>.<db>..<table>)。 2つのローカルテーブルの内容を比較します。これは潜在的に比較的遅いオプションですが、自動化するには非常に強力なチェックになる可能性があります。

転送する必要のあるデータの量を大幅に削減したいためにチェックサムを使用する必要がある場合は、より良い品質のハッシュを使用できるため、関数HASHBYTESCHECKSUMファミリーではなく使用してください。これはより多くのCPUを消費しますが、大量のデータの場合はCPUにバインドされずにI / Oバインドされるため、多くのサイクルがスペアになります(そして、少量の場合は問題になりません)。

すべてのデータを文字SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>ごとに比較することと、すべてのデータをカバーする単一のチェックサムを比較することの中間として、各データベースからエクスポートし、それらの結果を比較して、それらが同一であるかどうかを確認できます(またはSELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>データ量を減らすことができます)フローするが、出力にPKがある場合は、さらにクエリを減らすことで、異なる行があれば、それを特定できることを意味します。もちろん、この最後のオプションは、平均行のデータが結果のハッシュよりも小さい場合は無意味です。その場合、「すべて比較」オプションの方が効率的です。


2

tablediffはライブデータベース内のテーブルのみを比較しますが、データベースバックアップをライブデータベースと比較できるサードパーティツールはたくさんあります。

次のスクリプトを実行して、1つのテーブルに存在し、別のテーブルには存在しないデータを確認することもできますが、これは2つのライブデータベースに対してのみ実行できます。

SELECT * FROM MyTest.dbo.testtable WHERE NOT EXISTS(SELECT * FROM MyTest2.dbo.TestTable WHERE MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)


情報をありがとう!調べてみます。そのスクリプトは役に立ちます!
ファンベレス

私が頻繁に使用したものは、except次のとおりです。表select id, name from Table1 except select id, name from Table21ではすべてが得られますが、表2では得られません
Adam
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.