Freigeben über


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) erneut initialisieren. Einzelne Abonnements können zur Erneutitialisierung markiert werden, sodass während der nächsten Synchronisierung eine neue Momentaufnahme angewendet wird.

In diesem Themenbereich

Verwendung von SQL Server Management Studio

Das Erneute Initialisieren eines Abonnements ist ein zweiteiliger Prozess:

  1. Ein einzelnes Abonnement oder alle Abonnements für eine Publikation werden zur Erneutitialisierung markiert . 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. Sie können Abonnements auch über die Registerkarte "Alle Abonnements " und den Knoten "Publikationen" im Replikationsmonitor markieren. Informationen zum Starten des Replikationsmonitors finden Sie unter Starten des Replikationsmonitors. Wenn Sie ein Abonnement für die Erneute Initialisierung markieren, haben Sie die folgenden Optionen:

    Verwenden der aktuellen Momentaufnahme
    Wählen Sie diese Option aus, um die derzeitige Momentaufnahme beim nächsten Ausführen des Verteiler-Agents oder des Zusammenführungs-Agent auf den Abonnent anzuwenden. Wenn keine gültige Momentaufnahme verfügbar ist, kann diese Option nicht ausgewählt werden.

    Verwenden Sie eine neue Momentaufnahme
    Wählen Sie diese Option aus, um das Abonnement mit einer neuen Momentaufnahme erneut zu initialisieren. Die Snapshot kann auf den Abonnenten erst angewendet werden, nachdem sie vom Snapshot-Agent generiert wurde. Wenn der Snapshot-Agent für die Ausführung nach einem Zeitplan festgelegt ist, wird das Abonnement erst nach der nächsten geplanten Snapshot-Agent-Ausführung erneut initialisiert. Wählen Sie jetzt "Neue Momentaufnahme generieren " aus, um den Snapshot-Agent sofort zu starten.

    Hochladen nicht synchronisierter Änderungen vor der Reinitialisierung
    Replikation nur zusammenführen. Wählen Sie die Option, um alle ausstehenden Änderungen aus der Abonnementdatenbank hochzuladen, bevor die Daten am Abonnenten mit einer Momentaufnahme überschrieben werden.

    Ausstehende Änderungen am Abonnenten können während der Reinitialisierung nicht auf den Publisher hochgeladen werden, wenn Sie einen parametrisierten Filter hinzufügen, entfernen oder ändern. Wenn Sie ausstehende Änderungen hochladen möchten, synchronisieren Sie alle Abonnements, bevor Sie den Filter ändern.

  2. Ein Abonnement wird erneut initialisiert, wenn es das nächste Mal synchronisiert wird: Der Verteilungs-Agent (für die Transaktionsreplikation) oder der Seriendruck-Agent (für die Zusammenführungsreplikation) wendet die neueste Momentaufnahme auf jeden Abonnenten an, der ein Abonnement für die Erneute Initialisierung markiert hat. Weitere Informationen zum Synchronisieren von Abonnements finden Sie unter Synchronisieren eines Pushabonnements und Synchronisieren eines Pullabonnements.

So markieren Sie ein einzelnes Push- oder Pullabonnement für die Erneute Initialisierung in Management Studio (im Publisher)

  1. Stellen Sie eine Verbindung mit Publisher in Management Studio her, und erweitern Sie dann den Serverknoten.

  2. Erweitern Sie den Replikationsordner , und erweitern Sie dann den Ordner " Lokale Publikationen ".

  3. Erweitern Sie die Publikation mit dem Abonnement, das Sie erneut initialisieren möchten.

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

  5. Wählen Sie im Dialogfeld "Abonnement erneut initialisieren " Die Optionen aus, und klicken Sie dann auf "Zur Neuitialisierung markieren".

So markieren Sie ein einzelnes Pullabonnement für die Erneute Initialisierung in Management Studio (am Abonnenten)

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

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

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

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

