Créer et appliquer l'instantané initial

 

S’applique à : SQL Server 2016

Cette rubrique explique comment créer et appliquer l'instantané initial dans SQL Server 2016 à l'aide de SQL Server Management Studio, de Transact-SQL ou des objets RMO (Replication Management Objects). Les publications de fusion qui utilisent des filtres paramétrés nécessitent un instantané en deux parties. Pour plus d'informations, voir Create a Snapshot for a Merge Publication with Parameterized Filters.

Dans cette rubrique

Par défaut, si l'Agent SQL Server est en cours d'exécution, un instantané est généré par l'Agent d'instantané immédiatement après la création d'une publication par l'Assistant Nouvelle publication. Il est ensuite appliqué par défaut par l'Agent de distribution (pour la réplication d'instantané et transactionnelle) ou l'Agent de fusion (pour les abonnements de fusion) pour tous les abonnements. Il est également possible de générer un instantané à l'aide de SQL Server Management Studio et du 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.

Pour créer un instantané 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. Avec le bouton droit de la publication pour laquelle vous souhaitez créer un instantané, puis cliquez sur Afficher l’état de l’Agent capture instantanée.

  4. Dans la Afficher l’état de l’Agent capture instantanée - < Publication> boîte de dialogue, cliquez sur Démarrer.

Lorsque l'Agent d'instantané termine la génération de l'instantané, un message comme celui-ci s'affiche : « [100 %] Un instantané de 17 article(s) a été généré ».

Pour créer un instantané 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. Avec le bouton droit de la publication pour laquelle vous souhaitez générer un instantané, puis cliquez sur Générer l’instantané.

  3. Pour afficher le statut de l'Agent d'instantané, cliquez sur l'onglet Agents . Pour plus d’informations, cliquez sur l’Agent de capture instantanée dans la grille, puis cliquez sur Afficher les détails.

Pour appliquer un instantané

  1. Une fois que l'instantané est généré, il est appliqué en synchronisant l'abonnement avec l'Agent de distribution ou l'Agent de fusion :

    • Si l'Agent est paramétré pour une exécution en continu (par défaut pour la réplication transactionnelle); l'instantané est appliqué automatiquement après avoir été généré.

    • Si l'Agent est paramétré pour une exécution planifiée, l'instantané est appliqué à la prochaine exécution planifiée de l'Agent.

    • Si l'Agent est paramétré pour une exécution à la demande, l'instantané est appliqué la prochaine fois que vous exécutez l'Agent.

    Pour plus d’informations sur la synchronisation des abonnements, consultez synchroniser un abonnement Push et synchroniser un abonnement extrait.

Les instantanés initiaux peuvent être créés par programme en créant et exécutant un travail de l'Agent d'instantané ou en exécutant le fichier exécutable de l'Agent d'instantané à partir d'un fichier de commandes. Une fois qu'un instantané initial a été généré, il est transféré et appliqué sur l'Abonné lorsque l'abonnement est synchronisé pour la première fois. Si vous exécutez l'Agent d'instantané à partir d'une invite de commandes ou d'un fichier de commandes, vous devrez exécuter de nouveau l'agent chaque fois que l'instantané existant deviendra non valide.

System_CAPS_ICON_important.jpg Important


Lorsque c'est possible, demande aux utilisateurs de fournir les informations d'identification au moment de l'exécution. Si vous devez enregistrer les informations d'identification dans un fichier de script, vous devez sécuriser le fichier pour empêcher un accès non autorisé.

