Créer et appliquer l'instantané initial

S’applique à : SQL Server (toutes les versions prises en charge) Azure SQL Managed Instance

Cette rubrique explique comment créer et appliquer l’instantané initial dans SQL Server à l’aide de SQL Server Management Studio, Transact-SQL ou 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 Créer un instantané d’une publication de fusion avec des filtres paramétrés.
Les instantanés sont générés par l'Agent d'instantané après la création d'une publication. Elles peuvent être générées :

  • Immédiatement. Par défaut, un instantané pour une publication de fusion est généré immédiatement après la création de la publication dans l'Assistant Nouvelle publication.
  • À une heure planifiée. Spécifiez une planification sur la page Agent d'instantané de l'Assistant Nouvelle publication, ou lors de l'utilisation de procédures stockées ou de Replication Management Objects.
  • Manuellement. Exécutez l'Agent d'instantané à partir de l'invite de commandes ou de SQL Server Management Studio. Pour plus d’informations sur l’exécution des agents, consultez Concepts des exécutables de l’agent de réplication et Démarrer et arrêter un agent de réplication (SQL Server Management Studio).

Pour la réplication de fusion, un instantané est généré à chaque exécution de l'Agent d'instantané. Pour la réplication transactionnelle, la génération d'instantané dépend du paramétrage de la propriété de publication immediate_sync. Si la propriété est définie avec la valeur TRUE (valeur par défaut lors de l'utilisation de l'Assistant Nouvelle publication), un instantané est généré à chaque exécution de l'Agent d'instantané, et peut être appliqué à un abonné à tout moment. Si la propriété est définie avec la valeur FALSE (valeur par défaut lors de l'utilisation de sp_addpublication), l'instantané est généré uniquement si un nouvel abonnement a été ajouté depuis la dernière exécution de l'Agent d'instantané ; les abonnés doivent attendre que l'Agent d'instantané se termine avant de pouvoir se synchroniser.

Par défaut, lorsqu'ils sont générés, les instantanés sont enregistrés dans le dossier d'instantanés par défaut, situé sur le serveur de distribution. Vous pouvez également enregistrer les fichiers d'instantanés sur des supports amovibles, tels que les disques amovibles, les CD-ROM, ou tout emplacement autre que le dossier d'instantanés par défaut. De plus, vous pouvez compresser les fichiers afin de faciliter leur stockage et leur transfert, et exécuter des scripts avant ou après avoir appliqué l'instantané sur l'Abonné. Pour plus d'informations sur ces options, consultez Snapshot Options.

Si l'instantané est pour une publication de fusion utilisant des filtres paramétrés, il est créé à l'aide d'un processus en deux parties. D'abord, un instantané de schéma est créé contenant les scripts de réplication et le schéma des objets publiés, mais pas les données. Ensuite, chaque abonnement est initialisé avec un instantané comprenant les scripts et le schéma copiés à partir de l'instantané de schéma et des données appartenant à la partition de l'abonnement. Pour plus d'informations, voir Snapshots for Merge Publications with Parameterized Filters.

Une fois l'instantané créé sur le serveur de publication et stocké dans un emplacement d'instantané par défaut ou de remplacement, l'instantané peut être transféré sur l'Abonné et appliqué. L'Agent de distribution (pour la réplication d'instantané ou transactionnelle) ou l'Agent de fusion (pour la réplication de fusion) transfère l'instantané et applique le schéma et les fichiers de données à la base de données d'abonnement sur l'Abonné pendant la synchronisation initiale. Par défaut, la synchronisation initiale se produit immédiatement après la création d'un abonnement si vous utilisez l'Assistant Nouvel abonnement. Ce comportement est contrôlé par l'option À quel moment sur la page de l'Assistant Initialiser les abonnements . Lorsque les instantanés sont générés après l'initialisation d'un abonnement, ils ne sont pas appliqués à un abonné à moins qu'un abonnement ne soit marqué pour la réinitialisation. Pour plus d’informations, consultez Réinitialiser des abonnements.

Une fois que l'Agent de distribution ou l'Agent de fusion a appliqué l'instantané initial, l'Agent propage les mises à jour suivantes et autres modifications de données. La distribution et l'application des instantanés n'affectent que les abonnés qui attendent un nouvel instantané ou un instantané initial. Les autres abonnés à cette publication (recevant déjà les insertions, mises à jour, suppressions ou autres modifications apportées aux données publiées) ne sont pas concernés.

Pour afficher ou modifier l'emplacement par défaut du dossier d'instantanés, consultez

Emplacement par défaut des instantanés

Spécifiez l'emplacement par défaut des instantanés dans la page Dossier d'instantanés de l'Assistant Configuration de la distribution. Pour plus d’informations sur l’utilisation de cet Assistant, consultez Configurer la publication et la distribution. Si vous créez une publication sur un serveur qui n'est pas configuré en tant que serveur de distribution, spécifiez un emplacement d'instantanés par défaut dans la page Dossier d'instantanés de l'Assistant Nouvelle publication. Pour plus d’informations sur l’utilisation de cet Assistant, consultez Créer une publication.

