Erneutes Initialisieren eines Abonnements

In diesem Thema wird beschrieben, wie Sie ein Abonnement in SQL Server 2014 mithilfe von SQL Server Management Studio, Transact-SQL oder Replikationsverwaltungsobjekten (Replication Management Objects, RMO) neu initialisieren. Einzelne Abonnements können für die erneute Initialisierung markiert werden, sodass während der nächsten Synchronisierung eine neue Momentaufnahme angewendet wird.

In diesem Thema

Verwendung von SQL Server Management Studio

Das erneute Initialisieren eines Abonnements ist ein zweistufiger Prozess:

  1. Zunächst müssen die Abonnements für eine Veröffentlichung, die erneut initialisiert werden sollen, gekennzeichnet werden. Das Kennzeichnen der Abonnements für die erneute Initialisierung erfolgt im Dialogfeld Abonnements erneut initialisieren, das über die Ordner Lokale Veröffentlichungen und 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.

  2. 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)

  1. Stellen Sie in Management Studioeine Verbindung mit dem Verleger her, und erweitern Sie dann den Serverknoten.

  2. Erweitern Sie den Ordner Replikation , und erweitern Sie dann den Ordner Lokale Veröffentlichungen .

  3. Erweitern Sie die Veröffentlichung mit dem Abonnement, das erneut initialisiert werden soll.

  4. Klicken Sie mit der rechten Maustaste auf das Abonnement, und klicken Sie dann auf Erneut initialisieren.

  5. 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)

  1. Stellen Sie in Management Studioeine Verbindung mit dem Abonnenten her, und erweitern Sie dann den Serverknoten.

  2. Erweitern Sie den Ordner Replikation , und erweitern Sie dann den Ordner Lokale Abonnements .

  3. Klicken Sie mit der rechten Maustaste auf das Abonnement, und klicken Sie dann auf Erneut initialisieren.

  4. Klicken Sie im angezeigten Bestätigungsdialogfeld auf Ja.

