Wenn Sie die Transaktionsreplikation von SQL 2008 R2 mit Pull-Abonnenten verwenden und einen Artikel hinzufügen, möchten Sie vermeiden, dass Sie einen vollständigen Snapshot erstellen müssen (die Datenbank hat ~ 80 GB, dies dauert also Stunden).
In diesem Artikel habe ich gesehen, wie dies mit einem Teil-Snapshot durch Deaktivieren von "instant_sync" geschehen kann, aber das hat bei uns nicht funktioniert.
Idealerweise möchte ich dies einfach als Teil unseres DB-Skripts ausführen, um die Tabelle zu erstellen. Wenn wir sie also replizieren möchten, tun wir Folgendes:
Create Table ...
sp_addArticle ...
sp_PushThisToOurSubscribersNow
quelle
quelle
Ich hatte die gleiche Frage, und obwohl ich eine Weile DBA war, habe ich mich nicht tief genug mit der Replikation befasst, um damit vollständig vertraut zu sein. Daher fand ich die folgenden Ressourcen und Anleitungen hilfreich:
Dieser Blog lieferte einen guten Überblick über den Prozess. Es erinnert uns auch daran, dass, wenn Sie über eine große vorhandene Publikation verfügen und deren Option auf "mediate_sync "festgelegt ist, jedes Mal, wenn Sie einen Artikel hinzufügen oder ändern, ein völlig neuer Schnappschuss erstellt wird. Er hat also einen praktischen Tipp, um diese Option zu ändern
sp_changePublication @publication='MyPub', @property='immediate_sync', @value='false';
MSDN-Blogpost in "repltalk" (klingt im Allgemeinen nach einer guten Ressource!) - nicht "direkt direkt" bezogen, aber dennoch hilfreich
In dieser Frage, in der @ Brandon-Williams darauf hingewiesen hat, dass Sie ein Pull- Abonnement auch mit aktualisieren sollten
sp_refreshSubscriptions @publication = 'MyPub'
SSMS Replication Monitor - Bequeme Methode zum Stoppen und Starten der Agenten (Snapshot, Protokollleser), wenn Sie die Anleitung befolgen.
Hier sind die tatsächlichen Schritte, denen ich gefolgt bin, die gut funktioniert haben und die die Genehmigung meines überwachenden DBA erhalten haben:
sp_changePublication
Stellen Sie die Veröffentlichung mit - yes auf not allow-anonymous & not instant -sync ein, wie @cody_konior hervorhebt, dies ist nicht ausreichend dokumentiert, aber es hat in meinem Fall einwandfrei funktioniert. YMMVsp_addArticle
sp_articleColumn
(angegebene Publikation & Artikel, KEINE Spalten angeben -> impliziert ALLE Spalten)sp_refreshSubscriptions
damit diese Publikation den Puller aktualisiertUnd während ja, Sie könnten die meisten Änderungen mit dem SSMS GUI tun, finde ich es hilfreich Skript alles aus , so kann es sein , A) unter Quellcodeverwaltung (Änderungssteuerung) und B) eingesetzt wiederholt oder um mehrere Instanzen . Leider habe ich nicht die Zeit aufgewendet, um die Stopps / Starts des Agenten per Skript auszuführen, aber das sollte nicht zu schwierig sein, da es sich nur um SQL Agent-Jobs handelt. Sie müssen nur den ganzen Trick "Die Job-ID mit dem Job-Namen finden" ausführen (Abfrage
sysjobs
- wirklich, MS?) ...Hoffe das hilft zukünftigen Lesern!
quelle
Wie unter Hinzufügen von Artikeln zu vorhandenen Publikationen und Löschen von Artikeln aus vorhandenen Publikationen beschrieben , müssen Sie * einen neuen Snapshot für die Publikation erstellen.
Um zu vermeiden, dass beim Hinzufügen eines neuen Artikels für alle Artikel ein Snapshot erstellt wird,
immediate_sync
muss die Publikationseigenschaft auf 0 gesetzt werden. Rufen Siesp_addarticle
dann aufsp_addsubscription
. Wenn Abonnements gezogen werden, müssen Sie auch anrufensp_refreshsubscriptions
. Generieren Sie dann einen Schnappschuss und es wird nur ein Schnappschuss für den neu hinzugefügten Artikel generiert.* Dies ist der empfohlene Ansatz in der SQL Server-Onlinedokumentation. Das Problem bei Ihrer Vorgehensweise ist, dass sie fehleranfällig ist.
quelle
Hauptbearbeitung Dies ist eine vollständige Neufassung dieser Antwort (unter Berücksichtigung der berechtigten Kritik, dass die vorherige Version fehleranfällig war und Probleme verursachen würde).
Veröffentlichte auch eine Demo, wie man dies anwendet auf: Youtube - SQL Server Replication: Wie man einen Artikel hinzufügt, ohne einen Schnappschuss zu machen .
WICHTIG: Dies ist KEIN empfohlener Ansatz von Microsoft. Sie sind also auf sich allein gestellt, wenn es darum geht, das Produkt zum Laufen zu bringen. Sie sollten sich NICHT direkt an Ihre Produktionsumgebung wenden, ohne umfangreiche Einzeltests durchzuführen und sich mit den Schritten vertraut zu machen.
Schritte zum folgen:
Verifizieren:
BEISPIEL Verfahren
A) Erstellen Sie sich eine Tabelle auf Ihrem Verlag:
B) Erstellen Sie sich einen Job / einen Prozess / ein Skript, um einige Einfügungen / Aktualisierungen / Löschungen in [TableNotUsingSnap] vorzunehmen (Sie können dies dann verwenden, um zu überprüfen, wie der Abonnent mit dieser Methode korrekt synchronisiert wird.
Vorschritte:
1. Erstellen Sie Ihre Tabelle auf dem Abonnenten
2. Erstellen Sie Ihre gespeicherten Replikationsprozeduren (Aktualisieren / Einfügen / Löschen) - auf dem Abonnenten
Sie können die Repl-Procs erstellen:
Die Änderung, die Sie anwenden müssen:
IF NOT EXISTS (SELECT 'row already exists' FROM [Schema].[TableName] dest WITH (NOLOCK) WHERE dest.Id = @c1)
um nicht einzufügen, wenn es bereits vorhanden istIF @@rowcount = 0 ... exec sp_MSreplraiserror ...
, um ein Update zu ignorieren, das nicht angewendet wird (da der Datensatz möglicherweise auf dem Publisher gelöscht wurde, bevor Sie die Daten synchronisiert haben).IF @@rowcount = 0 ... exec sp_MSreplraiserror ...
, um ein Löschen zu ignorieren, das nicht angewendet wird (da der Datensatz möglicherweise auf dem Publisher gelöscht wurde, bevor Sie die Daten synchronisiert haben).sp_MSins_dboTableNotUsingSnap:
sp_MSupd_dboTableNotUsingSnap:
sp_MSdel_dboTableNotUsingSnap:
ENTWICKLUNGSSCHRITTE
3. Stoppen Sie den Verteilungsagenten - Auf dem Verteiler (Push) oder Abonnenten (Pull)
4. Fügen Sie nun den Artikel zur Publikation hinzu - Auf dem Verlag
Schlüsselparameter:
sp_addarticle
-@pre_creation_cmd = N'none'
Wird verwendet, um den Distributionsagenten anzuweisen, keine eigenen Objekte abzulegen und zu generierensp_addsubscription
-@sync_type = N'none'
Wird verwendet, um Distributer mitzuteilen, dass kein neuer Snapshot erstellt werden muss, sondern nur die IUD-Befehle in die Warteschlange gestellt werden könnensp_addarticle:
5. Synchronisieren Sie Ihre Daten über
Jetzt müssen Sie Ihre Daten auf Ihren Abonnenten kopieren. Sie können:
Die genaue Methode, die Sie verwenden, überlasse ich dem Leser. Sie hängt auch davon ab, wie lange Sie bereit sind, Ihren Distributionsagenten anzuhalten.
EXTRA: Als zusätzlichen Schritt in Ihren Tests ist hier ein guter Punkt, um Ihr Skript (ab Schritt (B)) auszuführen und IUP-Aktionen für [TableNotUsingSnap] zu erstellen, damit Sie Vertrauen in diese Methode gewinnen können.
6. Starten Sie den Verteilungsagenten neu - Auf dem Verteiler (Push) oder Abonnenten (Pull)
quelle