L'objectif
Garder deux bases de données synchronisées est une tâche que nous rencontrons souvent lorsque nous travaillons sur le développement et la maintenance de bases de données SQL. Un cas particulier est celui-ci - les versions d'une base de données présentes sur les environnements de test et de développement doivent être synchronisées de manière cohérente pour s'assurer que les tests s'exécutent sur la version la plus récente. Cela doit être fait en détectant les changements de schéma dans la version de développement d'une base de données, puis en les synchronisant automatiquement avec la version de l'environnement de test sur une base planifiée.
Comment y parvenir
Nous verrons comment la synchronisation automatisée de deux bases de données SQL peut être réalisée en combinant un outil de comparaison de schéma avec des scripts et une planification PowerShell.
Dans l'exemple que nous allons voir, les bases de données seront synchronisées toutes les 15 minutes. Comme nous utilisons un outil de comparaison de schémas, nous pouvons être sûrs que la base de données ne sera mise à jour que s'il y a des changements réels entre les versions de développement et de test de la base de données - cela évite l'exécution d'opérations inutiles gourmandes en ressources.
Nous utiliserons Devart Schema Compare comme utilitaire de choix pour différencier et synchroniser les bases de données SQL Server. C'est un outil qui vous permet de comparer et de synchroniser les bases de données, les instantanés et les sauvegardes SQL Server en direct. Voyons comment nous pouvons mettre en œuvre notre projet ci-dessous.
Configuration
Tout d'abord, nous devrons configurer certaines choses :
- Exécuter la comparaison de schémas
- Cliquez sur ‘Nouvelle comparaison de schémas ‘ dans la barre d'outils ou, alternativement, dans la partie supérieure droite de la page de démarrage :
- Dans la source et la cible de l'onglet Nouvelle comparaison de schémas fenêtre, choisissez les bases de données source et cible souhaitées :
- Dans les Options , Mappage de schéma , et Mappage des tables onglets, vous pouvez configurer les options de comparaison et de synchronisation nécessaires :
- Lorsque tout est configuré, vous pouvez appuyer sur ‘Comparer ‘ dans le coin inférieur droit pour démarrer le processus de comparaison.
- Lorsque la comparaison est terminée, vous pouvez voir tous les objets qui ont été comparés et leur statut de différence respectif dans la partie supérieure de la fenêtre, tandis que le script détaillé pour chacun de ces objets sera situé en bas :
- Cochez tous les objets pour les inclure dans le processus de synchronisation et cliquez sur ‘Enregistrer ‘ ou appuyez sur Fichier> Enregistrer :Cela enregistrera le projet avec toutes les informations dont nous avons besoin pour démarrer le processus de synchronisation.
- Une fois le projet enregistré, cliquez sur "Synchroniser les objets ' bouton:
- Assistant de synchronisation de schéma sera ouvert. Tout d'abord, sélectionnez "Exécuter le script directement sur la base de données cible ' dans la sortie languette:
- Vous pouvez choisir les paramètres nécessaires dans les Options languette:
- Vous pouvez vérifier tous les objets qui vont être synchronisés dans le Résumé languette:
- Cliquez sur ‘Synchroniser ‘ dans le coin inférieur droit pour tester le processus de synchronisation.
- Vous verrez les résultats affichés dans le volet inférieur de la fenêtre :
Automatiser le processus
Comme la synchronisation du schéma a réussi et maintenant que nous avons un fichier de projet avec toutes les informations nécessaires, automatisons le processus de synchronisation en utilisant un script PowerShell.
Dans l'exemple suivant, on suppose que vous utilisez la sécurité intégrée, mais la base de données stockée et chiffrée est toujours facilement accessible à partir du fichier de projet, ainsi que les informations d'identification du référentiel.
Nous examinerons certaines parties du processus de création de script qui peuvent être particulièrement intéressantes, mais n'hésitez pas à ignorer cette section pour télécharger et tester immédiatement le script fini.
Créer un scénario
Tout d'abord, nous devrons créer une fonction qui vérifie si le dossier Outputs existe. Le but de ce dossier est de stocker des résumés de validation horodatés. La fonction devrait ressembler à ceci :
#check if the Outputs folder exists function CheckAndCreateFolder($rootFolder, [switch]$Outputs) { $location = $rootFolder #setting up its location if($Outputs -eq $true) { $location += "\Outputs" } #creating the folder if it doesn't currently exist if(-not (Test-Path $location)) { mkdir $location -Force:$true -Confirm:$false | Out-Null } return $location }
Ensuite, nous définirons le dossier racine et l'emplacement des résumés de sortie de schéma :
#defining the root folder for the synchronization process $rootFolder = "d:\temp\SchemaSync" #defining the location of schema output summaries $outsLoc = CheckAndCreateFolder $rootFolder -Outputs
Maintenant, nous devons définir l'emplacement de Schema Compare, la variable d'horodatage et les paramètres de l'application :
#Schema Compare location and the date stamp variable are defined, as well as the tool’s parameters $diffLoc = "C:\Program Files\Devart\dbForge Studio for SQL Server\dbforgesql.com" $stamp = (Get-Date -Format "Mmddyyyy_HHMMss")
Une fois cela en place, nous pouvons définir le chemin d'accès au fichier journal de sortie :
#output log file path $logPath = "$outsLoc\SchemaOutput_$stamp.txt" $Params = "/schemacompare /compfile:""D:\temp\SchemaSync\Project\AdventureWorksLTDvsAdventureWorksDW.scomp"" /log:""$logPath""" $sync = " /sync"
Ensuite, nous appellerons Schema Compare et le laisserons exécuter ses paramètres de synchronisation :
#initiate the schema comparison and synchronization process (Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params)) $returnCode = $LASTEXITCODE $message = ""
La dernière partie du script servira à définir tous les résultats possibles :
- Les modifications de schéma sont détectées, code de retour 0 – Réussite
- Aucune modification de schéma détectée, code de retour 100– Aucune modification de schéma détectée
- Une erreur s'est produite et le récapitulatif de sortie va s'ouvrir.
if ($returnCode -notin (100, 101)) { #an error is encountered $logPath = "$outsLoc\SchemaOutput_error.txt" $message >> $logPath clear-content $logPath $message = "`r`n $returnCode - An error is encountered" #output file is opened when an error is encountered Invoke-Item "$logPath" } else{ if ($returnCode -eq 101) { clear-content $logPath (Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params+$sync)) $returnCode = $LASTEXITCODE #schema changes are detected } if($returnCode -eq 0) { $message = "`r`n $returnCode - Schema changes were successfully synchronized" } else { #there are no schema changes if($returnCode -eq 100) { $message = "`r`n $returnCode - There are no schema changes. Job aborted" } } } $message >> $logPath
Planification
Avec le script PowerShell prêt et le processus automatisé, nous pouvons planifier cela de différentes manières, par ex. via le planificateur Windows.
Affichage des résultats
Maintenant que la tâche planifiée est opérationnelle, vous pouvez afficher les résumés de sortie du schéma à tout moment. Dans l'exemple que nous venons de voir, la variable $outsLoc définit l'emplacement des résumés de sortie du schéma. Par conséquent, ces résumés seront enregistrés dans $rootFolder\$outsLoc - dans ce cas particulier, SchemaSync\Outputs :
Si une erreur est rencontrée, par ex. l'extension d'un fichier de projet est saisie de manière incorrecte, le message d'erreur correspondant s'affichera dans le résumé de sortie.
La liste des codes d'erreur de retour nous aidera à mieux comprendre l'erreur spécifique que nous avons rencontrée.
[expand title =»SCRIPT COMPLET “]
#check if the Outputs folder exists function CheckAndCreateFolder($rootFolder, [switch]$Outputs) { $location = $rootFolder #setting up its location if($Outputs -eq $true) { $location += "\Outputs" } #creating the folder if it doesn't currently exist if(-not (Test-Path $location)) { mkdir $location -Force:$true -Confirm:$false | Out-Null } return $location } #defining the root folder for the synchronization process $rootFolder = "d:\temp\SchemaSync" #defining the location of schema output summaries $outsLoc = CheckAndCreateFolder $rootFolder -Outputs #Schema Compare location and the date stamp variable are defined, as well as the tool’s parameters $diffLoc = "C:\Program Files\Devart\dbForge Studio for SQL Server\dbforgesql.com" $stamp = (Get-Date -Format "Mmddyyyy_HHMMss") #output log file path $logPath = "$outsLoc\SchemaOutput_$stamp.txt" $Params = "/schemacompare /compfile:""D:\temp\SchemaSync\Project\AdventureWorksLTDvsAdventureWorksDW.scomp"" /log:""$logPath""" $sync = " /sync" #initiate the schema comparison and synchronization process (Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params)) $returnCode = $LASTEXITCODE $message = "" if ($returnCode -notin (100, 101)) { #an error is encountered $logPath = "$outsLoc\SchemaOutput_error.txt" $message >> $logPath clear-content $logPath $message = "`r`n $returnCode - An error is encountered" #output file is opened when an error is encountered Invoke-Item "$logPath" } else{ if ($returnCode -eq 101) { clear-content $logPath (Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params+$sync)) $returnCode = $LASTEXITCODE #schema changes are detected } if($returnCode -eq 0) { $message = "`r`n $returnCode - Schema changes were successfully synchronized" } else { #there are no schema changes if($returnCode -eq 100) { $message = "`r`n $returnCode - There are no schema changes. Job aborted" } } } $message >> $logPath
[/expand]
Si des questions ou des problèmes surviennent pendant le processus de configuration, n'hésitez pas à nous contacter à tout moment à [email protected]