Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zautomatyzować proces synchronizacji schematu bazy danych programu SQL Server

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:

  1. Uruchom porównanie schematu
  2. Kliknij Porównanie nowego schematu przycisk na pasku narzędzi lub alternatywnie w prawej górnej części strony startowej:
  3. Wźródle i celu zakładka Nowego porównania schematów w oknie wybierz żądane źródłowe i docelowe bazy danych:
  4. W Opcjach , Mapowanie schematuMapowanie tabel zakładki, możesz ustawić niezbędne opcje porównania i synchronizacji:
  5. Gdy wszystko jest skonfigurowane, możesz nacisnąć Porównaj w prawym dolnym rogu, aby rozpocząć proces porównania.
  6. 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:
  7. 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.
  8. Po zapisaniu projektu kliknij przycisk „Synchronizuj obiekty ' przycisk:
  9. Kreator synchronizacji schematów będzie otwarte. Najpierw wybierz „Wykonaj skrypt bezpośrednio w docelowej bazie danych ‘ w Wyniku patka:
  10. Możesz wybrać niezbędne ustawienia w Opcjach patka:
  11. Możesz sprawdzić wszystkie obiekty, które będą synchronizowane w Podsumowaniu patka:
  12. Kliknij Synchronizuj w prawym dolnym rogu, aby przetestować proces synchronizacji.
  13. 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:

  1. Wykryto zmiany schematu, kod powrotu 0 – Sukces
  2. Nie wykryto zmian w schemacie, kod powrotu 100 – Nie wykryto zmian w schemacie
  3. 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]


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę określić zainstalowane instancje SQL Server i ich wersje?

  2. SQL Server 2017:dostępne funkcje w systemie Linux

  3. Dowiedz się, do której partycji dana wartość zostanie zmapowana w SQL Server (T-SQL)

  4. Czy istnieje funkcja Max w SQL Server, która przyjmuje dwie wartości, takie jak Math.Max ​​w .NET?

  5. Ukryte ulepszenia wydajności i zarządzania w SQL Server 2012/2014