Synchronize a Push Subscription

 

S'applique à: SQL Server 2016

Cette rubrique décrit comment synchroniser un abonnement envoyé dans SQL Server 2016 à l’aide de SQL Server Management Studio, agents de réplication, ou Replication Management Objects (RMO).

Dans cette rubrique

Les abonnements sont synchronisés par l'Agent de distribution (pour la réplication transactionnelle et d'instantané) ou l'Agent de fusion (pour la réplication de fusion). Les agents peuvent s'exécuter en continu, à la demande ou selon une planification. Pour plus d’informations sur la spécification des planifications de synchronisation, consultez spécifier des planifications de synchronisation.

Synchronisez un abonnement à la demete à partir des dossiers Publications locales et Abonnements locaux dans Microsoft SQL Server Management Studio et the Tous les abonnements du moniteur de réplication. Les abonnements aux publications Oracle ne peuvent pas être synchronisés à la demande à partir de l'Abonné. Pour plus d’informations sur le démarrage du moniteur de réplication, consultez Démarrer le moniteur de réplication.

Pour synchroniser un abonnement par envoi de données à la demande 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 pour laquelle vous souhaitez synchroniser des abonnements.

  4. Cliquez sur l’abonnement que vous souhaitez synchroniser, puis cliquez sur Afficher l’état de synchronisation.

  5. Dans la Afficher l’état de synchronisation - < abonné>: < BasededonnéesAbonnement> boîte de dialogue, cliquez sur Démarrer. Lorsque la synchronisation est terminée, le message Synchronisation terminée s'affiche.

  6. Cliquez sur Fermer.

Pour synchroniser un abonnement par envoi de données à la demande 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 sur l’abonnement que vous souhaitez synchroniser, puis cliquez sur Afficher l’état de synchronisation.

  4. Un message sur l'établissement d'une connexion avec le serveur de distribution s'affiche. Cliquez sur OK.

  5. Dans la Afficher l’état de synchronisation - < abonné>: < BasededonnéesAbonnement> boîte de dialogue, cliquez sur Démarrer. Lorsque la synchronisation est terminée, le message Synchronisation terminée s'affiche.

  6. Cliquez sur Fermer.

Pour synchroniser un abonnement par envoi de données à la demande 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 sur l’abonnement que vous souhaitez synchroniser, puis cliquez sur Démarrer la synchronisation.

  4. Pour afficher la progression de la synchronisation, cliquez sur l’abonnement, puis cliquez sur Afficher les détails.

Les abonnements par envoi de données (push) peuvent être synchronisés par le biais de la programmation et à la demande en appelant le fichier exécutable de l'Agent de réplication approprié à partir de l'invite de commandes. Le fichier exécutable de l'Agent de réplication qui est appelé dépend du type de publication à laquelle l'abonnement par envoi de données (push) appartient.

Pour démarrer l'Agent de distribution et synchroniser un abonnement par envoi de données (push) vers une publication transactionnelle

  1. À partir de l'invite de commandes ou dans un fichier de commandes sur le serveur de distribution, exécutez distrib.exe. Spécifiez les arguments suivants sur la ligne de commande :

    • -Publisher

    • -PublisherDB

    • -Distributor

    • -Subscriber

    • -SubscriberDB

    • -SubscriptionType = 0

    Si vous utilisez l'authentification SQL Server, vous devez également spécifier les arguments suivants :

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = 0

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = 0

    • -SubscriberLogin

    • -SubscriberPassword

    • -SubscriberSecurityMode = 0

      System_CAPS_ICON_important.jpg Important


      Lorsque c'est possible, utilisez l'authentification Windows.

Pour démarrer l'Agent de fusion et synchroniser un abonnement par envoi de données (push) vers une publication de fusion

  1. À partir de l'invite de commandes ou dans un fichier de commandes sur le serveur de distribution, exécutez replmerg.exe. Spécifiez les arguments suivants sur la ligne de commande :

    • -Publisher

    • -PublisherDB

    • -Publication

    • -Distributor

    • -Subscriber

    • -SubscriberDB

    • -SubscriptionType = 0

    Si vous utilisez l'authentification SQL Server, vous devez également spécifier les arguments suivants :

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = 0

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = 0

    • -SubscriberLogin

    • -SubscriberPassword

    • -SubscriberSecurityMode = 0

      System_CAPS_ICON_important.jpg Important


      Lorsque c'est possible, utilisez l'authentification Windows.

Exemples (Agents de réplication)

