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


  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