So markieren Sie alle Abonnements für die Erneute Initialisierung in Management Studio

  1. Stellen Sie eine Verbindung mit Publisher in Management Studio her, und erweitern Sie dann den Serverknoten.

  2. Erweitern Sie den Replikationsordner , und erweitern Sie dann den Ordner " Lokale Publikationen ".

  3. Klicken Sie mit der rechten Maustaste auf die Publikation mit Abonnements, die Sie erneut initialisieren möchten, und klicken Sie dann auf "Alle Abonnements erneut initialisieren".

  4. Wählen Sie im Dialogfeld "Abonnement erneut initialisieren " Die Optionen aus, und klicken Sie dann auf "Zur Neuitialisierung markieren".

So markieren Sie ein einzelnes Push- oder Pullabonnement für die Erneute Initialisierung im Replikationsmonitor

  1. Erweitern Sie im Replikationsmonitor eine Publisher-Gruppe im linken Bereich, erweitern Sie einen Publisher, und klicken Sie dann auf eine Publikation.

  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 "Abonnement erneut initialisieren " Die Optionen aus, und klicken Sie dann auf "Zur Neuitialisierung markieren".

So markieren Sie alle Abonnements für die Erneute Initialisierung im Replikationsmonitor

  1. Erweitern Sie im Replikationsmonitor eine Publisher-Gruppe im linken Bereich, und erweitern Sie dann einen Publisher.

  2. Klicken Sie mit der rechten Maustaste auf die Publikation mit Abonnements, die Sie erneut initialisieren möchten, und klicken Sie dann auf "Alle Abonnements erneut initialisieren".

  3. Wählen Sie im Dialogfeld "Abonnement erneut initialisieren " Die Optionen aus, und klicken Sie dann auf "Zur Neuitialisierung markieren".

Verwenden von Transact-SQL

Abonnements können programmgesteuert mithilfe gespeicherter Replikationsprozeduren erneut initialisiert werden. Die gespeicherte Prozedur, die verwendet wird, hängt vom Typ des Abonnements (Push oder Pull) und der Art der Veröffentlichung ab, zu der das Abonnement gehört.

So initialisieren Sie ein Pullabonnement für eine transaktionsbasierte Publikation erneut

  1. Führen Sie beim Abonnenten in der Abonnementdatenbank sp_reinitpullsubscription (Transact-SQL) aus. Geben Sie @publisher, @publisher_db und @publication an. Dadurch wird das Abonnement für die Erneute Initialisierung gekennzeichnet, wenn der Verteilungs-Agent das nächste Mal ausgeführt wird.

  2. (Optional) Starten Sie den Verteiler-Agent beim Abonnenten, um das Abonnement zu synchronisieren. Weitere Informationen finden Sie unter Synchronisation eines Pullabonnements.

So initialisieren Sie ein Pushabonnement für eine transaktionsbasierte Publikation erneut

  1. Führen Sie im Publisher sp_reinitsubscription (Transact-SQL) aus. Geben Sie @publication, @subscriber und @destination_db an. Dadurch wird das Abonnement für die Erneute Initialisierung gekennzeichnet, wenn der Verteilungs-Agent das nächste Mal ausgeführt wird.

  2. (Optional) Starten Sie den Vertriebsmitarbeiter beim Distributor, um das Abonnement zu synchronisieren. Weitere Informationen finden Sie unter Synchronisieren eines Pushabonnements.

