Partager via


Réinitialiser un abonnement

Cette rubrique explique comment réinitialiser un abonnement dans SQL Server 2014 à l’aide de SQL Server Management Studio, Transact-SQL ou Replication Management Objects (RMO). Les abonnements individuels peuvent être marqués pour la réinitialisation afin qu’un nouvel instantané soit appliqué lors de la prochaine synchronisation.

Dans cette rubrique

Utilisation de SQL Server Management Studio

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

  1. Un abonnement unique ou tous les abonnements à une publication sont marqués pour la réinitialisation. Marquer les abonnements pour la 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 également marquer les abonnements à partir de l’onglet Tous les abonnements et du nœud 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. Lorsque vous marquez un abonnement pour la réinitialisation, vous disposez des options suivantes :

    Utiliser l’instantané actuel
    Sélectionnez cette option pour appliquer l’instantané actuel à l’Abonné la prochaine fois que l’Agent de distribution ou l’Agent de fusion s’exécute. S’il n’existe aucun instantané valide disponible, cette option ne peut pas être sélectionnée.

    Utiliser un nouvel instantané
    Sélectionnez cette option pour réinitialiser l’abonnement avec un nouvel instantané. L’instantané peut être appliqué à l’Abonné uniquement une fois qu’il a été généré par l’Agent d’instantané. Si l’agent d’instantané est programmé pour s’exécuter selon un calendrier, l’abonnement n’est réinitialisé qu’après la prochaine exécution planifiée de l’agent d’instantané. Sélectionnez Générer la nouvelle capture instantanée maintenant pour démarrer immédiatement l’Agent d’instantané.

    Charger les modifications non synchronisées avant la réinitialisation
    Réplication de fusion uniquement. Sélectionnez cette option pour charger les modifications en attente de la base de données d’abonnement avant que les données de l’Abonné soient remplacées par un instantané.

    Si vous ajoutez, supprimez ou modifiez un filtre paramétrable, les modifications en attente sur l’Abonné ne peuvent pas être chargées sur le serveur de publication pendant la réinitialisation. Si vous souhaitez charger des modifications en attente, synchronisez tous les abonnements avant de modifier 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 la réinitialisation. Pour plus d’informations sur la synchronisation des abonnements, consultez Synchroniser un abonnement Push et Synchroniser un abonnement par extraction.

Pour marquer un abonnement unique de type push ou pull pour la réinitialiser dans Management Studio (sur le serveur de publication)

  1. Connectez-vous au Publisher 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. Ouvrez la publication qui contient l’abonnement que vous souhaitez réinitialiser.

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

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