L'exemple suivant démarre l'Agent de distribution pour synchroniser un abonnement par envoi de données (push).

  
REM -- Declare the variables.  
SET Publisher=%instancename%  
SET Subscriber=%instancename%  
SET PublicationDB=AdventureWorks2012  
SET SubscriptionDB=AdventureWorks2012Replica   
SET Publication=AdvWorksProductsTran  
  
REM -- Start the Distribution Agent with four subscription streams.  
REM -- The following command must be supplied without line breaks.  
"C:\Program Files\Microsoft SQL Server\120\COM\DISTRIB.EXE" -Subscriber %Subscriber%   
-SubscriberDB %SubscriptionDB% -SubscriberSecurityMode 1 -Publication %Publication%   
-Publisher %Publisher% -PublisherDB %PublicationDB% -Distributor %Publisher%   
-DistributorSecurityMode 1 -Continuous -SubscriptionType 0 -SubscriptionStreams 4  
  

L'exemple suivant démarre l'Agent de fusion pour synchroniser un abonnement par envoi de données (push).

  
REM -- Declare the variables.  
SET Publisher=%instancename%  
SET Subscriber=%instancename%  
SET PublicationDB=AdventureWorks2012  
SET SubscriptionDB=AdventureWorks2012Replica   
SET Publication=AdvWorksSalesOrdersMerge  
  
REM -- Start the Merge Agent.  
REM -- The following command must be supplied without line breaks.  
"C:\Program Files\Microsoft SQL Server\120\COM\REPLMERG.EXE"  -Publisher %Publisher%   
-Subscriber  %Subscriber%  -Distributor %Publisher% -PublisherDB  %PublicationDB%   
-SubscriberDB %SubscriptionDB% -Publication %Publication% -PublisherSecurityMode 1   
-OutputVerboseLevel 3  -Output -SubscriberSecurityMode 1  -SubscriptionType 0   
-DistributorSecurityMode 1  
  

Vous pouvez synchroniser des abonnements par envoi de données par programme à l'aide des objets RMO (Replication Management Objects) et gérer l'accès au code pour les fonctionnalités de l'Agent de réplication. Les classes que vous utilisez pour créer un abonnement par envoi de données dépendent du type de publication à laquelle l'abonnement appartient.

System_CAPS_ICON_note.jpg Remarque


Si vous voulez démarrer une synchronisation qui s'exécute de façon autonome sans affecter votre application, démarrez l'agent en mode asynchrone. Toutefois, si vous souhaitez contrôler la sortie de la synchronisation et recevoir les rappels de l'Agent pendant le processus de synchronisation (par exemple, pour afficher une barre de progression), vous devez démarrer l'Agent en mode synchrone. Pour des Abonnés MicrosoftSQL Server 2005 Express Edition , vous devez démarrer l'agent en mode synchrone.

Pour synchroniser un abonnement par envoi de données vers un instantané ou une publication transactionnelle

  1. Créer une connexion au serveur de distribution à l’aide de la ServerConnection (classe).

  2. Créez une instance de la TransSubscription classe et définissez les propriétés suivantes :

  3. Appelez le LoadProperties méthode permettant d’obtenir les propriétés d’abonnement restants. Si cette méthode retourne false, vérifiez que l’abonnement existe.

  4. Démarrez l'Agent de distribution sur le serveur de distribution selon l'une des manières suivantes :

    • Appelez le SynchronizeWithJob méthode sur l’instance de TransSubscription à l’étape 2. Cette méthode démarre l'Agent de distribution en mode asynchrone et votre application récupère immédiatement le contrôle pendant l'exécution du travail de l'agent. Vous ne pouvez pas appeler cette méthode si l’abonnement a été créé avec la valeur false pour CreateSyncAgentByDefault.

    • Pour obtenir une instance de la TransSynchronizationAgent de classe à partir de la SynchronizationAgent propriété et appelez la synchroniser (méthode). Cette méthode démarre l'agent en mode synchrone, et le travail d'agent en cours d'exécution conserve le contrôle. Lors de l’exécution synchrone, vous pouvez gérer les état événements tandis que l’agent est en cours d’exécution.

