Share via


Réinitialiser un abonnement

Cette rubrique explique comment réinitialiser un abonnement par extraction de données (pull) dans SQL Server 2012 à l'aide de SQL Server Management Studio, de Transact-SQL ou d'objets RMO (Replication Management Objects). Des abonnements individuels peuvent être marqués pour réinitialisation afin qu'un nouvel instantané soit appliqué lors de la synchronisation suivante.

Dans cette rubrique

  • Pour réinitialiser un abonnement à l'aide de :

    SQL Server Management Studio

    Transact-SQL

    Objets RMO (Replication Management Objects)

Utilisation de SQL Server Management Studio

La réinitialisation d'un abonnement est un processus en deux parties :

  1. Un abonnement seul ou tous les abonnements à une publication sont marqués pour réinitialisation. Marquez des abonnements pour réinitialisation dans la boîte de dialogue Réinitialiser les abonnements, qui est disponible à partir du dossier Publications locales et du dossier Abonnements locaux dans Microsoft SQL Server Management Studio. Vous pouvez aussi marquer des abonnements à partir de l'onglet Tous les abonnements et du nœud des publications dans le moniteur de réplication. Pour plus d'informations sur le démarrage du moniteur de réplication, consultez Démarrer le Moniteur de réplication. Quand vous marquez un abonnement pour réinitialisation, vous disposez des options suivantes :

    • Utiliser l'instantané actuel
      Choisissez d'appliquer l'instantané actuel à l'Abonné à l'exécution suivante de l'Agent de distribution ou de l'Agent de fusion. Si aucun instantané valide n'est disponible, cette option est grisée.

    • Utiliser un nouvel instantané
      Permet de réinitialiser l'abonnement par un nouvel instantané. L'instantané ne peut être appliqué à l'Abonné qu'après sa génération par l'Agent d'instantané. Si l'Agent d'instantané est défini pour s'exécuter selon une planification, l'abonnement est réinitialisé seulement après l'exécution planifiée suivante de l'Agent d'instantané. Sélectionnez Générer le nouvel instantané maintenant pour lancer immédiatement l'Agent d'instantané.

    • Télécharger les modifications non synchronisées avant la réinitialisation
      Réplication de fusion uniquement. Permet de télécharger vers le serveur toute modification en attente et apportée à la base de données d'abonnement avant que les données au niveau de l'Abonné ne soient écrasées par un instantané.

      Si vous ajoutez, supprimez ou modifiez un filtre paramétré, les modifications en attente sur l'Abonné ne peuvent alors pas être téléchargées vers le serveur de publication au moment de la réinitialisation. Si vous voulez charger les mises à jour en attente, synchronisez tous les abonnements avant de changer le filtre.

  2. Un abonnement est réinitialisé la prochaine fois qu'il est synchronisé : l'Agent de distribution (pour la réplication transactionnelle) ou l'Agent de fusion (pour la réplication de fusion) applique l'instantané le plus récent à chaque Abonné qui a un abonnement marqué pour réinitialisation. Pour plus d'informations sur la synchronisation des abonnements, consultez Synchroniser un abonnement par émission (push) et Synchroniser un abonnement par extraction (pull).

Pour marquer un abonnement par envoi de données (push) ou par extraction de données (pull) pour réinitialisation dans Management Studio (sur le serveur de publication)

  1. Connectez-vous au serveur de publication dans Management Studio, puis développez le nœud du serveur.

  2. Développez le dossier Réplication, puis développez le dossier Publications locales.

  3. Développez la publication qui a l'abonnement que vous voulez réinitialiser.

  4. Cliquez avec le bouton droit sur l'abonnement, puis sur Réinitialiser.

  5. Dans la boîte de dialogue Réinitialiser les abonnements, sélectionnez les options, puis cliquez sur Marquer pour réinitialisation.