Pour marquer une souscription par extraction unique en vue de sa réinitialisation dans Management Studio (chez l'Abonné)

  1. Connectez-vous à l'Abonné dans Management Studio, puis développez le nœud de 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 cliquez sur Réinitialiser.

  4. Dans la boîte de dialogue de confirmation affichée, cliquez sur Oui.

Pour marquer tous les abonnements en vue de la réinitialisation dans Management Studio

  1. Connectez-vous au Publisher 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 souhaitez 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 la réinitialisation.

Pour marquer un abonnement Push ou Pull unique pour la 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 souhaitez réinitialiser, puis cliquez sur Réinitialiser l’abonnement.

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

Pour marquer tous les abonnements pour la 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 souhaitez 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 la réinitialisation.

Utilisation de Transact-SQL

Les abonnements peuvent être réinitialisés par programme à l’aide de procédures stockées de réplication. La procédure stockée utilisée dépend du type d’abonnement (push ou pull) et du type de publication auquel appartient l’abonnement.

Pour réinitialiser un abonnement de type pull à une publication transactionnelle

  1. Sur l'abonné de la base de données d'abonnement, exécutez sp_reinitpullsubscription (Transact-SQL). Spécifiez @publisher, @publisher_db et @publication. Cela marque l’abonnement pour la 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.

Pour réinitialiser un abonnement Push à une publication transactionnelle

  1. Sur le serveur de publication, exécutez sp_reinitsubscription (Transact-SQL). Spécifiez @publication, @subscriber et @destination_db. Cela prépare l’abonnement pour une 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 Push.

Pour réinitialiser un abonnement de type 'pull' à une publication de fusion

  1. Sur l’abonné de la base de données d’abonnement, exécutez sp_reinitmergepullsubscription (Transact-SQL). Spécifiez @publisher, @publisher_db et @publication. Pour charger les modifications de l’Abonné avant que la réinitialisation ne se produise, spécifiez la valeur true pour @upload_first. Cela marque l’abonnement pour la réinitialisation la prochaine fois que l’Agent de fusion s’exécute.

    Important

    Si vous ajoutez, supprimez ou modifiez un filtre paramétrable, les modifications en attente sur l’Abonné ne peuvent pas être chargées sur le serveur de publication pendant la réinitialisation. Si vous souhaitez charger des 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.

Pour réinitialiser un abonnement Push à une publication de fusion

  1. Dans l'éditeur, exécutez sp_reinitmergesubscription (Transact-SQL). Spécifiez @publication, @subscriber et @subscriber_db. Pour charger les modifications depuis l’Abonné avant que la réinitialisation ne se produise, spécifiez la valeur true pour @upload_first. Cela marque l’abonnement pour sa réinitialisation la prochaine fois que l’Agent de distribution s'exécute.

    Important

    Si vous ajoutez, supprimez ou modifiez un filtre paramétrable, les modifications en attente sur l’Abonné ne peuvent pas être chargées sur le serveur de publication pendant la réinitialisation. Si vous souhaitez charger des 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 Push.

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

  1. 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 à partir de l’Abonné avant qu’un abonnement ne soit automatiquement réinitialisé en fonction des modifications apportées à la publication.

    • 0 : les modifications apportées à l’Abonné sont ignorées lorsqu’un abonnement est automatiquement réinitialisé selon les besoins d’une modification apportée à la publication.

    Important

    Si vous ajoutez, supprimez ou modifiez un filtre paramétrable, les modifications en attente sur l’Abonné ne peuvent pas être chargées sur le serveur de publication pendant la réinitialisation. Si vous souhaitez charger des 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 d’une publication de fusion existante

  1. Sur le serveur de publication sur la base de données 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 envoyées par l’Abonné avant qu’un abonnement ne soit automatiquement réinitialisé si une modification de la publication l'exige.

    • 0 : les modifications apportées à l’Abonné sont ignorées lorsqu’un abonnement est automatiquement réinitialisé selon les besoins d’une modification apportée à la publication.

    Important

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

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

Utilisation des objets RMO (Replication Management Objects)

Les abonnements individuels peuvent être marqués pour la réinitialisation afin qu’au cours de la prochaine synchronisation, un nouvel instantané soit appliqué. Les abonnements peuvent être réinitialisés par programme à l’aide de Replication Management Objects (RMO). Les classes que vous utilisez dépendent du type de publication auquel appartient l’abonnement et du type d’abonnement (autrement dit, un abonnement push ou par extraction).

Pour réinitialiser un abonnement de type 'pull' à une publication transactionnelle

  1. Créez une connexion à l’Abonné à l’aide de la ServerConnection classe.

  2. Créez une instance de la TransPullSubscription classe, et définissez PublicationName, DatabaseName, PublisherName, PublicationDBNameet la connexion de l’étape 1 pour ConnectionContext.

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

    Remarque

    Si cette méthode retourne false, les propriétés d’abonnement de l’étape 2 ont été définies de manière incorrecte ou l’abonnement pull n’existe pas.

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

  5. Synchronisez l’abonnement par extraction. Pour plus d’informations, consultez Synchroniser un abonnement par extraction.

Pour réinitialiser un abonnement Push à une publication transactionnelle

  1. Créez une connexion au serveur de publication à l’aide de la ServerConnection classe.

  2. Créez une instance de la TransSubscription classe, et définissez PublicationName, DatabaseName, SubscriberName, SubscriptionDBNameet la connexion de l’étape 1 pour ConnectionContext.

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

    Remarque

    Si cette méthode retourne false, les propriétés d’abonnement de l’étape 2 ont été définies de manière incorrecte ou l’abonnement Push n’existe pas.

  4. Appelez la méthode Reinitialize . Cette méthode marque l’abonnement destiné à la réinitialisation.

  5. Synchronisez l’abonnement Push. Pour plus d’informations, consultez Synchroniser un abonnement Push.

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

  1. Créez une connexion à l’Abonné à l’aide de la ServerConnection classe.

  2. Créez une instance de la MergePullSubscription classe, et définissez PublicationName, DatabaseName, PublisherName, PublicationDBNameet la connexion de l’étape 1 pour ConnectionContext.

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

    Remarque

    Si cette méthode retourne false, les propriétés d’abonnement de l’étape 2 ont été définies de manière incorrecte ou l’abonnement pull n’existe pas.

  4. Appelez la méthode Reinitialize . Transmettez une valeur de true pour charger les modifications sur l’Abonné avant la réinitialisation ou une valeur de false pour réinitialiser et perdre les modifications en attente sur l’Abonné. Cette méthode marque l’abonnement pour une réinitialisation.

    Remarque

    Les modifications ne peuvent pas être 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 à retrait. Pour plus d’informations, consultez Synchroniser un abonnement par extraction.

Pour réinitialiser un abonnement Push à une publication de fusion

  1. Créez une connexion au serveur de publication à l’aide de la ServerConnection classe.

  2. Créez une instance de la MergeSubscription classe, et définissez PublicationName, DatabaseName, SubscriberName, SubscriptionDBNameet la connexion de l’étape 1 pour ConnectionContext.

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

    Remarque

    Si cette méthode retourne false, les propriétés d’abonnement de l’étape 2 ont été définies de manière incorrecte ou l’abonnement Push n’existe pas.

  4. Appelez la méthode Reinitialize . Utilisez une valeur de true pour télécharger les modifications sur l’Abonné avant la réinitialisation ou une valeur de false pour réinitialiser et perdre les modifications en attente sur l’Abonné. Cette méthode marque l’abonnement pour la réinitialisation.

    Remarque

    Les modifications ne peuvent pas être 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 Push. Pour plus d’informations, consultez Synchroniser un abonnement 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 uploadé les modifications en attente chez 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

Voir aussi

Réinitialiser les abonnements
Concepts liés à RMO (Replication Management Objects)
Meilleures pratiques en matière de sécurité de réplication