Pour créer et exécuter un travail de l'Agent d'instantané pour générer l'instantané initial

  1. Créez une publication d'instantané, transactionnelle ou de fusion. Pour plus d'informations, voir Create a Publication.

  2. Exécutez sp_addpublication_snapshot & #40 ; Transact-SQL & #41 ;. Spécifiez @publication et les paramètres suivants :

    • @Job_login, laquelle spécifie les informations d’identification de l’authentification Windows sous lequel l’Agent de capture instantanée s’exécute sur le serveur de distribution.

    • @Job_password, qui est le mot de passe pour les informations d’identification Windows fournies.

    • (Facultatif) Une valeur de 0 pour @publisher_security_mode Si l’agent doit utiliser l’authentification SQL Server lors de la connexion au serveur de publication. Dans ce cas, vous devez également spécifier les informations de connexion d’authentification SQL Server pour @publisher_login et @publisher_password.

    • (Facultatif) Une planification de synchronisation pour le travail de l'Agent d'instantané. Pour plus d'informations, voir Specify Synchronization Schedules.

    System_CAPS_ICON_important.jpg Important


    Lorsque vous configurez un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour tous les paramètres, y compris job_login et job_password, sont envoyées au serveur de distribution en tant que texte brut. Vous devez chiffrer la connexion entre le serveur de publication et son serveur de distribution distant avant d'exécuter cette procédure stockée. Pour plus d’informations, consultez activer des connexions chiffrées dans le moteur de base de données & #40 ; SQL Server Configuration Manager & #41 ;.

  3. Ajoutez des articles à la publication. Pour plus d'informations, voir Define an Article.

  4. Sur le serveur de publication sur la base de données de publication, exécutez sp_startpublication_snapshot & #40 ; Transact-SQL & #41 ;, en spécifiant la valeur de @publication à l’étape 1.

Pour exécuter l'Agent d'instantané afin de générer l'instantané initial

  1. Créez une publication d'instantané, transactionnelle ou de fusion. Pour plus d'informations, voir Create a Publication.

  2. Ajoutez des articles à la publication. Pour plus d'informations, voir Define an Article.

  3. À partir de l’invite de commandes ou dans un fichier de commandes, démarrez le Agent de capture instantanée de réplication en exécutant snapshot.exe, en spécifiant les arguments de ligne de commande suivantes :

    • -Publication

    • -Publisher

    • -Distributor

    • -PublisherDB

    • -ReplicationType

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

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = 0

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = 0

Exemples (Transact-SQL)

Cet exemple montre comment créer une publication transactionnelle et d’ajouter un travail d’Agent de capture instantanée pour la nouvelle publication (à l’aide de sqlcmd variables de script). L'exemple démarre également le travail.

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2012'; --publication database
SET @publication = N'AdvWorksCustomerTran'; -- transactional publication name
SET @login = $(Login);
SET @password = $(Password);

USE [AdventureWorks]

-- Enable transactional and snapshot replication on the publication database.
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname = N'publish',
  @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
  @job_login = @login, 
  @job_password = @password,
  -- Explicitly specify the security mode used when connecting to the Publisher.
  @publisher_security_mode = 1;

-- Create new transactional publication, using the defaults. 
USE [AdventureWorks2012]
EXEC sp_addpublication 
  @publication = @publication, 
  @description = N'transactional publication';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

Cet exemple crée une publication de fusion et ajoute un travail de l’Agent de capture instantanée (à l’aide de sqlcmd variables) pour la publication. Cet exemple démarre également le travail.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2012'; 
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @login = $(Login);
SET @password = $(Password);

-- Enable merge replication on the publication database.
USE master
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname=N'merge publish',
  @value = N'true';

-- Create new merge publication, using the defaults. 
USE [AdventureWorks]
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication.';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

Les arguments de ligne de commande suivants démarrent l'Agent d'instantané pour générer l'instantané pour une publication de fusion.

System_CAPS_ICON_note.jpg Remarque


Des sauts de ligne ont été ajoutés pour améliorer la lisibilité. Dans un fichier de commandes, les commandes doivent figurer sur une seule ligne.

  
REM -- Declare variables  
SET Publisher=%InstanceName%  
SET PublicationDB=AdventureWorks2012   
SET Publication=AdvWorksSalesOrdersMerge   
  
REM --Start the Snapshot Agent to generate the snapshot for AdvWorksSalesOrdersMerge.  
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %Publication%   
-Publisher %Publisher% -Distributor %Publisher% -PublisherDB %PublicationDB%   
-ReplicationType 2 -OutputVerboseLevel 1 -DistributorSecurityMode 1  
  

