Überprüfen, ob 2 Tabellen (auf verschiedenen Servern) genau dieselben Daten enthalten

10

Es scheint also, dass das Unternehmen, das unsere SQL Server hostet, Probleme mit der Replikation vom Produktionsserver zum Sicherungsserver hat ... Ich glaube, einige der Tabellen wurden jedoch korrekt repliziert. Die Replikation erfolgt täglich (nach Stunden).

Gibt es eine Möglichkeit, zwei gleiche Tabellen zu vergleichen, eine aus der Sicherung mit einer aus dem Produktionsserver, um festzustellen, ob die Replikation der letzten Nächte funktioniert hat?

Die einzige Möglichkeit, die ich finden konnte, bestand darin, die folgende Abfrage auf beiden Servern auszuführen und festzustellen, ob das Ergebnis übereinstimmte, was "möglicherweise" bedeutet, dass 2 Tabellen dieselben Informationen enthalten.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

Mit dem obigen Code scheint die Tabelle erfolgreich repliziert worden zu sein, da die Prüfsummenwerte gleich sind, aber ich bin mir nicht sicher, wie zuverlässig diese Methode ist.

Kennt jemand eine bessere Methode, um dies zu überprüfen, oder ob dies ein guter Weg ist?

Ich führe SQL Server 2008 auf einem Windows Server 2008-Computer aus.

Vielen Dank.

Juan Velez
quelle

Antworten:

11

Ich glaube, Sie suchen nach dem Tool tablediff, mit dem Sie genau das tun können - vergleichen Sie zwei replizierte Tabellen auf Unterschiede. Dieser Artikel ist möglicherweise hilfreich, um loszulegen.

Hier ist eine GUI für tablediff

RK Kuppala
quelle
Ehrfürchtig, danke. Ich habe etwas zu lesen. Vielen Dank auch für den Link zur GUI, es sollte die Dinge viel einfacher machen, es wirklich zu schätzen!
Juan Velez
4

Wie groß sind die Daten und wie schnell sind die Verbindungen zwischen den Datenbanken und untereinander (und Ihnen)? Es gibt eine Reihe von Ideen:

Wenn die Daten so klein sind, dass dies praktisch ist, führen Sie sie SELECT * FROM <table> ORDER BY <pk>in jeder Datenbank aus , speichern Sie die Ergebnisse in einer durch Tabulatoren oder Kommas getrennten Datei (nicht durch Leerzeichen ausgerichtet, da dies die resultierende Dateigröße massiv vergrößert) und vergleichen Sie die resultierende Ausgabe mit Ihrem bevorzugten Diff-Typ Dienstprogramm wie Winmerge. Auf diese Weise vergleichen Sie absolut alle Daten.

Wenn sich die Datenbanken sehen können (höchstwahrscheinlich, weil sie als Replikationspartner fungieren können) und die Verbindung zwischen ihnen eine ausreichend hohe Bandbreite und eine ausreichend niedrige Latenz aufweist, können Sie die Verbindungsserverfunktionalität verwenden (siehe http://msdn.microsoft) .com / de-de / library / ms190479.aspx und zugehörige Dokumentation) zum Vergleichen des Inhalts der Tabellen in einigen SQL-Anweisungen (Auflisten der Zeilen, in <table>denen keine identischen Zeilen enthalten sind, <linked_server>.<db>..<table>und umgekehrt) Sie würden den Inhalt von zwei lokalen Tabellen vergleichen. Dies ist möglicherweise eine relativ langsame Option, könnte jedoch eine recht leistungsstarke Prüfung zur Automatisierung sein.

Wenn Sie Prüfsummen verwenden müssen, weil Sie die zu übertragende Datenmenge erheblich reduzieren möchten, verwenden Sie HASHBYTESanstelle CHECKSUMder Funktionsfamilie Hashs mit besserer Qualität, damit Sie sicherer sind, dass sie gleich sind. Dies ist CPU-intensiver, aber für große Datenmengen sind Sie E / A-gebunden und ohnehin nicht CPU-gebunden, sodass viele Zyklen frei bleiben (und für kleine Mengen spielt das einfach keine Rolle).

Als Mittelweg zwischen dem Vergleich aller Daten Zeichen für Zeichen und dem Vergleich einer einzelnen Prüfsumme, die alle Daten abdeckt, können Sie SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>aus jeder Datenbank exportieren und diese Ergebnisse vergleichen, um festzustellen, ob sie identisch sind (oder SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>um die Datenmenge zu verringern) fließend, aber wenn die PK in der Ausgabe enthalten ist, können Sie die Zeilen, die sich gegebenenfalls unterscheiden, mit weniger weiteren Abfragen identifizieren. Natürlich ist diese letzte Option sinnlos, wenn die Daten in der durchschnittlichen Zeile kleiner als der resultierende Hash sind. In diesem Fall ist die Option " Alles vergleichen " effizienter.

David Spillett
quelle
2

Während tablediff nur Tabellen in Live-Datenbanken vergleicht, gibt es viele Tools von Drittanbietern, mit denen eine Datenbanksicherung mit einer Live-Datenbank verglichen werden kann.

Sie können auch das folgende Skript ausführen, um die Daten anzuzeigen, die in einer Tabelle vorhanden sind und in einer anderen nicht vorhanden sind. Sie können dies jedoch nur für zwei Live-Datenbanken tun:

SELECT * FROM MyTest.dbo.testtable WO NICHT EXISTIERT (SELECT * FROM MyTest2.dbo.TestTable WHERE MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)

Carol Baker West
quelle
Danke für die Information! Ich werde das untersuchen. Das Skript wird hilfreich sein!
Juan Velez
etwas, das ich häufig verwendet habe, ist except: select id, name from Table1 except select id, name from Table2gibt Ihnen alles in Tabelle 1, aber nicht in Tabelle 2
Adam