So initialisieren Sie ein Pullabonnement für eine Zusammenführungsveröffentlichung erneut

  1. Bei dem Abonnenten in der Abonnementdatenbank führen Sie sp_reinitmergepullsubscription (Transact-SQL) aus. Geben Sie @publisher, @publisher_db und @publication an. Um Änderungen vom Abonnenten hochzuladen, bevor die Erneute Initialisierung erfolgt, geben Sie einen Wert true für @upload_first an. Dadurch wird das Abonnement für die erneute Initialisierung gekennzeichnet, wenn der Merge-Agent das nächste Mal ausgeführt wird.

    Von Bedeutung

    Ausstehende Änderungen am Abonnenten können während der Reinitialisierung nicht auf den Publisher hochgeladen werden, wenn Sie einen parametrisierten Filter hinzufügen, entfernen oder ändern. Wenn Sie ausstehende Änderungen hochladen möchten, synchronisieren Sie alle Abonnements, bevor Sie den Filter ändern.

  2. (Optional) Starten Sie den Merge-Agent beim Abonnenten, um das Abonnement zu synchronisieren. Weitere Informationen finden Sie unter Synchronisation eines Pullabonnements.

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

  1. Führen Sie im Publisher sp_reinitmergesubscription (Transact-SQL) aus. Geben Sie @publication, @subscriber und @subscriber_db an. Um Änderungen vom Abonnenten hochzuladen, bevor die Erneute Initialisierung erfolgt, geben Sie einen Wert true für @upload_first an. Dadurch wird das Abonnement für die Erneute Initialisierung gekennzeichnet, wenn der Verteilungs-Agent das nächste Mal ausgeführt wird.

    Von Bedeutung

    Ausstehende Änderungen am Abonnenten können während der Reinitialisierung nicht auf den Publisher hochgeladen werden, wenn Sie einen parametrisierten Filter hinzufügen, entfernen oder ändern. Wenn Sie ausstehende Änderungen hochladen möchten, synchronisieren Sie alle Abonnements, bevor Sie den Filter ändern.

  2. (Optional) Starten Sie den Zusammenführungs-Agent beim Distributor, um das Abonnement zu synchronisieren. Weitere Informationen finden Sie unter Synchronisieren eines Pushabonnements.

Legen Sie die Richtlinie für die erneute Initialisierung beim Erstellen einer neuen Zusammenführungsveröffentlichung fest.

  1. Führen Sie bei dem Publisher in der Publikationsdatenbank sp_addmergepublication aus, wobei Sie einen der folgenden Werte für @automatic_reinitialization_policy angeben:

    • 1 – Änderungen werden vom Abonnenten hochgeladen, bevor ein Abonnement automatisch neu initialisiert wird, wenn eine Änderung an der Publikation erforderlich ist.

    • 0 – Änderungen am Abonnenten werden verworfen, wenn ein Abonnement bei bedarf einer Änderung an der Publikation automatisch neu initialisiert wird.

    Von Bedeutung

    Ausstehende Änderungen am Abonnenten können während der Reinitialisierung nicht auf den Publisher hochgeladen werden, wenn Sie einen parametrisierten Filter hinzufügen, entfernen oder ändern. Wenn Sie ausstehende Änderungen hochladen möchten, synchronisieren Sie alle Abonnements, bevor Sie den Filter ändern.

    Weitere Informationen finden Sie unter Erstellen einer Publikation.

So ändern Sie die Reinitialisierungsrichtlinie für eine vorhandene Zusammenführungsveröffentlichung

  1. Führen Sie im Publisher in der Publikationsdatenbank sp_changemergepublication aus, und geben Sie automatic_reinitialization_policy für @property und einen der folgenden Werte für @value an:

    • 1 – Änderungen werden vom Abonnenten hochgeladen, bevor ein Abonnement automatisch neu initialisiert wird, wenn eine Änderung an der Publikation erforderlich ist.

    • 0 – Änderungen am Abonnenten werden verworfen, wenn aufgrund einer Änderung an der Publikation ein Abonnement automatisch neu initialisiert wird.

    Von Bedeutung

    Ausstehende Änderungen am Abonnenten können während der Reinitialisierung nicht auf den Publisher hochgeladen werden, wenn Sie einen parametrisierten Filter hinzufügen, entfernen oder ändern. Wenn Sie ausstehende Änderungen hochladen möchten, synchronisieren Sie alle Abonnements, bevor Sie den Filter ändern.

    Weitere Informationen finden Sie unter "Publikationseigenschaften anzeigen und ändern".

Verwenden von Replikationsverwaltungsobjekten (RMO)

