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:
- Spusťte porovnání schématu
- Klikněte na ‘Porovnání nového schématu ‘ tlačítko na panelu nástrojů nebo alternativně v pravé horní části úvodní stránky:
- V Zdroj a Cíl kartě Nové srovnání schématu v okně vyberte požadovanou zdrojovou a cílovou databázi:
- V nabídce Možnosti , Mapování schématu a Mapování tabulky kartách, můžete nastavit potřebné možnosti porovnání a synchronizace:
- 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í.
- 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:
- 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.
- Jakmile je projekt uložen, klikněte na tlačítko Synchronizovat objekty ' knoflík:
- Průvodce synchronizací schématu bude otevřena. Nejprve vyberte ‘Spustit skript přímo v cílové databázi “ v části Výstup karta:
- Potřebná nastavení můžete vybrat v části Možnosti karta:
- Všechny objekty, které se budou synchronizovat, můžete zkontrolovat v Souhrnu karta:
- Klikněte na ‘Synchronizovat ‘ v pravém dolním rohu a otestujte proces synchronizace.
- 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ů:
- Byly zjištěny změny schématu, návratový kód 0 – Úspěch
- Nebyly zjištěny žádné změny schématu, návratový kód 100 – Nebyly zjištěny žádné změny schématu
- 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]