Ich habe zwei SQL Server-Datenbanken. Einer ist Client (Windows-Anwendung) und der zweite ist auf dem Server. Ich möchte diese beiden Datenbanken immer wieder synchronisieren (zB alle 2 Minuten!).
Ich habe Informationen zu verschiedenen Synchronisierungsmethoden wie Replikation, Zeitstempel, Protokolltabellen mithilfe von Triggern, Microsoft Sync Framework usw. erhalten.
Eigentlich möchte ich keine Synchronisationsmethode verwenden, die eine Blackbox sein könnte (wie die Replikation), weil ich nicht möchte, dass die SQL Server-spezifischen Tabellen blockiert werden, während ich sie aktualisiere und mit dem Server synchronisiere.
welche methode sollte ich deiner meinung nach unter solchen umständen anwenden? Denken Sie daran, dass ich alle paar Minuten mehrere Tabellenänderungen vom Client zum Server senden und auch zwei Tabellenänderungen vom Server abrufen muss.
Ich habe eine Methode gefunden, die seltsam, aber neu ist. Ist es möglich, dass ich alle ausgeführten (für bestimmte bevorzugte) gespeicherten Prozeduren im Client protokolliere und sie mit ihren Parametern in einer
.sql
Datei an den Server sende und dort ausführe? Das gleiche passiert auf dem Server und wird an den Client gesendet. Denken Sie, dass dies eine einfache, aber nützliche Methode ist oder nicht?Bitte schlagen Sie mir einen nützlichen Ansatz vor, wenn Sie können. Ich danke dir sehr.
BEARBEITEN: Denken Sie daran, dass dies eine Echtzeitsynchronisation ist und dies macht es besonders. Wenn der Clientbenutzer die Tabelle verwendet, muss der Synchronisierungsvorgang mit dem Server alle paar Minuten stattfinden, damit keine der Tabellen gesperrt werden muss.
quelle
Antworten:
Nun, ich verstehe es vielleicht nicht, aber ich versuche es zu beantworten.
Sie sagten, Sie brauchen eine Hochleistungslösung, die häufig ausgeführt wird (mindestens alle 2 Minuten), und Sie brauchen einen guten Ansatz, der schnell sein sollte, ohne zu blockieren. Aber Sie wollen kein Blackbox-System.
Anstelle eines Blackbox-Systems, das bei Millionen von Installationen mit guten Ergebnissen eingesetzt wird, versuchen Sie, das Rad erneut zu erfinden und Ihre eigene Lösung zu erstellen? Hm, klingt ein bisschen komisch.
In der Tat sind dies meine Vorschläge.
ISOLATION LEVEL
zuREAD_COMMITTED_SNAPSHOT
. Sie können mehr darüber lesen Sie hier . Dies verbraucht einen Teil Ihrer Tempdb, aber Ihre Tabelle ist immer lesbar und schreibbar und die Replikation kann im Hintergrund funktionieren.Siehe folgendes Beispiel:
CDC
bestimmten Umständen eine fragile Sache sein kann.CDC
erfasst alle Daten in einer überwachten Tabelle (Sie müssen jede überwachte Tabelle manuell angeben). Danach erhalten Sie den Wert vor und den Wert nach einemINSERT
,UPDATE
oderDELETE
.CDC
Diese Informationen werden für einen bestimmten Zeitraum gespeichert (Sie können sie selbst festlegen). Der Ansatz könnte darin bestehen,CDC
diese Änderungen für bestimmte Tabellen zu überwachen und manuell in die andere Datenbank zu replizieren.CDC
Verwendet übrigens auch die SQL Server-Replikation unter der Haube. ;-) Mehr darüber können Sie hier lesen .Nun, das sind meine 2 Cent. Hoffentlich haben Sie einen guten Überblick und vielleicht haben Sie eine Lösung gefunden, die für Sie funktioniert.
quelle
Ich werde versuchen, hier einige Optionen mit Vor- und Nachteilen aufzuzählen, wenn ich sie sehe:
Microsoft Sync Framework - scheint mir besser für kleinere Datenbanken von mobilen Apps geeignet zu sein. Es fügt Ihrer Datenbank eine Menge Tabellen hinzu und ist nicht so effizient wie die Replikation. Da es außerhalb von SQL Server als Komponente implementiert wird, ist die Konfiguration schwieriger. Ich habe keine Erfahrung damit, habe es nur ausprobiert und mich entschieden, es nicht zu benutzen.
Verfolgung von Datenbankänderungen . Dies ist eine integrierte SQL Server-Funktion, mit der Sie die Nachverfolgung einschließlich Einfügungen, Aktualisierungen und Löschvorgängen ändern können. Alles andere wie das Senden und Anwenden von Änderungen, das Lösen von Konflikten usw. müssen Sie selbst codieren.
CDC wie in Ionic's Antwort erwähnt - Ich habe keine Erfahrung damit, da es nur in Enterprise- oder Developer-Editionen verfügbar ist.
Die Verwendung Ihres eigenen Tricks bei der Protokollierung von gespeicherten Prozeduren hängt stark von der Art Ihrer Datenbankanwendung ab. Wenn sich die Abläufe jedoch nur geringfügig unterscheiden, kann es zu einer großen Datenverwirrung kommen. Und wie würden Sie mit Konflikten umgehen?
Aus Ihrer Frage geht hervor, dass Sie nur wenige Tabellen und nicht die gesamten großen Datenbanken synchronisieren müssen. Zu diesem Zweck sollten Sie Ihre Bedürfnisse genauer analysieren, als Sie in der Frage angegeben haben, wie zum Beispiel:
Wenn Sie irgendwann herausfinden, dass Löschvorgänge und Konflikte nicht Ihr Problem sind und sich Ihre Struktur nicht wesentlich ändert, können Sie Ihre eigene Logik schreiben, die jedoch leicht auf 1000 Codezeilen anwachsen kann.
quelle
Vielen Dank für Ihr Feedback.
Ich habe den Synchronisierungsprozess erfolgreich gelöst, indem ich die ausgeführten gespeicherten Prozeduren nicht als Gruppe, sondern nacheinander erfasst habe, was in meinem Fall sehr gut funktioniert hat. Da Integrität und alles sorgfältig geprüft wurden, arbeitete das System bisher in Echtzeit.
quelle
Späte Antwort, aber es kann hilfreich sein, Besucher zu fädeln
Bei dem Versuch, Daten auf verschiedenen Servern zu verteilen und mithilfe von Tools von Drittanbietern ( Diff für Schemaänderungen und DataDiff für die Synchronisierung von Datenänderungen) und dem folgenden PowerShell-Skript, das zur Automatisierung des Prozesses erforderlich ist, zu lösen, stellte sich eine ähnliche Herausforderung :
Diese Methode plant den Vergleich zwischen zwei Datenbanken und synchronisiert gefundene Änderungen in Echtzeit. Hier sind einige Artikel mit schrittweisen Anleitungen:
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 /
quelle