L'Agent d'instantané génère des instantanés après qu'une publication a été créée. Vous pouvez générer ces instantanés par programme en utilisant les Replication Management Objects et l'accès direct par code managé aux fonctionnalités de l'Agent de réplication. Les objets à utiliser dépendent du type de réplication. L'Agent d'instantané peut être démarré de façon synchrone à l'aide de l'objet T:Microsoft.SqlServer.Replication.SnapshotGenerationAgent ou de façon asynchrone à l'aide du travail de l'agent. Une fois l'instantané initial généré, il est transféré et appliqué sur l'Abonné lorsque l'abonnement est synchronisé pour la première fois. Vous devrez exécuter de nouveau l'agent chaque fois que l'instantané existant ne contiendra plus de données valides à jour. Pour plus d’informations, consultez mettre à jour des Publications.

System_CAPS_ICON_important.jpg Important


Lorsque c'est possible, demande aux utilisateurs de fournir les informations d'identification au moment de l'exécution. Si vous devez stocker des informations d'identification, utilisez les Services de chiffrement fournis par Microsoft Windows .NET Framework.

Pour générer l'instantané initial pour une publication transactionnelle ou d'instantané en démarrant le travail de l'Agent d'instantané (asynchrone)

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

  2. Créez une instance de la TransPublication classe. Définir le nom et DatabaseName Propriétés de la publication et définissez la ConnectionContext propriété à la connexion créée à l’étape 1.

  3. Appelez le LoadProperties méthode pour charger les autres propriétés de l’objet. Si cette méthode retourne false, soit les propriétés de la publication ont été définies de manière incorrecte à l'étape 2, soit la publication n'existe pas.

  4. Si la valeur de SnapshotAgentExists est false, appelez CreateSnapshotAgent pour créer le travail de l’agent de capture instantanée pour cette publication.

  5. Appelez le StartSnapshotGenerationAgentJob méthode pour démarrer le travail de l’agent qui génère l’instantané pour cette publication.

  6. (Facultatif) Lorsque la valeur de SnapshotAvailable est true, l’instantané n’est disponible pour les abonnés.

Pour générer l'instantané initial pour une publication transactionnelle ou d'instantané en exécutant l'Agent d'instantané (synchrone)

  1. Créez une instance de la classe T:Microsoft.SqlServer.Replication.SnapshotGenerationAgent et définissez les propriétés requises suivantes :

  2. Définir une valeur de transactionnel ou instantané pour P:Microsoft.SqlServer.Replication.SnapshotGenerationAgent.ReplicationType.

  3. Appelez la méthode M:Microsoft.SqlServer.Replication.SnapshotGenerationAgent.GenerateSnapshot .

Pour générer l'instantané initial pour une publication de fusion en démarrant le travail de l'Agent d'instantané (asynchrone)

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

  2. Créez une instance de la MergePublication classe. Définir le nom et DatabaseName Propriétés de la publication et définissez la ConnectionContext propriété à la connexion créée à l’étape 1.

  3. Appelez le LoadProperties méthode pour charger les autres propriétés de l’objet. Si cette méthode retourne false, soit les propriétés de la publication ont été définies de manière incorrecte à l'étape 2, soit la publication n'existe pas.

  4. Si la valeur de SnapshotAgentExists est false, appelez CreateSnapshotAgent pour créer le travail de l’agent de capture instantanée pour cette publication.

  5. Appelez le StartSnapshotGenerationAgentJob méthode pour démarrer le travail de l’agent qui génère l’instantané pour cette publication.

  6. (Facultatif) Lorsque la valeur de SnapshotAvailable est true, l’instantané n’est disponible pour les abonnés.

Pour générer l'instantané initial pour une publication de fusion en exécutant l'Agent d'instantané (synchrone)

  1. Créez une instance de la classe T:Microsoft.SqlServer.Replication.SnapshotGenerationAgent et définissez les propriétés requises suivantes :

  2. Définir une valeur de fusion pour P:Microsoft.SqlServer.Replication.SnapshotGenerationAgent.ReplicationType.

  3. Appelez la méthode M:Microsoft.SqlServer.Replication.SnapshotGenerationAgent.GenerateSnapshot .

Exemples (RMO)