Pour marquer un seul abonnement par extraction de données (pull) pour réinitialisation dans Management Studio (sur l'Abonné)

  1. Connectez-vous à l'Abonné dans Management Studio, puis développez le nœud du serveur.

  2. Développez le dossier Réplication, puis développez le dossier Abonnements locaux.

  3. Cliquez avec le bouton droit sur l'abonnement, puis sur Réinitialiser.

  4. Dans la boîte de dialogue de confirmation qui s'affiche, cliquez sur Oui.

Pour marquer tous les abonnements pour réinitialisation dans Management Studio

  1. Connectez-vous au serveur de publication dans Management Studio, puis développez le nœud du serveur.

  2. Développez le dossier Réplication, puis développez le dossier Publications locales.

  3. Cliquez avec le bouton droit sur la publication avec les abonnements que vous voulez réinitialiser, puis cliquez sur Réinitialiser tous les abonnements.

  4. Dans la boîte de dialogue Réinitialiser les abonnements, sélectionnez les options, puis cliquez sur Marquer pour réinitialisation.

Pour marquer un seul abonnement par envoi de données (push) ou par extraction de données (pull) pour réinitialisation dans le moniteur de réplication

  1. Dans le moniteur de réplication, développez un groupe de serveurs de publication dans le volet gauche, développez un serveur de publication, puis cliquez sur une publication.

  2. Cliquez sur l'onglet Tous les abonnements.

  3. Cliquez avec le bouton droit sur l'abonnement que vous voulez réinitialiser, puis cliquez sur Réinitialiser un abonnement.

  4. Dans la boîte de dialogue Réinitialiser les abonnements, sélectionnez les options, puis cliquez sur Marquer pour réinitialisation.

Pour marquer tous les abonnements pour réinitialisation dans le moniteur de réplication

  1. Dans le moniteur de réplication, développez un groupe de serveurs de publication dans le volet gauche, puis développez un serveur de publication.

  2. Cliquez avec le bouton droit sur la publication avec les abonnements que vous voulez réinitialiser, puis cliquez sur Réinitialiser tous les abonnements.

  3. Dans la boîte de dialogue Réinitialiser les abonnements, sélectionnez les options, puis cliquez sur Marquer pour réinitialisation.

Icône de flèche utilisée avec le lien Retour en haut[Top]

Utilisation de Transact-SQL

Les abonnements peuvent être réinitialisés par programme en utilisant des procédures stockées de réplication. La procédure stockée utilisée dépend du type d'abonnement (par extraction ou par émission de données) et du type de publication à laquelle l'abonnement appartient.

Pour réinitialiser un abonnement par extraction à une publication transactionnelle

  1. Dans la base de données d'abonnement de l'Abonné, exécutez sp_reinitpullsubscription (Transact-SQL). Spécifiez @publisher, @publisherdb et @publisher\_. L'abonnement est alors marqué pour réinitialisation lors de la prochaine exécution de l'Agent de distribution.

  2. (Facultatif) Démarrez l'Agent de distribution sur l'Abonné pour synchroniser l'abonnement. Pour plus d'informations, consultez Synchroniser un abonnement par extraction (pull).

Pour réinitialiser un abonnement par émission de données à une publication transactionnelle

  1. Sur le serveur de publication, exécutez sp_reinitsubscription (Transact-SQL). Spécifiez @publication, @subscriber et @destination_db. L'abonnement est alors marqué pour réinitialisation lors de la prochaine exécution de l'Agent de distribution.

  2. (Facultatif) Démarrez l'Agent de distribution sur le serveur de distribution pour synchroniser l'abonnement. Pour plus d'informations, consultez Synchroniser un abonnement par émission (push).

Pour réinitialiser un abonnement par extraction à une publication de fusion

  1. Dans la base de données d'abonnement de l'Abonné, exécutez sp_reinitmergepullsubscription (Transact-SQL). Spécifiez @publisher, @publisherdb et @publisher\_. Pour télécharger les modifications de l'Abonné avant la réinitialisation, affectez la valeur true à @upload_first. L'abonnement est alors marqué pour réinitialisation lors de la prochaine exécution de l'Agent de fusion.

    Important

    Si vous ajoutez, supprimez ou modifiez un filtre paramétrable, les modifications en attente au niveau de l'Abonné ne peuvent pas être téléchargées sur le serveur de publication lors de la réinitialisation. Si vous voulez télécharger les modifications en attente, synchronisez tous les abonnements avant de modifier le filtre.

  2. (Facultatif) Démarrez l'Agent de fusion sur l'Abonné pour synchroniser l'abonnement. Pour plus d'informations, consultez Synchroniser un abonnement par extraction (pull).

Pour réinitialiser un abonnement par émission de données à une publication de fusion

  1. Sur le serveur de publication, exécutez sp_reinitmergesubscription (Transact-SQL). Spécifiez @publication, @subscriber et @subscriber_db. Pour télécharger les modifications de l'Abonné avant la réinitialisation, affectez la valeur true à @upload_first. L'abonnement est alors marqué pour réinitialisation lors de la prochaine exécution de l'Agent de distribution.

    Important

    Si vous ajoutez, supprimez ou modifiez un filtre paramétrable, les modifications en attente au niveau de l'Abonné ne peuvent pas être téléchargées sur le serveur de publication lors de la réinitialisation. Si vous voulez télécharger les modifications en attente, synchronisez tous les abonnements avant de modifier le filtre.

  2. (Facultatif) Démarrez l'Agent de fusion sur le serveur de distribution pour synchroniser l'abonnement. Pour plus d'informations, consultez Synchroniser un abonnement par émission (push).

Pour définir la stratégie de réinitialisation lors de la création d'une publication de fusion

  • Dans la base de données de publication sur le serveur de publication, exécutez sp_addmergepublication, en spécifiant l'une des valeurs suivantes pour @automatic_reinitialization_policy :

    • 1 - les modifications sont téléchargées depuis l'Abonné avant réinitialisation automatique d'un abonnement suite à la modification de la publication.

    • 0 - les modifications au niveau de l'Abonné sont ignorées lorsqu'un abonnement est automatiquement réinitialisé suite à la modification de la publication.

    Important

    Si vous ajoutez, supprimez ou modifiez un filtre paramétrable, les modifications en attente au niveau de l'Abonné ne peuvent pas être téléchargées sur le serveur de publication lors de la réinitialisation. Si vous voulez télécharger les modifications en attente, synchronisez tous les abonnements avant de modifier le filtre.

    Pour plus d'informations, consultez Créer une publication.

Pour modifier la stratégie de réinitialisation pour une publication de fusion existante

  • Dans la base de données de publication sur le serveur de publication, exécutez sp_changemergepublication, en spécifiant automatic_reinitialization_policy pour @property et l'une des valeurs suivantes pour @value :

    • 1 - les modifications sont téléchargées depuis l'Abonné avant réinitialisation automatique d'un abonnement suite à la modification de la publication.

    • 0 - les modifications au niveau de l'Abonné sont ignorées lorsqu'un abonnement est automatiquement réinitialisé suite à la modification de la publication.

    Important

    Si vous ajoutez, supprimez ou modifiez un filtre paramétrable, les modifications en attente au niveau de l'Abonné ne peuvent pas être téléchargées sur le serveur de publication lors de la réinitialisation. Si vous voulez télécharger les modifications en attente, synchronisez tous les abonnements avant de modifier le filtre.

    Pour plus d'informations, consultez Afficher et modifier les propriétés d'une publication.

Icône de flèche utilisée avec le lien Retour en haut[Top]

Utilisation d'objets RMO (Replication Management Objects)

Des abonnements individuels peuvent être marqués pour réinitialisation afin qu'un nouvel instantané soit appliqué lors de la synchronisation suivante. Les abonnements peuvent être réinitialisés par programme à l'aide de Replication Management Objects. Les classes que vous utilisez dépendent du type de publication à laquelle l'abonnement appartient et du type d'abonnement (par extraction ou par émission de données).

Pour réinitialiser un abonnement par extraction à une publication transactionnelle

  1. Créez une connexion à l'Abonné en utilisant la classe ServerConnection.

  2. Créez une instance de la classe TransPullSubscription, puis définissez PublicationName, DatabaseName, PublisherName, PublicationDBName et la connexion créée à l'étape 1 pour ConnectionContext.

  3. Appelez la méthode LoadProperties pour obtenir les propriétés de l'objet.

    [!REMARQUE]

    Si cette méthode retourne false, les propriétés de l'abonnement définies à l'étape 2 sont incorrectes ou l'abonnement par extraction n'existe pas.

  4. Appelez la méthode Reinitialize. Cette méthode marque l'abonnement pour réinitialisation.

  5. Synchronisez l'abonnement par extraction. Pour plus d'informations, consultez Synchroniser un abonnement par extraction (pull).

Pour réinitialiser un abonnement par émission de données à une publication transactionnelle

  1. Créez une connexion au serveur de publication en utilisant la classe ServerConnection.

  2. Créez une instance de la classe TransSubscription, puis définissez PublicationName, DatabaseName, SubscriberName, SubscriptionDBName et la connexion créée à l'étape 1 pour ConnectionContext.

  3. Appelez la méthode LoadProperties pour obtenir les propriétés de l'objet.

    [!REMARQUE]

    Si cette méthode retourne false, les propriétés de l'abonnement définies à l'étape 2 sont incorrectes ou l'abonnement par émission de données n'existe pas.

  4. Appelez la méthode Reinitialize. Cette méthode marque l'abonnement pour réinitialisation.

  5. Synchronisez l'abonnement par émission de données. Pour plus d'informations, consultez Synchroniser un abonnement par émission (push).

Pour réinitialiser un abonnement par extraction à une publication de fusion

  1. Créez une connexion à l'Abonné en utilisant la classe ServerConnection.

  2. Créez une instance de la classe MergePullSubscription, puis définissez PublicationName, DatabaseName, PublisherName, PublicationDBName et la connexion créée à l'étape 1 pour ConnectionContext.

  3. Appelez la méthode LoadProperties pour obtenir les propriétés de l'objet.

    [!REMARQUE]

    Si cette méthode retourne false, les propriétés de l'abonnement définies à l'étape 2 sont incorrectes ou l'abonnement par extraction n'existe pas.

  4. Appelez la méthode Reinitialize. Passez la valeur true pour télécharger les modifications sur l'Abonné avant la réinitialisation ou la valeur false pour réinitialiser et perdre toute modification en attente sur l'Abonné. Cette méthode marque l'abonnement pour réinitialisation.

    [!REMARQUE]

    Les modifications ne peuvent pas être téléchargées si l'abonnement a expiré. Pour plus d'informations, consultez Définir la période d'expiration des abonnements.

  5. Synchronisez l'abonnement par extraction. Pour plus d'informations, consultez Synchroniser un abonnement par extraction (pull).

Pour réinitialiser un abonnement par émission de données à une publication de fusion

  1. Créez une connexion au serveur de publication en utilisant la classe ServerConnection.

  2. Créez une instance de la classe MergeSubscription, puis définissez PublicationName, DatabaseName, SubscriberName, SubscriptionDBName et la connexion créée à l'étape 1 pour ConnectionContext.

  3. Appelez la méthode LoadProperties pour obtenir les propriétés de l'objet.

    [!REMARQUE]

    Si cette méthode retourne false, les propriétés de l'abonnement définies à l'étape 2 sont incorrectes ou l'abonnement par émission de données n'existe pas.

  4. Appelez la méthode Reinitialize. Passez la valeur true pour télécharger les modifications sur l'Abonné avant la réinitialisation ou la valeur false pour réinitialiser et perdre toute modification en attente sur l'Abonné. Cette méthode marque l'abonnement pour réinitialisation.

    [!REMARQUE]

    Les modifications ne peuvent pas être téléchargées si l'abonnement a expiré. Pour plus d'informations, consultez Définir la période d'expiration des abonnements.

  5. Synchronisez l'abonnement par émission de données. Pour plus d'informations, consultez Synchroniser un abonnement par émission (push).

Exemples (RMO)

Cet exemple réinitialise un abonnement par extraction à une publication transactionnelle.

           // 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

Cet exemple réinitialise un abonnement par extraction à une publication de fusion après avoir téléchargé les modifications en attente sur l'Abonné.

         // 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

Icône de flèche utilisée avec le lien Retour en haut[Top]

Voir aussi

Concepts

Réinitialiser des abonnements

Concepts liés à Replication Management Objects

Méthodes préconisées en matière de sécurité de réplication