Modifiez l’emplacement d’instantané par défaut dans la page Serveurs de publication de la boîte de dialogue Propriétés du serveur de distribution - <Serveur de distribution> . Pour plus d’informations, consultez Afficher et modifier les propriétés d’un serveur de distribution ou d’un serveur de publication. Définissez le dossier d’instantanés pour chaque composition dans la boîte de dialogue Propriétés de la publication - <Publication> . Pour plus d'informations, voir View and Modify Publication Properties.

Modifier l’emplacement par défaut des instantanés

  1. Dans la page Serveurs de publication de la boîte de dialogue Propriétés du serveur de distribution - <Serveur de distribution> , cliquez sur le bouton Propriétés (...) du serveur de publication pour lequel vous souhaitez modifier l’emplacement d’instantané par défaut.

  2. Dans la boîte de dialogue Propriétés du serveur de publication - <Éditeur> , entrez une valeur pour la propriété Dossier d’instantanés par défaut .

    Notes

    L'Agent d'instantané doit posséder des autorisations en écriture sur le répertoire spécifié et les Agents de distribution et de fusion des autorisations en lecture. Si vous utilisez des abonnements extraits, vous devez définir un répertoire partagé en tant que chemin d'accès UNC, par exemple \\nomordinateur\snapshot. Pour plus d’informations, consultez Sécuriser le dossier d’instantanés.

  3. Sélectionnez OK.

Créer l’instantané

Par défaut, si SQL Server Agent 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.

Utilisation de SQL Server 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 réplication pour laquelle vous souhaitez créer un instantané, puis cliquez sur Afficher l'état de l'Agent d'instantané.
  4. Dans la boîte de dialogue Affichage Agent d'instantané État - <Publication>, 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é ».

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 réplication pour laquelle vous souhaitez créer 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 des informations plus détaillées, cliquez avec le bouton droit sur l'Agent d'instantané dans la grille, puis cliquez sur Afficher les détails.

Utilisation de Transact-SQL

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.

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é.

  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 (Transact-SQL). Spécifiez @publication et les paramètres suivants :

    • Le @job_login, qui spécifie les informations d’identification d’authentification Windows sous lesquelles le Agent d'instantané s’exécute sur le serveur de distribution.

    • Le @job_password, qui est le mot de passe des informations d’identification Windows fournies.

    • (Facultatif) Valeur 0 pour @publisher_security_mode si l’agent utilise 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, consultez Spécifier des planifications de synchronisation.

    Important

    Lors de la configuration d'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 en texte brut au serveur de distribution. 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 (Gestionnaire de configuration SQL Server).

  3. Ajoutez des articles à la publication. Pour plus d’informations, consultez définir un Article.

  4. Sur la base de données de publication sur le serveur de publication, exécutez sp_startpublication_snapshot (Transact-SQL), en spécifiant la valeur de @publication de l’étape 1.

Appliquer un instantané

Utilisation de SQL Server Management Studio

  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 Synchronize a Push Subscription et Synchronize a Pull Subscription.

Utiliser Transact-SQL

  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, consultez définir un Article.

  3. À partir de l'invite de commandes ou d'un fichier de commandes, démarrez l' Replication Snapshot Agent en exécutant snapshot.exe, en spécifiant les arguments de ligne de commande suivants :

    • -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 ajouter un travail de l'Agent d'instantané pour la nouvelle publication (à l'aide des variables de script sqlcmd ). 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 d'instantané (à l'aide des variables sqlcmd ) 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.

Notes

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  
  

Utilisation d'objets RMO (Replication Management Objects)

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 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 Gestion des publications.

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éez une connexion au serveur de publication en utilisant la classe ServerConnection .

  2. Créez une instance de la classe TransPublication. Définissez les propriétés Name et DatabaseName de la publication, et définissez la propriété ConnectionContext avec la connexion créée à l'étape 1.

  3. Appelez la méthode LoadProperties pour charger les propriétés restantes 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 SnapshotAgentExists a la valeur false, appelez CreateSnapshotAgent pour créer le travail de l'Agent d'instantané pour cette publication.

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

  6. (Facultatif) Lorsque SnapshotAvailable a la valeur true, l'instantané est à la disposition des 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 SnapshotGenerationAgent et définissez les propriétés requises suivantes :

  2. Spécifiez la valeur Transactional ou Snapshot pour ReplicationType.

  3. Appelez la méthode 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éez une connexion au serveur de publication en utilisant la classe ServerConnection .

  2. Créez une instance de la classe MergePublication. Définissez les propriétés Name et DatabaseName de la publication, et définissez la propriété ConnectionContext avec la connexion créée à l'étape 1.

  3. Appelez la méthode LoadProperties pour charger les propriétés restantes 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 SnapshotAgentExists a la valeur false, appelez CreateSnapshotAgent pour créer le travail de l'Agent d'instantané pour cette publication.

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

  6. (Facultatif) Lorsque SnapshotAvailable a la valeur true, l'instantané est à la disposition des 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 SnapshotGenerationAgent et définissez les propriétés requises suivantes :

  2. Spécifiez la valeur Merge pour ReplicationType.

  3. Appelez la méthode 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

Voir aussi

Créer une publication
Créer un abonnement par extraction de données (pull)
Créer un abonnement par émission de données
Spécifier des planifications de synchronisation
Initialiser un abonnement avec un instantané
Concepts liés à Replication Management Objects
Bonnes pratiques en matière de sécurité de la réplication
Replication System Stored Procedures Concepts
Utiliser sqlcmd avec des variables de script