Cel
Utrzymywanie synchronizacji dwóch baz danych to zadanie, z którym często spotykamy się podczas pracy nad rozwojem i utrzymaniem bazy danych SQL. Jeden szczególny przypadek jest taki – wersje bazy danych obecne w środowiskach testowych i programistycznych muszą być konsekwentnie synchronizowane, aby upewnić się, że testy działają na najnowszej wersji. Należy to zrobić, wykrywając zmiany schematu w rozwojowej wersji bazy danych, a następnie zgodnie z harmonogramem automatycznie synchronizując je z wersją ze środowiska testowego.
Jak to osiągnąć
Przyjrzymy się, jak można osiągnąć automatyczną synchronizację dwóch baz danych SQL, łącząc narzędzie do porównywania schematów ze skryptami PowerShell i planowaniem.
W przykładzie, który zobaczymy, bazy danych będą synchronizowane co 15 minut. Ponieważ używamy narzędzia do porównywania schematów, możemy być pewni, że baza danych zostanie zaktualizowana tylko w przypadku rzeczywistych zmian między wersją rozwojową i testową bazy danych – zapobiega to wykonywaniu niepotrzebnych operacji obciążających zasoby.
Użyjemy Devart Schema Compare jako narzędzia z wyboru do porównywania i synchronizacji baz danych SQL Server. Jest to narzędzie, które pozwala porównywać i synchronizować działające na żywo bazy danych SQL Server, migawki i kopie zapasowe. Spójrzmy, jak możemy zrealizować nasz projekt poniżej.
Konfiguracja
Przede wszystkim musimy ustawić kilka rzeczy:
- Uruchom porównanie schematu
- Kliknij „Porównanie nowego schematu „ przycisk na pasku narzędzi lub alternatywnie w prawej górnej części strony startowej:
- Wźródle i celu zakładka Nowego porównania schematów w oknie wybierz żądane źródłowe i docelowe bazy danych:
- W Opcjach , Mapowanie schematu i Mapowanie tabel zakładki, możesz ustawić niezbędne opcje porównania i synchronizacji:
- Gdy wszystko jest skonfigurowane, możesz nacisnąć „Porównaj „ w prawym dolnym rogu, aby rozpocząć proces porównania.
- Po zakończeniu porównania w górnej części okna można zobaczyć wszystkie porównywane obiekty i odpowiadający im status różnicy, podczas gdy szczegółowy skrypt dla każdego z tych obiektów będzie znajdował się na dole:
- Zaznacz wszystkie obiekty, aby uwzględnić je w procesie synchronizacji, i kliknij „Zapisz „ lub naciśnij Plik> Zapisz :Spowoduje to zapisanie projektu ze wszystkimi informacjami potrzebnymi do rozpoczęcia procesu synchronizacji.
- Po zapisaniu projektu kliknij przycisk „Synchronizuj obiekty ' przycisk:
- Kreator synchronizacji schematów będzie otwarte. Najpierw wybierz „Wykonaj skrypt bezpośrednio w docelowej bazie danych ‘ w Wyniku patka:
- Możesz wybrać niezbędne ustawienia w Opcjach patka:
- Możesz sprawdzić wszystkie obiekty, które będą synchronizowane w Podsumowaniu patka:
- Kliknij „Synchronizuj „ w prawym dolnym rogu, aby przetestować proces synchronizacji.
- Zobaczysz wyniki wyświetlone w dolnym panelu okna:
Automatyzacja procesu
Ponieważ synchronizacja schematu się powiodła, a teraz, gdy mamy plik projektu ze wszystkimi niezbędnymi informacjami, zautomatyzujmy proces synchronizacji za pomocą skryptu PowerShell.
W poniższym przykładzie założono, że używasz zintegrowanych zabezpieczeń, ale przechowywana i zaszyfrowana baza danych jest nadal łatwo dostępna z pliku projektu, wraz z danymi uwierzytelniającymi repozytorium.
Przyjrzymy się niektórym częściom procesu tworzenia skryptu, które mogą być szczególnie interesujące, ale możesz pominąć tę sekcję, aby od razu pobrać i przetestować gotowy skrypt.
Tworzenie skryptu
Najpierw musimy stworzyć funkcję, która sprawdzi, czy istnieje folder Outputs. Celem tego folderu jest przechowywanie podsumowań zatwierdzenia ze znacznikami danych. Funkcja powinna wyglądać tak:
#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 }
Następnie zdefiniujemy folder główny i lokalizację podsumowań wyjściowych schematu:
#defining the root folder for the synchronization process $rootFolder = "d:\temp\SchemaSync" #defining the location of schema output summaries $outsLoc = CheckAndCreateFolder $rootFolder -Outputs
Teraz musimy zdefiniować lokalizację Schema Compare, zmienną datownika i parametry aplikacji:
#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")
Mając to na miejscu, możemy ustawić ścieżkę do wyjściowego pliku dziennika:
#output log file path $logPath = "$outsLoc\SchemaOutput_$stamp.txt" $Params = "/schemacompare /compfile:""D:\temp\SchemaSync\Project\AdventureWorksLTDvsAdventureWorksDW.scomp"" /log:""$logPath""" $sync = " /sync"
Następnie wywołamy Porównanie schematu i pozwolimy mu wykonać parametry synchronizacji:
#initiate the schema comparison and synchronization process (Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params)) $returnCode = $LASTEXITCODE $message = ""
Ostatnia część skryptu posłuży do zdefiniowania wszystkich możliwych wyników:
- Wykryto zmiany schematu, kod powrotu 0 – Sukces
- Nie wykryto zmian w schemacie, kod powrotu 100 – Nie wykryto zmian w schemacie
- Wystąpił błąd i podsumowanie wyników zostanie otwarte.
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
Planowanie
Mając gotowy skrypt PowerShell i zautomatyzowany proces, możemy to zaplanować na kilka różnych sposobów, m.in. za pomocą Harmonogramu Windows.
Wyświetlanie wyników
Teraz, gdy zaplanowane zadanie jest już uruchomione, możesz wyświetlić podsumowania danych wyjściowych schematu w dowolnym momencie. W przykładzie, który właśnie widzieliśmy, zmienna $outsLoc definiuje lokalizację podsumowań wyjściowych schematu. W rezultacie takie zestawienia zostaną zapisane w $rootFolder\$outsLoc – w tym konkretnym przypadku SchemaSync\Outputs:
Jeśli wystąpi jakikolwiek błąd, np. rozszerzenie pliku projektu jest wprowadzone nieprawidłowo, odpowiedni komunikat o błędzie zostanie wyświetlony w podsumowaniu wyjściowym.
Lista zwracanych kodów błędów pomoże nam lepiej zrozumieć konkretny błąd, który napotkaliśmy.
[rozwiń tytuł ="PEŁNY SKRYPT „]
#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
[/rozwiń]
Jeśli podczas procesu konfiguracji pojawią się jakiekolwiek pytania lub problemy, skontaktuj się z nami w dowolnym momencie pod adresem [email protected]