[SQL Server] Réplication : comment synchroniser un ou plusieurs articles spécifiques sans nouveau snapshot complet ?

Supposons que l’on dispose de 5 articles au sein d’une base de publication MaBase1 répliqués vers la base abonnée MaBase2, et que l’on ajoute un nouvel article au sein de la base de publication. Comment faire pour que SQL Server synchronise le nouvel article vers la base abonnée sans avoir recours à un nouveau snapshot de l’ensemble de la base de publication ? Ce billet répond à la question.

Admettons que la publication s’appelle MaBase1_X et que la base abonnée MaBase2 est sur une instance appelée SRV-SQL02,
suivez le guide :

  • Sur l’éditeur, lancez la procédure stockée sp_helppublication pour connaître les options de synchronisation de notre publication :
USE MaBase1
GO
EXEC sp_helppublication
GO

Le résultat qui nous intéresse est celui des colonnes Immediate_sync et Allow_anonymous. Si Immediate_sync est activé (valeur à 1), toutes les fois où un nouvel article sera ajouté, un nouveau snapshot devra s’appliquer pour l’ensemble de la base de publication et non pour l’article en particulier afin que les modifications soient prises en compte. Et généralement, Immediate_sync est activé si les abonnements anonymes sont acceptés (Allow_anonymous à 1).

  • Lancez, sur l’éditeur, le script suivant pour éviter le snapshot total de la base de données :
USE MaBase1

GO
EXEC sp_changepublication @publication=‘MaBase1_X’,@property=N’allow_anonymous’,

@value=‘false’

GO

EXEC sp_changepublication @publication=‘MaBase1_X’,

@property=N’immediate_sync’,

@value=‘false’

GO

  • Toujours sur l’éditeur, ajoutez l’article en forçant l’invalidation du snapshot existant :
USE MaBase1

GO
EXEC sp_addarticle @publication=‘MaBase1_X’,
@article=‘dbo.MaTable3’
,@source_object=‘Matable3’,–@source_table=’MaTable3′,

@force_invalidate_snapshot=1

GO

  • Synchronisez, finalement, votre article en exécutant le script suivant sur l’éditeur :
USE MaBase1

GO
EXEC sp_addsubscription
@publication=‘MaBase1_X’,

@article=‘all’,

@subscriber=‘SRV-SQL02’,

@destination_db=‘MaBase2’

GO

L’erreur suivante sera naturellement levée : « Specify all articles when subscribing to a publication using concurrent snapshot processing ».

Cette erreur tombe quand la publication existante a été configurée en mode concurrent snapshsot et indique qu’il n’est pas possible de réaliser une synchronisation sans une resynchronisation totale de tous les articles. La solution serait donc d’employer l’option @reserved=’Internal’ :

USE MaBase1

GO
EXEC sp_addsubscription
@publication=‘MaBase1_X’,

@article=‘all’,

@subscriber=‘SRV-SQL02’,

@destination_db=‘MaBase2’,

@reserved=‘Internal’

GO

Maintenant, lancez un nouvel snapshot de la publication. L’article sera ainsi synchronisé par la suite sans avoir à générer un nouvel snapshot de tous les articles.

Notons que si vous souhaitez lancer un nouveau snapshot de tous les articles de la base de publication, vous devrez réactiver Immediate_sync.
Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s