Erneutes Initialisieren eines Abonnements
Gilt für:SQL ServerAzure SQL-Datenbank
In diesem Thema wird beschrieben, wie Sie ein Abonnement in SQL Server mithilfe von SQL Server Management Studio, Transact-SQL oder Replikationsverwaltungsobjekten (Replication Management Objects, RMO) erneut initialisieren. Einzelne Abonnements können für die erneute Initialisierung markiert werden, sodass während der nächsten Synchronisierung eine neue Momentaufnahme angewendet wird.
Hinweis
Azure SQL Managed Instance kann als Herausgeber, Verleger und Abonnent der Momentaufnahmen- und Transaktionsreplikation fungieren. Datenbanken in Azure SQL-Datenbank können nun Pushabonnenten der Momentaufnahmen- und Transaktionsreplikation sein. Weitere Informationen finden Sie in den Abschnitten zur Transaktionsreplikation unter Replikation zu Azure SQL-Datenbank und Transaktionsreplikation mit Azure SQL Managed Instance (Vorschau).
Verwendung von SQL Server Management Studio
Das erneute Initialisieren eines Abonnements ist ein zweistufiger Prozess:
Zunächst müssen die Abonnements für eine Veröffentlichung, die erneut initialisiert werden sollen, gekennzeichnet werden. Aktivieren Sie Abonnements für die Erneute Initialisierung im Dialogfeld "Abonnements erneut initialisieren", das im Ordner "Lokale Publikationen " und im Ordner "Lokale Abonnements " in Microsoft SQL Server Management Studio verfügbar ist. Abonnements können darüber hinaus auch auf der Registerkarte Alle Abonnements und über den Veröffentlichungsknoten im Replikationsmonitor als erneut zu initialisieren gekennzeichnet werden. Informationen zum Starten des Replikationsmonitors finden Sie unter Starten des Replikationsmonitors. Beim Kennzeichnen eines Abonnements für die erneute Initialisierung können Sie zwischen den folgenden Optionen auswählen:
Aktuelle Momentaufnahme verwenden
Wählen Sie diese Option aus, wenn die aktuelle Momentaufnahme beim nächsten Ausführen des Verteilungs- oder Merge-Agents auf den Abonnenten angewendet werden soll. Wenn keine gültige Momentaufnahme verfügbar ist, kann diese Option nicht ausgewählt werden.Neue Momentaufnahme verwenden
Wählen Sie diese Option aus, wenn das Abonnement mithilfe einer neuen Momentaufnahme erneut initialisiert werden soll. Die Momentaufnahme kann erst auf den Abonnenten angewendet werden, nachdem sie vom Momentaufnahme-Agent generiert wurde. Wenn die Ausführung des Momentaufnahme-Agents auf einem Zeitplan basiert, wird das Abonnement erst nach der nächsten zeitplangesteuerten Ausführung des Momentaufnahme-Agents initialisiert. Wählen Sie die Option Neue Momentaufnahme jetzt generieren , um den Momentaufnahme-Agent sofort zu starten.Unsynchronisierte Änderungen am Abonnenten vor der erneuten Initialisierung hochladen
Nur für Mergereplikationen zulässig. Wählen Sie diese Option aus, um alle ausstehenden Änderungen aus der Abonnementdatenbank herunterzuladen, bevor die Daten des Abonnenten durch eine Momentaufnahme überschrieben werden.Wenn Sie einen parametrisierten Filter hinzufügen, löschen oder ändern, können ausstehende Änderungen auf dem Abonnenten während der erneuten Initialisierung nicht auf den Verleger hochgeladen werden. Wenn Sie ausstehende Änderungen hochladen möchten, sollten Sie vor dem Ändern des Filters alle Abonnements synchronisieren.
Ein Abonnement wird erneut initialisiert, sobald es wieder synchronisiert wird: Der Verteilungs-Agent (bei einer Transaktionsreplikation) bzw. der Merge-Agent (bei einer Mergereplikation) wendet auf alle Abonnenten mit einem Abonnement, das für eine erneute Initialisierung gekennzeichnet ist, die jeweils neueste Momentaufnahme an. Weitere Informationen zum Synchronisieren von Abonnements finden Sie unter Synchronize a Push Subscription und Synchronize a Pull Subscriptionverfügbar ist.
So kennzeichnen Sie ein einzelnes Push- oder Pullabonnement für die erneute Initialisierung in SQL Server Management Studio (auf dem Verleger)
Stellen Sie eine Verbindung mit Publisher in Management Studio her, und erweitern Sie dann den Serverknoten.
Erweitern Sie den Ordner Replikation , und erweitern Sie dann den Ordner Lokale Veröffentlichungen .
Erweitern Sie die Veröffentlichung mit dem Abonnement, das erneut initialisiert werden soll.
Klicken Sie mit der rechten Maustaste auf das Abonnement, und klicken Sie dann auf Erneut initialisieren.
Wählen Sie im Dialogfeld Abonnements erneut initialisieren die gewünschten Optionen aus, und klicken Sie dann auf Für erneute Initialisierung kennzeichnen.
So kennzeichnen Sie ein einzelnes Pullabonnement für die erneute Initialisierung in SQL Server Management Studio (auf dem Abonnenten)
Stellen Sie eine Verbindung mit dem Abonnenten in Management Studio her, und erweitern Sie dann den Serverknoten.
Erweitern Sie den Ordner Replikation , und erweitern Sie dann den Ordner Lokale Abonnements .
Klicken Sie mit der rechten Maustaste auf das Abonnement, und klicken Sie dann auf Erneut initialisieren.
Klicken Sie im angezeigten Bestätigungsdialogfeld auf Ja.
So kennzeichnen Sie alle Abonnements für die erneute Initialisierung in SQL Server Management Studio
Stellen Sie eine Verbindung mit Publisher in Management Studio her, und erweitern Sie dann den Serverknoten.
Erweitern Sie den Ordner Replikation , und erweitern Sie dann den Ordner Lokale Veröffentlichungen .
Klicken Sie mit der rechten Maustaste auf die Veröffentlichung mit den Abonnements, die erneut initialisiert werden sollen, und klicken Sie dann auf Alle Abonnements erneut initialisieren.
Wählen Sie im Dialogfeld Abonnements erneut initialisieren die gewünschten Optionen aus, und klicken Sie dann auf Für erneute Initialisierung kennzeichnen.
So kennzeichnen Sie ein einzelnes Push- oder Pullabonnement für die erneute Initialisierung im Replikationsmonitor
Erweitern Sie im Replikationsmonitor im linken Bereich eine Verlegergruppe, erweitern Sie einen Verleger, und klicken Sie dann auf eine Veröffentlichung.
Klicken Sie auf die Registerkarte Alle Abonnements .
Klicken Sie mit der rechten Maustaste auf das Abonnement, das Sie erneut initialisieren möchten, und klicken Sie dann auf Abonnement erneut initialisieren.
Wählen Sie im Dialogfeld Abonnements erneut initialisieren die gewünschten Optionen aus, und klicken Sie dann auf Für erneute Initialisierung kennzeichnen.
So kennzeichnen Sie alle Abonnements für die erneute Initialisierung im Replikationsmonitor
Erweitern Sie im Replikationsmonitor im linken Bereich eine Verlegergruppe, und erweitern Sie dann einen Verleger.
Klicken Sie mit der rechten Maustaste auf die Veröffentlichung mit den Abonnements, die erneut initialisiert werden sollen, und klicken Sie dann auf Alle Abonnements erneut initialisieren.
Wählen Sie im Dialogfeld Abonnements erneut initialisieren die gewünschten Optionen aus, und klicken Sie dann auf Für erneute Initialisierung kennzeichnen.
Verwenden von Transact-SQL
Abonnements können mithilfe von gespeicherten Replikationsprozeduren programmgesteuert erneut initialisiert werden. Welche gespeicherte Prozedur verwendet wird, hängt dem Typ des Abonnements (d. h. Push- oder Pullabonnement) und vom Typ der Veröffentlichung ab, zu der das Abonnement gehört.
So initialisieren Sie ein Pullabonnement für eine Transaktionsveröffentlichung erneut
Führen Sie beim Abonnenten der Abonnementdatenbank sp_reinitpullsubscription (Transact-SQL) aus. Geben Sie @publisher, @publisher_dbund @publicationan. Damit wird das Abonnement für die Neuinitialisierung bei der nächsten Ausführung des Verteilungs-Agents markiert.
(Optional) Starten Sie den Verteilungs-Agent auf dem Abonnenten, um das Abonnement zu synchronisieren. Weitere Informationen finden Sie unter Synchronize a Pull Subscription.
So initialisieren Sie ein Pushabonnement für eine Transaktionsveröffentlichung erneut
Führen Sie im Publisher sp_reinitsubscription (Transact-SQL) aus. Geben Sie @publication, @subscriberund @destination_dban. Damit wird das Abonnement für die Neuinitialisierung bei der nächsten Ausführung des Verteilungs-Agents markiert.
(Optional) Starten Sie den Verteilungs-Agent auf dem Verteiler, um das Abonnement zu synchronisieren. Weitere Informationen finden Sie unter Synchronize a Push Subscription.
So initialisieren Sie ein Pullabonnement mit einer Mergeveröffentlichung erneut
Führen Sie beim Abonnenten der Abonnementdatenbank sp_reinitmergepullsubscription (Transact-SQL) aus. Geben Sie @publisher, @publisher_dbund @publicationan. Um Änderungen vom Abonnenten hochzuladen, bevor die Neuinitialisierung durchgeführt wird, geben Sie den Wert true für @upload_firstan. Damit wird das Abonnement für die Neuinitialisierung bei der nächsten Ausführung des Merge-Agents markiert.
Wichtig
Wenn Sie einen parametrisierten Filter hinzufügen, löschen oder ändern, können ausstehende Änderungen auf dem Abonnenten während der erneuten Initialisierung nicht auf den Verleger hochgeladen werden. Wenn Sie ausstehende Änderungen hochladen möchten, sollten Sie vor dem Ändern des Filters alle Abonnements synchronisieren.
(Optional) Starten Sie den Merge-Agent auf dem Abonnenten, um das Abonnement zu synchronisieren. Weitere Informationen finden Sie unter Synchronize a Pull Subscription.
So initialisieren Sie ein Pushabonnement mit einer Mergeveröffentlichung erneut
Führen Sie im Publisher sp_reinitmergesubscription (Transact-SQL) aus. Geben Sie @publication, @subscriberund @subscriber_dban. Um Änderungen vom Abonnenten hochzuladen, bevor die Neuinitialisierung durchgeführt wird, geben Sie den Wert true für @upload_firstan. Damit wird das Abonnement für die Neuinitialisierung bei der nächsten Ausführung des Verteilungs-Agents markiert.
Wichtig
Wenn Sie einen parametrisierten Filter hinzufügen, löschen oder ändern, können ausstehende Änderungen auf dem Abonnenten während der erneuten Initialisierung nicht auf den Verleger hochgeladen werden. Wenn Sie ausstehende Änderungen hochladen möchten, sollten Sie vor dem Ändern des Filters alle Abonnements synchronisieren.
(Optional) Starten Sie den Merge-Agent auf dem Verteiler, um das Abonnement zu synchronisieren. Weitere Informationen finden Sie unter Synchronize a Push Subscription.
So legen Sie die Neuinitialisierungsrichtlinie während der Erstellung einer neuen Mergeveröffentlichung fest
Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergepublicationunter Angabe eines der folgenden Werte für @automatic_reinitialization_policyaus:
1 – Änderungen werden vom Abonnenten hochgeladen, bevor eine automatische Neuinitialisierung des Abonnements durchgeführt wird, die durch eine Änderung an der Veröffentlichung erforderlich wurde.
0 – Änderungen am Abonnenten werden verworfen, bevor eine automatische Neuinitialisierung des Abonnements durchgeführt wird, die durch eine Änderung an der Veröffentlichung erforderlich wurde.
Wichtig
Wenn Sie einen parametrisierten Filter hinzufügen, löschen oder ändern, können ausstehende Änderungen auf dem Abonnenten während der erneuten Initialisierung nicht auf den Verleger hochgeladen werden. Wenn Sie ausstehende Änderungen hochladen möchten, sollten Sie vor dem Ändern des Filters alle Abonnements synchronisieren.
Weitere Informationen finden Sie unter Create a Publication.
So ändern Sie die Neuinitialisierungsrichtlinie für eine vorhandene Mergeveröffentlichung
Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_changemergepublicationunter Angabe von automatic_reinitialization_policy für @property und einem der folgenden Werte für @valueaus:
1 – Änderungen werden vom Abonnenten hochgeladen, bevor eine automatische Neuinitialisierung des Abonnements durchgeführt wird, die durch eine Änderung an der Veröffentlichung erforderlich wurde.
0 – Änderungen am Abonnenten werden verworfen, bevor eine automatische Neuinitialisierung des Abonnements durchgeführt wird, die durch eine Änderung an der Veröffentlichung erforderlich wurde.
Wichtig
Wenn Sie einen parametrisierten Filter hinzufügen, löschen oder ändern, können ausstehende Änderungen auf dem Abonnenten während der erneuten Initialisierung nicht auf den Verleger hochgeladen werden. Wenn Sie ausstehende Änderungen hochladen möchten, sollten Sie vor dem Ändern des Filters alle Abonnements synchronisieren.
Weitere Informationen finden Sie unter View and Modify Publication Properties.
Verwenden von Replikationsverwaltungsobjekten (RMO)
Einzelne Abonnements können für die erneute Initialisierung markiert werden, sodass während der nächsten Synchronisierung eine neue Momentaufnahme angewendet wird. Abonnements können mithilfe von Replikationsverwaltungsobjekten (RMO) programmgesteuert erneut initialisiert werden. Die zu verwendenden Klassen hängen Typ der Veröffentlichung, zu der das Abonnement gehört, und dem Typ des Abonnements ab (d. h. Push- oder Pullabonnement).
So initialisieren Sie ein Pullabonnement für eine Transaktionsveröffentlichung erneut
Erstellen Sie eine Verbindung mit dem Abonnenten, indem Sie die ServerConnection -Klasse verwenden.
Erstellen Sie eine Instanz der TransPullSubscription -Klasse, und legen Sie PublicationName, DatabaseName, PublisherName, PublicationDBNamesowie die Verbindung aus Schritt 1 für ConnectionContextfest.
Rufen Sie die LoadProperties -Methode auf, um die Eigenschaften des Objekts abzurufen.
Hinweis
Wenn diese Methode falsezurückgibt, wurden die Abonnementeigenschaften in Schritt 2 falsch definiert, oder das Pullabonnement ist nicht vorhanden.
Rufen Sie die Reinitialize-Methode auf. Diese Methode markiert das Abonnement für die erneute Initialisierung.
Synchronisieren Sie das Pullabonnement. Weitere Informationen finden Sie unter Synchronize a Pull Subscription.
So initialisieren Sie ein Pushabonnement für eine Transaktionsveröffentlichung erneut
Erstellen Sie eine Verbindung mit dem Verleger, indem Sie die ServerConnection -Klasse verwenden.
Erstellen Sie eine Instanz der TransSubscription -Klasse, und legen Sie PublicationName, DatabaseName, SubscriberName, SubscriptionDBNamesowie die Verbindung aus Schritt 1 für ConnectionContextfest.
Rufen Sie die LoadProperties -Methode auf, um die Eigenschaften des Objekts abzurufen.
Hinweis
Wenn diese Methode falsezurückgibt, wurden entweder die Abonnementeigenschaften in Schritt 2 falsch definiert, oder das Pushabonnement ist nicht vorhanden.
Rufen Sie die Reinitialize-Methode auf. Diese Methode markiert das Abonnement für die erneute Initialisierung.
Synchronisieren Sie das Pushabonnement. Weitere Informationen finden Sie unter Synchronize a Push Subscription.
So initialisieren Sie ein Pullabonnement mit einer Mergeveröffentlichung erneut
Erstellen Sie eine Verbindung mit dem Abonnenten, indem Sie die ServerConnection -Klasse verwenden.
Erstellen Sie eine Instanz der MergePullSubscription -Klasse, und legen Sie PublicationName, DatabaseName, PublisherName, PublicationDBNamesowie die Verbindung aus Schritt 1 für ConnectionContextfest.
Rufen Sie die LoadProperties -Methode auf, um die Eigenschaften des Objekts abzurufen.
Hinweis
Wenn diese Methode falsezurückgibt, wurden die Abonnementeigenschaften in Schritt 2 falsch definiert, oder das Pullabonnement ist nicht vorhanden.
Rufen Sie die Reinitialize-Methode auf. Übergeben Sie den Wert true , wenn vor der erneuten Initialisierung Änderungen beim Abonnenten hochgeladen werden sollen, oder übergeben Sie den Wert false , wenn sofort erneut initialisiert und Änderungen beim Abonnenten nicht gespeichert werden sollen. Diese Methode markiert das Abonnement für die erneute Initialisierung.
Hinweis
Änderungen können nicht hochgeladen werden, wenn das Abonnement abgelaufen ist. Weitere Informationen finden Sie unter Set the Expiration Period for Subscriptions.
Synchronisieren Sie das Pullabonnement. Weitere Informationen finden Sie unter Synchronize a Pull Subscription.
So initialisieren Sie ein Pushabonnement mit einer Mergeveröffentlichung erneut
Erstellen Sie eine Verbindung mit dem Verleger, indem Sie die ServerConnection -Klasse verwenden.
Erstellen Sie eine Instanz der MergeSubscription -Klasse, und legen Sie PublicationName, DatabaseName, SubscriberName, SubscriptionDBNamesowie die Verbindung aus Schritt 1 für ConnectionContextfest.
Rufen Sie die LoadProperties -Methode auf, um die Eigenschaften des Objekts abzurufen.
Hinweis
Wenn diese Methode falsezurückgibt, wurden entweder die Abonnementeigenschaften in Schritt 2 falsch definiert, oder das Pushabonnement ist nicht vorhanden.
Rufen Sie die Reinitialize-Methode auf. Übergeben Sie den Wert true , wenn vor der erneuten Initialisierung Änderungen beim Abonnenten hochgeladen werden sollen, oder übergeben Sie den Wert false , wenn sofort erneut initialisiert und Änderungen beim Abonnenten nicht gespeichert werden sollen. Diese Methode markiert das Abonnement für die erneute Initialisierung.
Hinweis
Änderungen können nicht hochgeladen werden, wenn das Abonnement abgelaufen ist. Weitere Informationen finden Sie unter Set the Expiration Period for Subscriptions.
Synchronisieren Sie das Pushabonnement. Weitere Informationen finden Sie unter Synchronize a Push Subscription.
Beispiele (RMO)
Im folgenden Beispiel wird ein Pullabonnement für eine Transaktionsveröffentlichung erneut initialisiert.
// Define server, publication, and database names.
String subscriberName = subscriberInstance;
String publisherName = publisherInstance;
String publicationName = "AdvWorksProductTran";
String publicationDbName = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";
// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);
TransPullSubscription subscription;
try
{
// Connect to the Subscriber.
conn.Connect();
// Define subscription properties.
subscription = new TransPullSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = subscriptionDbName;
subscription.PublisherName = publisherName;
subscription.PublicationDBName = publicationDbName;
subscription.PublicationName = publicationName;
// If the pull subscription and the job exists, mark the subscription
// for reinitialization and start the agent job.
if (subscription.LoadProperties() && subscription.AgentJobId != null)
{
subscription.Reinitialize();
subscription.SynchronizeWithJob();
}
else
{
// Do something here if the subscription does not exist.
throw new ApplicationException(String.Format(
"A subscription to '{0}' does not exists on {1}",
publicationName, subscriberName));
}
}
catch (Exception ex)
{
// Do appropriate error handling here.
throw new ApplicationException("The subscription could not be reinitialized.", ex);
}
finally
{
conn.Disconnect();
}
' Define server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
' Create a connection to the Subscriber.
Dim conn As ServerConnection = New ServerConnection(subscriberName)
Dim subscription As TransPullSubscription
Try
' Connect to the Subscriber.
conn.Connect()
' Define subscription properties.
subscription = New TransPullSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = subscriptionDbName
subscription.PublisherName = publisherName
subscription.PublicationDBName = publicationDbName
subscription.PublicationName = publicationName
' If the pull subscription and the job exists, mark the subscription
' for reinitialization and start the agent job.
If subscription.LoadProperties() And (Not subscription.AgentJobId Is Nothing) Then
subscription.Reinitialize()
subscription.SynchronizeWithJob()
Else
' Do something here if the subscription does not exist.
Throw New ApplicationException(String.Format( _
"A subscription to '{0}' does not exists on {1}", _
publicationName, subscriberName))
End If
Catch ex As Exception
' Do appropriate error handling here.
Throw New ApplicationException("The subscription could not be reinitialized.", ex)
Finally
conn.Disconnect()
End Try
In diesem Beispiel wird ein Pullabonnement für eine Transaktionsveröffentlichung erneut initialisiert, nachdem Änderungen beim Abonnenten hochgeladen wurden.
// Define server, publication, and database names.
String subscriberName = subscriberInstance;
String publisherName = publisherInstance;
String publicationName = "AdvWorksSalesOrdersMerge";
String publicationDbName = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";
// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
conn.Connect();
// Define subscription properties.
subscription = new MergePullSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = subscriptionDbName;
subscription.PublisherName = publisherName;
subscription.PublicationDBName = publicationDbName;
subscription.PublicationName = publicationName;
// If the pull subscription and the job exists, mark the subscription
// for reinitialization after upload and start the agent job.
if (subscription.LoadProperties() && subscription.AgentJobId != null)
{
subscription.Reinitialize(true);
subscription.SynchronizeWithJob();
}
else
{
// Do something here if the subscription does not exist.
throw new ApplicationException(String.Format(
"A subscription to '{0}' does not exists on {1}",
publicationName, subscriberName));
}
}
catch (Exception ex)
{
// Do appropriate error handling here.
throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
conn.Disconnect();
}
' Define server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
' Create a connection to the Subscriber.
Dim conn As ServerConnection = New ServerConnection(subscriberName)
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
conn.Connect()
' Define subscription properties.
subscription = New MergePullSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = subscriptionDbName
subscription.PublisherName = publisherName
subscription.PublicationDBName = publicationDbName
subscription.PublicationName = publicationName
' If the pull subscription and the job exists, mark the subscription
' for reinitialization after upload and start the agent job.
If subscription.LoadProperties() And (Not subscription.AgentJobId Is Nothing) Then
subscription.Reinitialize(True)
subscription.SynchronizeWithJob()
Else
' Do something here if the subscription does not exist.
Throw New ApplicationException(String.Format( _
"A subscription to '{0}' does not exists on {1}", _
publicationName, subscriberName))
End If
Catch ex As Exception
' Do appropriate error handling here.
Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
conn.Disconnect()
End Try
Weitere Informationen
Erneutes Initialisieren von Abonnements
Replication Management Objects Concepts
Bewährte Methoden für die Replikationssicherheit