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 example@sqldat.comm