So kennzeichnen Sie alle Abonnements für die erneute Initialisierung in SQL Server Management Studio

  1. Stellen Sie in Management Studioeine Verbindung mit dem Verleger her, und erweitern Sie dann den Serverknoten.

  2. Erweitern Sie den Ordner Replikation , und erweitern Sie dann den Ordner Lokale Veröffentlichungen .

  3. 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.

  4. 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

  1. Erweitern Sie im Replikationsmonitor im linken Bereich eine Verlegergruppe, erweitern Sie einen Verleger, und klicken Sie dann auf eine Veröffentlichung.

  2. Klicken Sie auf die Registerkarte Alle Abonnements .

  3. Klicken Sie mit der rechten Maustaste auf das Abonnement, das Sie erneut initialisieren möchten, und klicken Sie dann auf Abonnement erneut initialisieren.

  4. 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

  1. Erweitern Sie im Replikationsmonitor im linken Bereich eine Verlegergruppe, und erweitern Sie dann einen Verleger.

  2. 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.

  3. 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

  1. Führen Sie beim Abonnenten für die Abonnementdatenbank sp_reinitpullsubscription (Transact-SQL) aus. Geben Sie @publisher, @publisher_db und @publication an. Damit wird das Abonnement für die Neuinitialisierung bei der nächsten Ausführung des Verteilungs-Agents markiert.

  2. (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

  1. Führen Sie auf dem Verleger sp_reinitsubscription (Transact-SQL) aus. Geben Sie @publication, @subscriber und @destination_db an. Damit wird das Abonnement für die Neuinitialisierung bei der nächsten Ausführung des Verteilungs-Agents markiert.

  2. (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

  1. Führen Sie beim Abonnenten für die Abonnementdatenbank sp_reinitmergepullsubscription (Transact-SQL) aus. Geben Sie @publisher, @publisher_db und @publication an. Um Änderungen aus dem Abonnenten hochzuladen, bevor die Erneute Initialisierung erfolgt, geben Sie für @upload_first den Wert von true an. 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.

  2. (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

  1. Führen Sie auf dem Verleger sp_reinitmergesubscription (Transact-SQL) aus. Geben Sie @publication, @subscriber und @subscriber_db an. Um Änderungen aus dem Abonnenten hochzuladen, bevor die Erneute Initialisierung erfolgt, geben Sie für @upload_first den Wert von true an. 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.

  2. (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

  1. Führen Sie auf dem Verleger in der Veröffentlichungsdatenbank sp_addmergepublication aus, und geben Sie einen der folgenden Werte für @automatic_reinitialization_policy an:

    • 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

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_changemergepublication aus, und geben Sie dabei automatic_reinitialization_policy für @property und einen der folgenden Werte für @value an:

    • 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

  1. Erstellen Sie eine Verbindung mit dem Abonnenten, indem Sie die ServerConnection -Klasse verwenden.

  2. Erstellen Sie eine Instanz der TransPullSubscription -Klasse, und legen Sie PublicationName, DatabaseName, PublisherName, PublicationDBNamesowie die Verbindung aus Schritt 1 für ConnectionContextfest.

  3. Rufen Sie die LoadProperties -Methode auf, um die Eigenschaften des Objekts abzurufen.

    Hinweis

    Wenn diese Methode false zurückgibt, wurden die Abonnementeigenschaften in Schritt 2 falsch definiert, oder das Pullabonnement ist nicht vorhanden.

  4. Rufen Sie die Reinitialize -Methode auf. Diese Methode markiert das Abonnement für die erneute Initialisierung.

  5. Synchronisieren Sie das Pullabonnement. Weitere Informationen finden Sie unter Synchronize a Pull Subscription.

So initialisieren Sie ein Pushabonnement für eine Transaktionsveröffentlichung erneut

  1. Erstellen Sie eine Verbindung mit dem Verleger, indem Sie die ServerConnection -Klasse verwenden.

  2. Erstellen Sie eine Instanz der TransSubscription -Klasse, und legen Sie PublicationName, DatabaseName, SubscriberName, SubscriptionDBNamesowie die Verbindung aus Schritt 1 für ConnectionContextfest.

  3. Rufen Sie die LoadProperties -Methode auf, um die Eigenschaften des Objekts abzurufen.

    Hinweis

    Wenn diese Methode false zurückgibt, wurden entweder die Abonnementeigenschaften in Schritt 2 falsch definiert, oder das Pushabonnement ist nicht vorhanden.

  4. Rufen Sie die Reinitialize -Methode auf. Diese Methode markiert das Abonnement für die erneute Initialisierung.

  5. Synchronisieren Sie das Pushabonnement. Weitere Informationen finden Sie unter Synchronize a Push Subscription.

So initialisieren Sie ein Pullabonnement mit einer Mergeveröffentlichung erneut

  1. Erstellen Sie eine Verbindung mit dem Abonnenten, indem Sie die ServerConnection -Klasse verwenden.

  2. Erstellen Sie eine Instanz der MergePullSubscription -Klasse, und legen Sie PublicationName, DatabaseName, PublisherName, PublicationDBNamesowie die Verbindung aus Schritt 1 für ConnectionContextfest.

  3. Rufen Sie die LoadProperties -Methode auf, um die Eigenschaften des Objekts abzurufen.

    Hinweis

    Wenn diese Methode false zurückgibt, wurden die Abonnementeigenschaften in Schritt 2 falsch definiert, oder das Pullabonnement ist nicht vorhanden.

  4. 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.

  5. Synchronisieren Sie das Pullabonnement. Weitere Informationen finden Sie unter Synchronize a Pull Subscription.

So initialisieren Sie ein Pushabonnement mit einer Mergeveröffentlichung erneut

  1. Erstellen Sie eine Verbindung mit dem Verleger, indem Sie die ServerConnection -Klasse verwenden.

  2. Erstellen Sie eine Instanz der MergeSubscription -Klasse, und legen Sie PublicationName, DatabaseName, SubscriberName, SubscriptionDBNamesowie die Verbindung aus Schritt 1 für ConnectionContextfest.

  3. Rufen Sie die LoadProperties -Methode auf, um die Eigenschaften des Objekts abzurufen.

    Hinweis

    Wenn diese Methode false zurückgibt, wurden entweder die Abonnementeigenschaften in Schritt 2 falsch definiert, oder das Pushabonnement ist nicht vorhanden.

  4. 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.

  5. 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 = "AdventureWorks2012";
String subscriptionDbName = "AdventureWorks2012Replica";

// 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 = "AdventureWorks2012"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"

' 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 = "AdventureWorks2012";
String subscriptionDbName = "AdventureWorks2012Replica";

// 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 = "AdventureWorks2012"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"

' 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