Pour synchroniser un abonnement par envoi de données vers une publication de fusion

  1. Créer une connexion au serveur de distribution à l’aide de la ServerConnection (classe).

  2. Créez une instance de la MergeSubscription puis définissez les propriétés suivantes :

  3. Appelez le LoadProperties méthode permettant d’obtenir les propriétés d’abonnement restants. Si cette méthode retourne false, vérifiez que l’abonnement existe.

  4. Démarrez l'Agent de distribution sur le serveur de distribution selon l'une des manières suivantes :

    • Appelez le SynchronizeWithJob méthode sur l’instance de MergeSubscription à l’étape 2. Cette méthode démarre l'Agent de fusion en mode asynchrone et votre application récupère immédiatement le contrôle pendant l'exécution du travail de l'agent. Vous ne pouvez pas appeler cette méthode si l’abonnement a été créé avec la valeur false pour CreateSyncAgentByDefault.

    • Pour obtenir une instance de la MergeSynchronizationAgent de classe à partir de la SynchronizationAgent propriété et appelez la synchroniser (méthode). Cette méthode démarre l'Agent de fusion en mode synchrone, et le travail d'agent en cours d'exécution conserve le contrôle. Pendant l’exécution synchrone, vous pouvez gérer les état événements tandis que l’agent est en cours d’exécution.

Exemples (RMO)

