Créer et appliquer l'instantané initial
S’applique à : SQL Server Azure SQL Managed Instance
Cette rubrique comment créer et appliquer la capture instantanée initiale dans SQL Server à l’aide de SQL Server Management Studio, Transact-SQL ou Replication Management Objects (RMO). 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
SQL Server Management Studio : Modifier les options d’instantanés
Programmation de la réplication et programmation RMO : Configure Publishing and Distribution
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 par défaut des instantanés 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 publication dans la boîte de dialogue Propriétés de publication - <Publication>. Pour plus d'informations, voir View and Modify Publication Properties.
Modifier l’emplacement par défaut des instantanés
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 des propriétés (…) du serveur de publication pour lequel vous voulez modifier l’emplacement par défaut des captures instantanées.
Dans la boîte de dialogue Propriétés du serveur de publication - <Serveur de publication>, entrez une valeur pour la propriété Dossier des captures instantanées par défaut.
Remarque
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 par extraction, vous devez définir un répertoire partagé en tant que chemin UNC, par exemple \\computername\snapshot. Pour plus d’informations, consultez Sécuriser le dossier d’instantanés.
Cliquez sur OK.
Créer une capture instantanée
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
- Connectez-vous au serveur de publication dans Management Studio, puis développez le nœud du serveur.
- Développez le dossier Réplication , puis développez le dossier Publications locales .
- 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é.
- Dans la boîte de dialogue Afficher l’état de l’Agent d’instantané - <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
- 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.
- 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é.
- Pour afficher l’état de l’Agent d’instantané, cliquez sur l’onglet Agents. Pour plus d’informations, faites un clic 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é.
Créez une publication d'instantané, transactionnelle ou de fusion. Pour plus d’informations, voir Create a Publication.
Exécutez sp_addpublication_snapshot (Transact-SQL). Spécifiez @publication et les paramètres suivants :
@job_login , qui spécifie les informations d'identification de l'authentification Windows qu'utilise l'Agent d'instantané pour s'exécuter sur le serveur de distribution.
@job_password, qui correspond au mot de passe pour les informations d'identification Windows fournies.
(Facultatif) La valeur 0 pour @publisher_security_mode si l'agent utilisera 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).
Ajoutez des articles à la publication. Pour plus d’informations, consultez définir un Article.
Dans la base de données de publication sur le serveur de publication, exécutez sp_startpublication_snapshot (Transact-SQL), en spécifiant la valeur @publication créée à l’étape 1.
Appliquer un instantané
Utilisation de SQL Server Management Studio
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
Créez une publication d'instantané, transactionnelle ou de fusion. Pour plus d’informations, voir Create a Publication.
Ajoutez des articles à la publication. Pour plus d’informations, consultez définir un Article.
À 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'AdventureWorks2022'; --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 [AdventureWorks2022]
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'AdventureWorks2022';
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.
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=AdventureWorks2022
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)
Créez une connexion au serveur de publication en utilisant la classe ServerConnection .
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.
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.
Si SnapshotAgentExists a la valeur false, appelez CreateSnapshotAgent pour créer le travail de l'Agent d'instantané pour cette publication.
Appelez la méthode StartSnapshotGenerationAgentJob pour démarrer le travail de l'agent qui génère l'instantané pour cette publication.
(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)
Créez une instance de la classe SnapshotGenerationAgent et définissez les propriétés requises suivantes :
Publisher – nom du serveur de publication
PublisherDatabase – nom de la base de données de publication
Publication – nom de la publication
Distributor – nom du serveur de distribution
PublisherSecurityMode – valeur Integrated pour utiliser l'authentification Windows lors de la connexion au serveur de publication ou valeur Standard et valeurs pour PublisherLogin et PublisherPassword pour utiliser l'authentification SQL Server lors de la connexion au serveur de publication. L'authentification Windows est recommandée.
DistributorSecurityMode – valeur Integrated pour utiliser l'authentification Windows lors de la connexion au serveur de distribution ou valeur Standard et valeurs pour DistributorLogin et DistributorPassword pour utiliser l'authentification SQL Server lors de la connexion au serveur de distribution. L'authentification Windows est recommandée.
Spécifiez la valeur Transactional ou Snapshot pour ReplicationType.
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)
Créez une connexion au serveur de publication en utilisant la classe ServerConnection .
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.
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.
Si SnapshotAgentExists a la valeur false, appelez CreateSnapshotAgent pour créer le travail de l'Agent d'instantané pour cette publication.
Appelez la méthode StartSnapshotGenerationAgentJob pour démarrer le travail de l'agent qui génère l'instantané pour cette publication.
(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)
Créez une instance de la classe SnapshotGenerationAgent et définissez les propriétés requises suivantes :
Publisher – nom du serveur de publication
PublisherDatabase – nom de la base de données de publication
Publication – nom de la publication
Distributor – nom du serveur de distribution
PublisherSecurityMode – valeur Integrated pour utiliser l'authentification Windows lors de la connexion au serveur de publication ou valeur Standard et valeurs pour PublisherLogin et PublisherPassword pour utiliser l'authentification SQL Server lors de la connexion au serveur de publication. L'authentification Windows est recommandée.
DistributorSecurityMode – valeur Integrated pour utiliser l'authentification Windows lors de la connexion au serveur de distribution ou valeur Standard et valeurs pour DistributorLogin et DistributorPassword pour utiliser l'authentification SQL Server lors de la connexion au serveur de distribution. L'authentification Windows est recommandée.
Spécifiez la valeur Merge pour ReplicationType.
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 = "AdventureWorks2022";
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 = "AdventureWorks2022"
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 = "AdventureWorks2022";
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 = "AdventureWorks2022"
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
Blocage lors de l’application d’une capture instantanée initiale
Si vous avez plusieurs publications, qui publient des données dans une base de données sur les abonnés, tout en appliquant la ou les captures instantanées initiales, vous remarquez qu’une seule publication est en mesure d’appliquer son instantané à la fois.
Vous pouvez voir une ressource d’attente similaire à ce qui suit lors de l’examen de l’activité SQL :
APP: 18:16384:[snapshot_delivery_in_progress_Tr]:(9bcdaf92)
APP: 5:16384:[snapshot_delivery_in_progress_Er]:(3c3b7db9)
La requête du comportement de verrouillage peut afficher des ressources similaires à ce qui suit :
APP 16384:[appname]:(fbe42d68) XAPP 16384:[snapshot_del]:(9bcdaf92) X
Ce comportement est normal. Cela se produit parce qu’un verrou sur l’application est utilisé pour empêcher plusieurs agents de réplication d’appliquer simultanément des captures instantanées de différentes publications à la même base de données de l'abonné. Étant donné que le verrou sur l’application contient le nom de la base de données de l’abonné, toutes les publications qui publient dans la même base de données d’abonné seront affectées. Le résultat est qu’un seul instantané peut être inséré dans la base de données de l’abonné à un moment donné.
Des verrous exclusifs sont utilisés dans cette situation pour éviter la possibilité que les agents de réplication deviennent bloqués les uns avec les autres.
Pour contourner ce problème, spécifiez une base de données de l'abonné différente pour chaque publication.
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 à RMO (Replication Management Objects)
Bonnes pratiques en matière de sécurité de la réplication
Concepts liés aux procédures stockées système de réplication
Utiliser sqlcmd avec des variables de script