Einzelne Abonnements können zur Neuinitialisierung markiert werden, sodass während der nächsten Synchronisierung ein neuer Schnappschuss angewendet wird. Abonnements können programmgesteuert mithilfe von Replikationsverwaltungsobjekten (Replication Management Objects, RMO) erneut initialisiert werden. Die von Ihnen verwendeten Klassen hängen vom Typ der Publikation ab, zu der das Abonnement gehört, und vom Typ des Abonnements (d. h. einem Push- oder Pullabonnement).

So initialisieren Sie ein Pullabonnement für eine transaktionsbasierte Publikation erneut

  1. Erstellen Sie mithilfe der ServerConnection Klasse eine Verbindung mit dem Abonnenten.

  2. Erstellen Sie eine Instanz der TransPullSubscription Klasse, und legen Sie PublicationName, DatabaseName, PublisherName, PublicationDBName und die Verbindung aus Schritt 1 für ConnectionContext fest.

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

    Hinweis

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

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

  5. Synchronisieren Sie das Pull-Abonnement. Weitere Informationen finden Sie unter Synchronisation eines Pullabonnements.

So initialisieren Sie ein Pushabonnement für eine transaktionsbasierte Publikation erneut

  1. Erstellen Sie mithilfe der ServerConnection Klasse eine Verbindung mit dem Publisher.

  2. Erstellen Sie eine Instanz der Klasse TransSubscription, und setzen Sie PublicationName, DatabaseName, SubscriberName, SubscriptionDBName sowie die Verbindung aus Schritt 1 für ConnectionContext.

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

    Hinweis

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

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

  5. Synchronisieren sie das Pushabonnement. Weitere Informationen finden Sie unter Synchronisieren eines Pushabonnements.

So initialisieren Sie ein Pullabonnement für eine Zusammenführungsveröffentlichung erneut

  1. Erstellen Sie mithilfe der ServerConnection Klasse eine Verbindung mit dem Abonnenten.

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

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

    Hinweis

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

  4. Rufen Sie die Reinitialize-Methode auf. Übergeben Sie einen Wert von true, um Änderungen beim Abonnenten hochzuladen, bevor Sie neuinitialisieren, oder einen Wert von false, um neu zu initialisieren und dabei alle ausstehenden Änderungen beim Abonnenten zu verlieren. Diese Methode kennzeichnet das Abonnement für die Erneute Initialisierung.

    Hinweis

    Änderungen können nicht hochgeladen werden, wenn das Abonnement abgelaufen ist. Weitere Informationen finden Sie unter Festlegen des Ablaufzeitraums für Abonnements.

  5. Synchronisieren Sie das Pull-Abonnement. Weitere Informationen finden Sie unter Synchronisation eines Pullabonnements.

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

  1. Erstellen Sie mithilfe der ServerConnection Klasse eine Verbindung mit dem Publisher.

  2. Erstellen Sie eine Instanz der MergeSubscription Klasse, und legen Sie PublicationName, DatabaseName, SubscriberName, SubscriptionDBName und die Verbindung aus Schritt 1 für ConnectionContext fest.

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

    Hinweis

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

  4. Rufen Sie die Reinitialize-Methode auf. Übergeben Sie einen Wert von true zum Hochladen von Änderungen am Abonnenten vor der erneuten Initialisierung oder einen Wert von false zur erneuten Initialisierung, wobei Sie alle ausstehenden Änderungen beim Abonnenten verlieren. Diese Methode kennzeichnet das Abonnement für die erneute Initialisierung.

    Hinweis

    Änderungen können nicht hochgeladen werden, wenn das Abonnement abgelaufen ist. Weitere Informationen finden Sie unter Festlegen des Ablaufzeitraums für Abonnements.

  5. Synchronisieren sie das Pushabonnement. Weitere Informationen finden Sie unter Synchronisieren eines Pushabonnements.

Beispiele (RMO)

In diesem Beispiel wird ein Pullabonnement für eine transaktionsbasierte Publikation neu 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 Zusammenführungsveröffentlichung erneut initialisiert, nachdem zuerst ausstehende Ä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

Siehe auch

Erneutes Initialisieren von Abonnements
Konzepte für Replikationsverwaltungsobjekte
Bewährte Methoden für Replikationssicherheit