Cet exemple synchronise un abonnement par envoi de données vers une publication transactionnelle, dans laquelle l'Agent est démarré en mode asynchrone à l'aide du travail de l'Agent.

			// Define the server, publication, and database names.
			string subscriberName = subscriberInstance;
			string publisherName = publisherInstance;
			string publicationName = "AdvWorksProductTran";
			string subscriptionDbName = "AdventureWorks2012Replica";
			string publicationDbName = "AdventureWorks2012";

			/// Create a connection to the Publisher.
			ServerConnection conn = new ServerConnection(publisherName);

			TransSubscription subscription;

			try
			{
				// Connect to the Publisher.
				conn.Connect();

				// Instantiate the push subscription.
				subscription = new TransSubscription();
				subscription.ConnectionContext = conn;
				subscription.DatabaseName = publicationDbName;
				subscription.PublicationName = publicationName;
				subscription.SubscriptionDBName = subscriptionDbName;
				subscription.SubscriberName = subscriberName;

				// If the push subscription and the job exists, start the agent job.
				if (subscription.LoadProperties() && subscription.AgentJobId != null)
				{
					// Start the Distribution Agent asynchronously.
					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)
			{
				// Implement appropriate error handling here.
				throw new ApplicationException("The subscription could not be synchronized.", ex);
			}
			finally
			{
				conn.Disconnect();
			}

        ' Define the server, publication, and database names.
        Dim subscriberName As String = subscriberInstance
        Dim publisherName As String = publisherInstance
        Dim publicationName As String = "AdvWorksProductTran"
        Dim subscriptionDbName As String = "AdventureWorks2012Replica"
        Dim publicationDbName As String = "AdventureWorks2012"

        ' Create a connection to the Publisher.
        Dim conn As ServerConnection = New ServerConnection(publisherName)

        Dim subscription As TransSubscription

        Try
            ' Connect to the Publisher.
            conn.Connect()

            ' Instantiate the push subscription.
            subscription = New TransSubscription()
            subscription.ConnectionContext = conn
            subscription.DatabaseName = publicationDbName
            subscription.PublicationName = publicationName
            subscription.SubscriptionDBName = subscriptionDbName
            subscription.SubscriberName = subscriberName

            ' If the push subscription and the job exists, start the agent job.
            If subscription.LoadProperties() And Not subscription.AgentJobId Is Nothing Then
                ' Start the Distribution Agent asynchronously.
                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
            ' Implement appropriate error handling here.
            Throw New ApplicationException("The subscription could not be synchronized.", ex)
        Finally
            conn.Disconnect()
        End Try

Cet exemple synchronise un abonnement par envoi de données vers une publication transactionnelle, dans laquelle l'Agent est démarré en mode synchrone.

			// Define the server, publication, and database names.
			string subscriberName = subscriberInstance;
			string publisherName = publisherInstance;
			string publicationName = "AdvWorksProductTran";
			string subscriptionDbName = "AdventureWorks2012Replica";
			string publicationDbName = "AdventureWorks2012";

			// Create a connection to the Publisher.
			ServerConnection conn = new ServerConnection(publisherName);

			TransSubscription subscription;

			try
			{
				// Connect to the Publisher.
				conn.Connect();

				// Define the push subscription.
				subscription = new TransSubscription();
				subscription.ConnectionContext = conn;
				subscription.DatabaseName = publicationDbName;
				subscription.PublicationName = publicationName;
				subscription.SubscriptionDBName = subscriptionDbName;
				subscription.SubscriberName = subscriberName;

				// If the push subscription exists, start the synchronization.
				if (subscription.LoadProperties())
				{
					// Check that we have enough metadata to start the agent.
					if (subscription.SubscriberSecurity != null)
					{
						// Synchronously start the Distribution Agent for the subscription.
						subscription.SynchronizationAgent.Synchronize();
					}
					else
					{
						throw new ApplicationException("There is insufficent metadata to " +
							"synchronize the subscription. Recreate the subscription with " +
							"the agent job or supply the required agent properties at run time.");
					}
				}
				else
				{
					// Do something here if the push subscription does not exist.
					throw new ApplicationException(String.Format(
						"The subscription to '{0}' does not exist on {1}",
						publicationName, subscriberName));
				}
			}
			catch (Exception ex)
			{
				// Implement appropriate error handling here.
				throw new ApplicationException("The subscription could not be synchronized.", ex);
			}
			finally
			{
				conn.Disconnect();
			}

        ' Define the server, publication, and database names.
        Dim subscriberName As String = subscriberInstance
        Dim publisherName As String = publisherInstance
        Dim publicationName As String = "AdvWorksProductTran"
        Dim subscriptionDbName As String = "AdventureWorks2012Replica"
        Dim publicationDbName As String = "AdventureWorks2012"

        ' Create a connection to the Publisher.
        Dim conn As ServerConnection = New ServerConnection(publisherName)

        Dim subscription As TransSubscription

        Try
            ' Connect to the Publisher.
            conn.Connect()

            ' Define the push subscription.
            subscription = New TransSubscription()
            subscription.ConnectionContext = conn
            subscription.DatabaseName = publicationDbName
            subscription.PublicationName = publicationName
            subscription.SubscriptionDBName = subscriptionDbName
            subscription.SubscriberName = subscriberName

            ' If the push subscription exists, start the synchronization.
            If subscription.LoadProperties() Then
                ' Check that we have enough metadata to start the agent.
                If Not subscription.SubscriberSecurity Is Nothing Then

                    ' Synchronously start the Distribution Agent for the subscription.
                    subscription.SynchronizationAgent.Synchronize()
                Else
                    Throw New ApplicationException("There is insufficent metadata to " + _
                     "synchronize the subscription. Recreate the subscription with " + _
                     "the agent job or supply the required agent properties at run time.")
                End If
            Else
                ' Do something here if the push subscription does not exist.
                Throw New ApplicationException(String.Format( _
                 "The subscription to '{0}' does not exist on {1}", _
                 publicationName, subscriberName))
            End If
        Catch ex As Exception
            ' Implement appropriate error handling here.
            Throw New ApplicationException("The subscription could not be synchronized.", ex)
        Finally
            conn.Disconnect()
        End Try

Cet exemple synchronise un abonnement par envoi de données vers une publication de fusion, dans laquelle l'Agent est démarré en mode asynchrone à l'aide du travail de l'Agent.

			// Define the server, publication, and database names.
			string subscriberName = subscriberInstance;
			string publisherName = publisherInstance;
			string publicationName = "AdvWorksSalesOrdersMerge";
			string subscriptionDbName = "AdventureWorks2012Replica";
			string publicationDbName = "AdventureWorks2012";

			// Create a connection to the Publisher.
			ServerConnection conn = new ServerConnection(publisherName);

			MergeSubscription subscription;

			try
			{
				// Connect to the Publisher.
				conn.Connect();

				// Define push subscription.
				subscription = new MergeSubscription();
				subscription.ConnectionContext = conn;
				subscription.DatabaseName = publicationDbName;
				subscription.PublicationName = publicationName;
				subscription.SubscriptionDBName = subscriptionDbName;
				subscription.SubscriberName = subscriberName;

				// If the push subscription and the job exists, start the agent job.
				if (subscription.LoadProperties() && subscription.AgentJobId != null)
				{
					// Start the Merge Agent asynchronously.
					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)
			{
				// Implement appropriate error handling here.
				throw new ApplicationException("The subscription could not be synchronized.", ex);
			}
			finally
			{
				conn.Disconnect();
			}

        ' Define the server, publication, and database names.
        Dim subscriberName As String = subscriberInstance
        Dim publisherName As String = publisherInstance
        Dim publicationName As String = "AdvWorksSalesOrdersMerge"
        Dim subscriptionDbName As String = "AdventureWorks2012Replica"
        Dim publicationDbName As String = "AdventureWorks2012"

        ' Create a connection to the Publisher.
        Dim conn As ServerConnection = New ServerConnection(publisherName)

        Dim subscription As MergeSubscription

        Try
            ' Connect to the Publisher.
            conn.Connect()

            ' Define push subscription.
            subscription = New MergeSubscription()
            subscription.ConnectionContext = conn
            subscription.DatabaseName = publicationDbName
            subscription.PublicationName = publicationName
            subscription.SubscriptionDBName = subscriptionDbName
            subscription.SubscriberName = subscriberName

            ' If the push subscription and the job exists, start the agent job.
            If subscription.LoadProperties() And Not subscription.AgentJobId Is Nothing Then
                ' Start the Merge Agent asynchronously.
                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
            ' Implement appropriate error handling here.
            Throw New ApplicationException("The subscription could not be synchronized.", ex)
        Finally
            conn.Disconnect()
        End Try

Cet exemple synchronise un abonnement par envoi de données vers une publication de fusion, dans laquelle l'Agent est démarré en mode synchrone.

			// Define the server, publication, and database names.
			string subscriberName = subscriberInstance;
			string publisherName = publisherInstance;
			string publicationName = "AdvWorksSalesOrdersMerge";
			string subscriptionDbName = "AdventureWorks2012Replica";
			string publicationDbName = "AdventureWorks2012";

			// Create a connection to the Publisher.
			ServerConnection conn = new ServerConnection(publisherName);

			MergeSubscription subscription;

			try
			{
				// Connect to the Publisher
				conn.Connect();

				// Define the subscription.
				subscription = new MergeSubscription();
				subscription.ConnectionContext = conn;
				subscription.DatabaseName = publicationDbName;
				subscription.PublicationName = publicationName;
				subscription.SubscriptionDBName = subscriptionDbName;
				subscription.SubscriberName = subscriberName;

				// If the push subscription exists, start the synchronization.
				if (subscription.LoadProperties())
				{
					// Check that we have enough metadata to start the agent.
					if (subscription.SubscriberSecurity != null)
					{
						// Synchronously start the Merge Agent for the subscription.
						subscription.SynchronizationAgent.Synchronize();
					}
					else
					{
						throw new ApplicationException("There is insufficent metadata to " +
							"synchronize the subscription. Recreate the subscription with " +
							"the agent job or supply the required agent properties at run time.");
					}
				}
				else
				{
					// Do something here if the push subscription does not exist.
					throw new ApplicationException(String.Format(
						"The subscription to '{0}' does not exist on {1}",
						publicationName, subscriberName));
				}
			}
			catch (Exception ex)
			{
				// Implement appropriate error handling here.
				throw new ApplicationException("The subscription could not be synchronized.", ex);
			}
			finally
			{
				conn.Disconnect();
			}

        ' Define the server, publication, and database names.
        Dim subscriberName As String = subscriberInstance
        Dim publisherName As String = publisherInstance
        Dim publicationName As String = "AdvWorksSalesOrdersMerge"
        Dim subscriptionDbName As String = "AdventureWorks2012Replica"
        Dim publicationDbName As String = "AdventureWorks2012"

        ' Create a connection to the Publisher.
        Dim conn As ServerConnection = New ServerConnection(publisherName)

        Dim subscription As MergeSubscription

        Try
            ' Connect to the Publisher
            conn.Connect()

            ' Define the subscription.
            subscription = New MergeSubscription()
            subscription.ConnectionContext = conn
            subscription.DatabaseName = publicationDbName
            subscription.PublicationName = publicationName
            subscription.SubscriptionDBName = subscriptionDbName
            subscription.SubscriberName = subscriberName

            ' If the push subscription exists, start the synchronization.
            If subscription.LoadProperties() Then
                ' Check that we have enough metadata to start the agent.
                If Not subscription.SubscriberSecurity Is Nothing Then
                    ' Synchronously start the Merge Agent for the subscription.
                    ' Log agent messages to an output file.
                    subscription.SynchronizationAgent.Output = "mergeagent.log"
                    subscription.SynchronizationAgent.OutputVerboseLevel = 2
                    subscription.SynchronizationAgent.Synchronize()
                Else
                    Throw New ApplicationException("There is insufficent metadata to " + _
                     "synchronize the subscription. Recreate the subscription with " + _
                     "the agent job or supply the required agent properties at run time.")
                End If
            Else
                ' Do something here if the push subscription does not exist.
                Throw New ApplicationException(String.Format( _
                 "The subscription to '{0}' does not exist on {1}", _
                 publicationName, subscriberName))
            End If
        Catch ex As Exception
            ' Implement appropriate error handling here.
            Throw New ApplicationException("The subscription could not be synchronized.", ex)
        Finally
            conn.Disconnect()
        End Try

Concepts liés à Replication Management Objects
Synchronisez les données
Méthodes préconisées en matière de sécurité de réplication

Ajouts de la communauté

AJOUTER
Afficher: