Partager via


Créer et appliquer l’instantané initial

Cette rubrique explique comment créer et appliquer l’instantané initial dans SQL Server 2014 à l’aide de SQL Server Management Studio, Transact-SQL ou Replication Management Objects (RMO). Les publications de fusion qui utilisent des filtres paramétrables nécessitent un instantané en deux parties. Pour plus d’informations, consultez Créer un instantané pour une publication de fusion avec des filtres paramétrables.

Dans cette rubrique

Utilisation de SQL Server Management Studio

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 avec l’Assistant Nouvelle publication. Par défaut, il est ensuite appliqué par l’Agent de distribution (pour la réplication instantanée et transactionnelle) ou l’Agent de fusion (pour les abonnements de fusion) pour tous les abonnements. Un instantané peut également être généré à 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 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 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 Afficher l’état de l’agent d’instantané - <Publication> , cliquez sur Démarrer.

Une fois l’Agent d’instantané terminé la génération de l’instantané, un message s’affiche, par exemple « [100%] Un instantané de 17 articles 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. Cliquez avec le bouton droit sur la publication pour laquelle vous souhaitez générer un instantané, puis cliquez sur Générer un instantané.

  3. Pour afficher l’état de l’Agent d’instantané, cliquez sur l’onglet Agents . Pour plus d’informations, cliquez avec le bouton droit sur l’Agent d’instantané dans la grille, puis cliquez sur Afficher les détails.

Pour appliquer un instantané

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

    • Si l’agent est défini pour s’exécuter en continu (valeur par défaut pour la réplication transactionnelle), l’instantané est automatiquement appliqué après sa génération.

    • Si l’agent est défini pour s’exécuter selon une planification, l’instantané est appliqué la prochaine fois que l’agent est planifié pour s’exécuter.

    • Si l’agent est défini pour s’exécuter à la demande, cela s'applique 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 par extraction.

Utilisation de Transact-SQL

Les instantanés initiaux peuvent être créés par programmation en créant et en 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 batch. Une fois qu’un instantané initial a été généré, il est transféré vers et appliqué à l’Abonné lorsque l’abonnement est synchronisé pour la première fois. Si vous exécutez le Snapshot Agent à partir d’une invite de commandes ou d’un fichier de commandes, vous devez réexécuter l’agent chaque fois que l’instantané existant devient invalide.

Important

Si possible, invitez les utilisateurs à entrer des informations d’identification de sécurité au moment de l’exécution. Si vous devez stocker des informations d’identification dans un fichier de script, vous devez sécuriser le fichier pour empêcher l’accès non autorisé.

Pour créer et exécuter une tâche de l’Agent d’instantané pour générer l’instantané initial

  1. Créez un instantané, une publication transactionnelle ou une publication par fusion. Pour plus d’informations, consultez Créer une publication.

  2. Exécutez sp_addpublication_snapshot (Transact-SQL). Spécifiez @publication et les paramètres suivants :

    • Le @job_login, qui précise les identifiants d'authentification Windows sous lesquels l'Agent d'instantané s'exécute sur le distributeur.

    • Le @job_password** est le mot de passe pour les 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 de l’authentification SQL Server pour @publisher_login et @publisher_password.

    • (Facultatif) 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 au serveur de distribution sous forme de 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 (Gestionnaire de configuration SQL Server).

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

  4. Sur le serveur de publication sur la base de données de publication, exécutez sp_startpublication_snapshot (Transact-SQL), en indiquant la valeur de @publication telle que spécifiée à l'étape 1.

Pour exécuter l’agent d’instantané pour générer l’instantané initial

  1. Créez un instantané, une publication transactionnelle ou de fusion. Pour plus d’informations, consultez Créer une publication.

  2. Ajoutez des articles à la publication. Pour plus d’informations, consultez Définir un article.

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

    • -Publication

    • -Éditeur

    • -Distributeur

    • -PublisherDB

    • -TypeDeRéplication

    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 une tâche de l'Agent d’instantané pour la nouvelle publication (à l’aide de 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 une tâche de l'Agent d'instantané (utilisation de variables sqlcmd) pour la publication. Cet exemple initie également la tâche.

-- 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 en ligne de commande suivants démarrent l’Agent de capture instantanée pour générer l’instantané d’une publication de fusion.

Remarque

Les sauts de ligne ont été ajoutés pour améliorer la lisibilité. Dans un fichier de commandes, les commandes doivent être effectuées sur une seule ligne.

@ECHO OFF
SET InstanceName=%computername%
REM<snippetstartmergesnapshot_10>
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 
REM</snippetstartmergesnapshot_10>

PAUSE

Utilisation des objets RMO (Replication Management Objects)

L’Agent d’instantané génère des instantanés après la création d’une publication. Vous pouvez générer ces captures instantanées par programmation à l’aide de RMO (Replication Management Objects) et d’un accès direct au code managé aux fonctionnalités de l’agent de réplication. Les objets que vous utilisez 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 manière asynchrone à l’aide du job d’agent. Une fois que l’instantané initial a été généré, il est transféré vers et appliqué à 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 contient plus de données valides, up-to-date. Pour plus d’informations, consultez Maintenance des publications.

Important

Si possible, invitez les utilisateurs à entrer des informations d’identification de sécurité 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 d’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 à l’aide de la ServerConnection classe.

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

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

  4. Si la valeur de SnapshotAgentExists est false, appelez CreateSnapshotAgent pour créer la tâche de l’agent d’instantané pour cette publication.

  5. Appelez la méthode StartSnapshotGenerationAgentJob pour démarrer la tâche de l’agent qui génère l’instantané de cette publication.

  6. (Facultatif) Lorsque la valeur de SnapshotAvailable est true, l'instantané est accessible aux abonnés.

Pour générer l’instantané initial d’une publication d’instantané ou transactionnelle en lançant l’Agent d’instantané (synchrone)

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

  2. Définissez une valeur de Transactional ou Snapshot pour ReplicationType.

  3. Appelez la méthode GenerateSnapshot .

Pour générer l’instantané initial d’une publication de fusion en démarrant la tâche de l’Agent d’instantané (asynchrone)

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

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

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

  4. Si la valeur de SnapshotAgentExists est false, appelez CreateSnapshotAgent pour créer la tâche de l’agent d’instantané pour cette publication.

  5. Appelez la méthode StartSnapshotGenerationAgentJob pour démarrer la tâche de l’agent qui génère l’instantané de cette publication.

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

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

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

  2. Définissez une valeur pour MergeReplicationType.

  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 d’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 lance de façon asynchrone le travail de l’agent pour générer l’instantané initial d’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
Créer un abonnement push
Spécifier des planifications de synchronisation
Créer et appliquer l’instantané
Initialiser un abonnement avec un instantané
Concepts liés à RMO (Replication Management Objects)
Meilleures pratiques 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