En utilisant la réplication transactionnelle SQL 2008 R2 avec des abonnés pull, lorsque nous ajoutons un article, j'aimerais éviter d'avoir à créer un instantané entier (la base de données est ~ 80 Go, donc cela prend des heures).
De cet article , j'ai vu comment faire cela avec un instantané partiel en désactivant immediate_sync, mais cela n'a pas fonctionné pour nous.
Idéalement, j'aimerais simplement l'exécuter dans le cadre de notre script db pour créer la table, donc si nous voulons qu'il soit répliqué, nous le faisons:
Create Table ...
sp_addArticle ...
sp_PushThisToOurSubscribersNow
la source
la source
J'avais la même question, et même si je suis DBA depuis un certain temps, je n'ai pas vraiment traité la réplication suffisamment profondément pour être complètement à l'aise, donc j'ai pensé que les ressources et les guides suivants étaient utiles:
Ce blog , qui a donné un bon aperçu du processus. Cela nous rappelle également que, si vous avez une grande publication existante, et que son option est définie sur "immediate_sync", cela entraînera la préparation d'un instantané entièrement nouveau à chaque fois que vous ajoutez ou modifiez un article. Il a donc une astuce pratique pour changer cette option, en utilisant
sp_changePublication @publication='MyPub', @property='immediate_sync', @value='false';
Article de blog MSDN dans "repltalk" (sonne comme une bonne ressource en général!) - pas directement "directement" mais toujours utile
Cette question, où @ Brandon-Williams a souligné que, s'il s'agit d'un abonnement Pull , vous devez également le rafraîchir, en utilisant
sp_refreshSubscriptions @publication = 'MyPub'
Moniteur de réplication SSMS - moyen pratique d'arrêter et de démarrer les agents (instantané, lecteur de journal) lorsque vous suivez le guide.
Voici les étapes réelles que j'ai suivies, qui ont bien fonctionné et ont rencontré l'approbation de mon DBA superviseur:
sp_changePublication
interdire la synchronisation anonyme et non immédiate, en utilisant - oui, comme le souligne @cody_konior, cela est sous-documenté, mais cela a bien fonctionné dans mon cas. YMMVsp_addArticle
sp_articleColumn
(publication et article spécifiés, NE PAS spécifier de colonnes -> implique TOUTES les colonnes)sp_refreshSubscriptions
pour cette publication pour rafraîchir l' extracteurEt même si oui, vous pouvez effectuer la plupart des modifications avec l'interface graphique SSMS, je trouve utile de tout écrire pour qu'il puisse être A) sous contrôle de source (changement de contrôle), et B) déployé à plusieurs reprises ou sur plusieurs instances . Malheureusement, je n'ai pas passé de temps à écrire les arrêts / démarrages de l'agent, mais cela ne devrait pas être trop difficile étant donné qu'il ne s'agit que de tâches d'agent SQL. Il vous suffit de faire tout cela "trouver le JobID en utilisant le Job-Name" (requête
sysjobs
- vraiment, MS?) ...J'espère que cela aidera les futurs lecteurs!
la source
Comme indiqué dans Ajout d'articles et suppression d'articles dans des publications existantes , vous devez * créer un nouvel instantané pour la publication.
Pour éviter de générer un instantané pour tous les articles lors de l'ajout d'un nouvel article, la propriété de publication
immediate_sync
doit être définie sur 0. Appelezsp_addarticle
ensuitesp_addsubscription
. Si les abonnements sont retirés, vous devez également appelersp_refreshsubscriptions
. Générez ensuite un instantané et seul un instantané pour le nouvel article ajouté sera généré.* Il s'agit de l'approche recommandée dans la documentation en ligne de SQL Server. Le problème avec votre approche est qu'elle est sujette à des erreurs.
la source
Modification majeure Il s'agit d'une réécriture complète de cette réponse (en tenant compte des critiques valides selon lesquelles la version précédente était sujette aux erreurs et causerait des problèmes)
Également publié une démonstration de la façon d'appliquer cela à: Youtube - Réplication SQL Server: comment ajouter un article sans prendre un instantané .
IMPORTANT: Ce n'est PAS une approche recommandée par Microsoft, donc vous serez seul pour le faire fonctionner, ne PAS appliquer directement à votre environnement de production sans tests isolés importants et vous familiariser avec les étapes!
Étapes à suivre:
Vérifier:
EXEMPLE Processus
A) Créez vous-même un tableau sur votre éditeur:
B) Créez vous-même un travail / proc / script pour effectuer des insertions / mises à jour / suppressions sur [TableNotUsingSnap] (vous pouvez ensuite l'utiliser pour valider la synchronisation correcte de l'abonné à l'aide de cette méthode.
Pré-étapes:
1. Créez votre table sur l'abonné
2. Créez vos procédures stockées de réplication (mise à jour / insertion / suppression) - sur l'Abonné
Vous pouvez créer les proc de repl:
Le changement que vous devrez appliquer:
IF NOT EXISTS (SELECT 'row already exists' FROM [Schema].[TableName] dest WITH (NOLOCK) WHERE dest.Id = @c1)
pour ne pas insérer s'il est déjà làIF @@rowcount = 0 ... exec sp_MSreplraiserror ...
ignorer une mise à jour qui n'est pas appliquée (car l'enregistrement peut avoir été supprimé sur l'éditeur avant de synchroniser les données)IF @@rowcount = 0 ... exec sp_MSreplraiserror ...
pour ignorer une suppression qui n'est pas appliquée (car l'enregistrement peut avoir été supprimé sur l'éditeur avant de synchroniser les données)sp_MSins_dboTableNotUsingSnap:
sp_MSupd_dboTableNotUsingSnap:
sp_MSdel_dboTableNotUsingSnap:
ÉTAPES DE DÉPLOIEMENT
3. Arrêtez l'agent de distribution - Sur le distributeur (push) ou l'abonné (pull)
4. Ajoutez maintenant l'article à la publication - Sur l'éditeur
Paramètres clés:
sp_addarticle
-@pre_creation_cmd = N'none'
utilisé pour dire à l'agent de distribution de ne pas laisser tomber et de générer ses propres objetssp_addsubscription
-@sync_type = N'none'
utilisé pour indiquer à Distributer qu'il n'a pas besoin de créer un nouvel instantané, il peut simplement mettre en file d'attente les commandes du DIUsp_addarticle:
5. Synchronisez vos données sur
Maintenant, vous devez copier vos données sur votre abonné, vous pouvez:
La méthode exacte que vous utilisez, je la laisse au lecteur, cela dépendra également de la durée pendant laquelle vous êtes prêt à faire arrêter votre agent de distribution.
EXTRA: Comme étape supplémentaire dans vos tests, voici un bon endroit pour exécuter votre script (à partir de l'étape (B)) pour créer des actions de DIU sur [TableNotUsingSnap] afin que vous puissiez gagner en confiance dans cette méthode.
6. Redémarrez l'agent de distribution - Sur le distributeur (push) ou l'abonné (pull)
la source