sql >> Databáze >  >> RDS >> Sqlserver

Jak automatizovat proces synchronizace schématu databáze SQL Server

Cíl

Udržování synchronizace dvou databází je úkol, se kterým se často setkáváme při práci na vývoji a údržbě SQL databáze. Jeden konkrétní případ je tento – verze databáze přítomné v testovacích a vývojových prostředích musí být konzistentně synchronizovány, aby bylo zajištěno, že testy běží na nejnovější verzi. To by mělo být provedeno detekcí změn schématu ve vývojové verzi databáze a jejich automatickou synchronizací s verzí z testovacího prostředí na plánovaném základě.

Jak toho dosáhnout

Podíváme se, jak lze dosáhnout automatizované synchronizace dvou databází SQL kombinací nástroje pro porovnávání schémat se skripty PowerShell a plánováním.

V příkladu, který uvidíme, budou databáze synchronizovány každých 15 minut. Protože používáme nástroj pro porovnávání schémat, můžeme si být jisti, že databáze bude aktualizována pouze v případě, že dojde k nějakým skutečným změnám mezi vývojovou a testovací verzí databáze – to zabraňuje provádění zbytečných operací náročných na zdroje.

Použijeme Devart Schema Compare jako nástroj volby k porovnání a synchronizaci databází SQL Server. Je to nástroj, který vám umožňuje porovnávat a synchronizovat živé databáze SQL Server, snímky a zálohy. Níže se podíváme na to, jak můžeme náš projekt implementovat.

Nastavení

Nejprve musíme nastavit některé věci:

  1. Spusťte porovnání schématu
  2. Klikněte na Porovnání nového schématu tlačítko na panelu nástrojů nebo alternativně v pravé horní části úvodní stránky:
  3. V Zdroj a Cíl kartě Nové srovnání schématu v okně vyberte požadovanou zdrojovou a cílovou databázi:
  4. V nabídce Možnosti , Mapování schématuMapování tabulky kartách, můžete nastavit potřebné možnosti porovnání a synchronizace:
  5. Když je vše nastaveno, můžete stisknout tlačítko Porovnat tlačítko v pravém dolním rohu pro zahájení procesu porovnání.
  6. Po dokončení porovnání můžete v horní části okna vidět všechny objekty, které byly porovnány, a jejich příslušný rozdílový stav, zatímco podrobný skript pro každý z těchto objektů bude umístěn ve spodní části:
  7. Zaškrtněte všechny objekty, abyste je zahrnuli do procesu synchronizace, a klikněte na tlačítko Uložit nebo stiskněte Soubor> Uložit :Tímto se uloží projekt se všemi informacemi, které potřebujeme k zahájení procesu synchronizace.
  8. Jakmile je projekt uložen, klikněte na tlačítko Synchronizovat objekty ' knoflík:
  9. Průvodce synchronizací schématu bude otevřena. Nejprve vyberte ‘Spustit skript přímo v cílové databázi “ v části Výstup karta:
  10. Potřebná nastavení můžete vybrat v části Možnosti karta:
  11. Všechny objekty, které se budou synchronizovat, můžete zkontrolovat v Souhrnu karta:
  12. Klikněte na Synchronizovat v pravém dolním rohu a otestujte proces synchronizace.
  13. Výsledky se zobrazí ve spodní části okna:

Automatizace procesu

Protože synchronizace schématu byla úspěšná a nyní, když máme soubor projektu se všemi potřebnými informacemi, zautomatizujme proces synchronizace pomocí skriptu PowerShell.

V následujícím příkladu se předpokládá, že používáte integrované zabezpečení, ale uložená a šifrovaná databáze je stále snadno přístupná ze souboru projektu spolu s přihlašovacími údaji úložiště.

Podíváme se na některé části procesu vytváření skriptu, které mohou být obzvláště zajímavé, ale tuto část můžete přeskočit a hotový skript si ihned stáhnout a otestovat.

Vytvoření skriptu

Nejprve musíme vytvořit funkci, která zkontroluje, zda složka Výstupy existuje. Účelem této složky je ukládat souhrny odevzdání s datovými razítky. Funkce by měla vypadat takto:

#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
}

Dále definujeme kořenovou složku a umístění výstupních souhrnů schémat:

#defining the root folder for the synchronization process
$rootFolder = "d:\temp\SchemaSync"

#defining the location of schema output summaries 
$outsLoc = CheckAndCreateFolder $rootFolder -Outputs

Nyní budeme muset definovat umístění Schema Compare, proměnnou datumového razítka a parametry aplikace:

#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")

S tímto na místě můžeme nastavit cestu k výstupnímu souboru protokolu:

#output log file path
$logPath = "$outsLoc\SchemaOutput_$stamp.txt"
$Params = "/schemacompare /compfile:""D:\temp\SchemaSync\Project\AdventureWorksLTDvsAdventureWorksDW.scomp"" /log:""$logPath"""
$sync = " /sync"

Dále zavoláme Schema Compare a necháme jej provést jeho parametry synchronizace:

#initiate the schema comparison and synchronization process
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params))
$returnCode = $LASTEXITCODE

$message = ""

Závěrečná část skriptu bude sloužit k definování všech možných výsledků:

  1. Byly zjištěny změny schématu, návratový kód 0 – Úspěch
  2. Nebyly zjištěny žádné změny schématu, návratový kód 100 – Nebyly zjištěny žádné změny schématu
  3. Došlo k chybě a otevře se souhrn výstupu.
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

Plánování

S připraveným skriptem PowerShell a automatizovaným procesem to můžeme naplánovat několika různými způsoby, např. prostřednictvím Plánovače systému Windows.

Zobrazení výsledků

Nyní, když je naplánovaná úloha spuštěna a spuštěna, můžete kdykoli zobrazit souhrny výstupu schémat. V příkladu, který jsme právě viděli, proměnná $outsLoc definovala umístění souhrnů výstupu schématu. V důsledku toho budou taková shrnutí uložena do $rootFolder\$outsLoc – v tomto konkrétním případě SchemaSync\Outputs:

Pokud dojde k nějaké chybě, např. je nesprávně zadaná přípona souboru projektu, v souhrnu výstupu se zobrazí odpovídající chybová zpráva.

Seznam návratových chybových kódů nám pomůže lépe porozumět konkrétní chybě, na kterou jsme narazili.

[rozbalit název =”CELÝ SCRIPT “]

#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]

Pokud se během procesu nastavování vyskytnou nějaké otázky nebo problémy, neváhejte nás kdykoli kontaktovat na adrese [email protected]


  1. SQL:Opakujte řádek s výsledkem několikrát a očíslujte řádky

  2. Jak velká může být databáze MySQL, než začne klesat výkon

  3. Používejte relační databáze MySQL na Debianu 6 (Squeeze)

  4. Typy dat SQLite