Cet exemple exécute de façon synchrone l'Agent d'instantané pour générer l'instantané initial pour une publication transactionnelle.

			// Set the Publisher, publication database, and publication names.
			string publicationName = "AdvWorksProductTran";
			string publicationDbName = "AdventureWorks2012";
			string publisherName = publisherInstance;
			string distributorName = publisherInstance;

			SnapshotGenerationAgent agent;

			try
			{
				// Set the required properties for Snapshot Agent.
				agent = new SnapshotGenerationAgent();
				agent.Distributor = distributorName;
				agent.DistributorSecurityMode = SecurityMode.Integrated;
				agent.Publisher = publisherName;
				agent.PublisherSecurityMode = SecurityMode.Integrated;
				agent.Publication = publicationName;
				agent.PublisherDatabase = publicationDbName;
				agent.ReplicationType = ReplicationType.Transactional;

				// Start the agent synchronously.
				agent.GenerateSnapshot();

			}
			catch (Exception ex)
			{
				// Implement custom application error handling here.
				throw new ApplicationException(String.Format(
					"A snapshot could not be generated for the {0} publication."
					, publicationName), ex);
			}

        ' Set the Publisher, publication database, and publication names.
        Dim publicationName As String = "AdvWorksProductTran"
        Dim publicationDbName As String = "AdventureWorks2012"
        Dim publisherName As String = publisherInstance
        Dim distributorName As String = publisherInstance

        Dim agent As SnapshotGenerationAgent

        Try
            ' Set the required properties for Snapshot Agent.
            agent = New SnapshotGenerationAgent()
            agent.Distributor = distributorName
            agent.DistributorSecurityMode = SecurityMode.Integrated
            agent.Publisher = publisherName
            agent.PublisherSecurityMode = SecurityMode.Integrated
            agent.Publication = publicationName
            agent.PublisherDatabase = publicationDbName
            agent.ReplicationType = ReplicationType.Transactional

            ' Start the agent synchronously.
            agent.GenerateSnapshot()

        Catch ex As Exception
            ' Implement custom application error handling here.
            Throw New ApplicationException(String.Format( _
             "A snapshot could not be generated for the {0} publication." _
             , publicationName), ex)
        End Try

Cet exemple démarre de façon asynchrone le travail de l'agent pour générer l'instantané initial pour une publication transactionnelle.

			// Set the Publisher, publication database, and publication names.
			string publicationName = "AdvWorksProductTran";
			string publicationDbName = "AdventureWorks2012";
			string publisherName = publisherInstance;

			TransPublication publication;

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

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

				// Set the required properties for an existing publication.
				publication = new TransPublication();
				publication.ConnectionContext = conn;
				publication.Name = publicationName;
				publication.DatabaseName = publicationDbName;

				if (publication.LoadProperties())
				{
					// Start the Snapshot Agent job for the publication.
					publication.StartSnapshotGenerationAgentJob();
				}
				else
				{
					throw new ApplicationException(String.Format(
						"The {0} publication does not exist.", publicationName));
				}
			}
			catch (Exception ex)
			{
				// Implement custom application error handling here.
				throw new ApplicationException(String.Format(
					"A snapshot could not be generated for the {0} publication."
					, publicationName), ex);
			}
			finally
			{
				conn.Disconnect();
			}

        ' Set the Publisher, publication database, and publication names.
        Dim publicationName As String = "AdvWorksProductTran"
        Dim publicationDbName As String = "AdventureWorks2012"
        Dim publisherName As String = publisherInstance

        Dim publication As TransPublication

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

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

            ' Set the required properties for an existing publication.
            publication = New TransPublication()
            publication.ConnectionContext = conn
            publication.Name = publicationName
            publication.DatabaseName = publicationDbName

            If publication.LoadProperties() Then
                ' Start the Snapshot Agent job for the publication.
                publication.StartSnapshotGenerationAgentJob()
            Else
                Throw New ApplicationException(String.Format( _
                 "The {0} publication does not exist.", publicationName))
            End If
        Catch ex As Exception
            ' Implement custom application error handling here.
            Throw New ApplicationException(String.Format( _
             "A snapshot could not be generated for the {0} publication." _
             , publicationName), ex)
        Finally
            conn.Disconnect()
        End Try

Create a Publication
Create a Pull Subscription
Create a Push Subscription
Specify Synchronization Schedules
Créer et appliquer un instantané
Initialiser un abonnement avec un instantané
Concepts liés à Replication Management Objects
Méthodes préconisées en matière de sécurité de réplication
Concepts liés aux procédures stockées système de réplication
Utiliser sqlcmd avec des variables de script

Ajouts de la communauté

AJOUTER
Afficher: