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.
- Replikation, selbst wenn Sie sagten, dass Sie sie nicht verwenden werden. Es ist die einfachste und beste Lösung, die Sie dafür verwenden können. Die Replikation ist einfach einzurichten, schnell zu replizieren und Sie müssen das Rad nicht neu erfinden. Wenn Sie einfach seltsam zu sperren, können Sie versuchen , die festlegen
ISOLATION LEVEL
zu READ_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:
ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
- CDC (Change Data Capture) kann ebenfalls eine Lösung sein. Aber auf diese Weise müssen Sie fast alles selbst bauen. Und ich habe die Erfahrung gemacht, dass unter
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 einem INSERT
, UPDATE
oder DELETE
. 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 .
Warnung: CDC
wird nicht über DDL
Änderungen informiert. Wenn Sie also eine Tabelle ändern und eine neue Spalte hinzufügen, CDC
wird die Tabelle überwacht, alle Änderungen an der neuen Spalte werden jedoch ignoriert. In der Tat zeichnet es nur NULL
als Wert vor und Wert nach. Sie müssen es nach DDL
-Änderungen an einer beobachteten Tabelle neu initialisieren.
- Die oben beschriebene Vorgehensweise entspricht in etwa der Erfassung eines Workloads mit SQL Server Profiler und dessen erneuter Ausführung in einer anderen Datenbank für einige Benchmarks. Nun könnte es funktionieren. Aber die Tatsache, dass es zu viele Nebenwirkungen gibt, ist mir ein bisschen zu schwer. Was tun Sie, wenn Sie einen Prozeduraufruf auf Ihrem Client erfassen? Führen Sie anschließend denselben Befehl in Ihrer Prinzipaldatenbank aus, der nicht mehr synchron ist. Die Prozedur wird möglicherweise ausgeführt, löscht / aktualisiert / fügt jedoch möglicherweise Zeilen ein, die in Ihrem Client nicht vorhanden waren. Oder wie gehen Sie mit mehreren Kunden mit einem Prinzip um? Ich finde das zu knifflig. Im schlimmsten Fall zerstören Sie wahrscheinlich Ihre Integrität.
- Eine andere Idee könnte anwendungsbasiert sein oder einen Auslöser verwenden. Abhängig davon, wie viele Tabellen synchronisiert werden sollen. Sie können alle Änderungen in eine separate Staging-Tabelle schreiben und einen SQL Server-Agent-Job alle x Minuten ausführen, um diese Zeilen in der Staging-Tabelle mit Ihrem Master zu synchronisieren. Dies kann jedoch etwas zu schwer sein, wenn Sie versuchen, (zB) 150 Tabellen zu synchronisieren. Sie würden einen großen Aufwand haben.
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.