Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да автоматизирате процеса на синхронизиране на схемата на база данни на SQL Server

Целта

Поддържането на две бази данни в синхрон е задача, която често срещаме, когато работим по разработването и поддръжката на SQL база данни. Един конкретен случай е следният – версиите на база данни, присъстващи в средата за тестване и разработка, трябва да бъдат последователно синхронизирани, за да се гарантира, че тестовете се изпълняват в най-новата версия. Това трябва да стане чрез откриване на промени в схемата във версията за разработка на база данни и след това автоматичното им синхронизиране с версията от средата за тестване по график.

Как да го постигнем

Ще разгледаме как може да се постигне автоматизирана синхронизация на две SQL бази данни чрез комбиниране на инструмент за сравнение на схеми със скриптове на PowerShell и планиране.

В примера, който ще видим, базите данни ще се синхронизират на всеки 15 минути. Тъй като използваме инструмент за сравнение на схеми, можем да сме сигурни, че базата данни ще бъде актуализирана само ако има някои действителни промени между версиите за разработка и тестване на базата данни – това предотвратява изпълнението на ненужни операции с тежки ресурси.

Ще използваме Devart Schema Compare като помощна програма по избор за разлика и синхронизиране на бази данни на SQL Server. Това е инструмент, който ви позволява да сравнявате и синхронизирате живи бази данни на SQL Server, моментни снимки и архиви. Нека разгледаме как можем да приложим нашия проект по-долу.

Настройка

На първо място, ще трябва да настроим някои неща:

  1. Изпълнете Сравнение на схеми
  2. Щракнете върху Ново сравнение на схеми бутон в лентата с инструменти или алтернативно в горната дясна част на началната страница:
  3. В Източник и цел раздел на Ново сравнение на схеми прозорец, изберете желаната изходна и целева база данни:
  4. В Опции , Картографиране на схема и Картографиране на таблици раздели, можете да настроите необходимите опции за сравнение и синхронизация:
  5. Когато всичко е настроено, можете да натиснете Сравнение бутон в долния десен ъгъл, за да стартирате процеса на сравнение.
  6. Когато сравнението приключи, можете да видите всички сравнени обекти и съответното им състояние на разликата в горната част на прозореца, докато подробният скрипт за всеки от тези обекти ще се намира в долната част:
  7. Отметнете всички обекти, за да ги включите в процеса на синхронизиране и щракнете върху Запазване или натиснете Файл> Запазване :Това ще запази проекта с цялата информация, която ни е необходима, за да започнем процеса на синхронизиране.
  8. След като проектът бъде запазен, щракнете върху „Синхронизиране на обекти бутон ‘:
  9. Съветник за синхронизиране на схема ще бъде отворен. Първо изберете „Изпълнете скрипта директно срещу целевата база данни ‘ в Изход раздел:
  10. Можете да изберете необходимите настройки в Опции раздел:
  11. Можете да проверите всички обекти, които ще бъдат синхронизирани в Резюме раздел:
  12. Щракнете върху Синхронизиране в долния десен ъгъл, за да тествате процеса на синхронизиране.
  13. Ще видите резултатите, показани в долния панел на прозореца:

Автоматизиране на процеса

Тъй като синхронизирането на схемата беше успешно и сега, когато имаме проектен файл с цялата необходима информация, нека автоматизираме процеса на синхронизиране с помощта на скрипт на PowerShell.

В следващия пример се предполага, че използвате интегрирана защита, но съхранената и криптирана база данни все още може да бъде лесно достъпна от файла на проекта, заедно с идентификационните данни на хранилището.

Ще разгледаме някои части от процеса на създаване на скрипт, които може да са особено интересни, но не се колебайте да пропуснете този раздел, за да изтеглите и тествате готовия скрипт веднага.

Създаване на скрипт

Първо, ще трябва да създадем функция, която проверява дали папката Outputs съществува. Целта на тази папка е да съхранява обобщения за ангажименти с щамповани данни. Функцията трябва да изглежда така:

#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, променливата на датата и параметрите на приложението:

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

След това ще извикаме Schema Compare и ще го оставим да изпълни своите параметри за синхронизация:

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

$message = ""

Последната част на скрипта ще служи за дефиниране на всички възможни резултати:

  1. Открити са промени в схемата, връщане на код 0 – успех
  2. Не са открити промени в схемата, код за връщане 100 – Не са открити промени в схемата
  3. Възникна грешка и изходното обобщение ще бъде отворено.
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

График

С готовия скрипт PowerShell и автоматизиран процес, можем да планираме това по няколко различни начина, напр. чрез Windows Scheduler.

Преглед на резултатите

Сега, когато планираното задание е готово и работи, можете да преглеждате изходните обобщения на схемата по всяко време, когато имате нужда. В примера, който току-що видяхме, променливата $outsLoc дефинира местоположението на изходните обобщения на схемата. В резултат на това такива обобщения ще бъдат запазени в $rootFolder\$outsLoc – в този конкретен случай, SchemaSync\Outputs:

Ако се открие някаква грешка, напр. разширението на файл на проекта е въведено неправилно, съответното съобщение за грешка ще се покаже в обобщението на изхода.

Списъкът с кодове за грешки при връщане ще ни помогне да разберем по-добре конкретната грешка, която срещнахме.

[expand title =”ПЪЛЕН СКРИПТ “]

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

Ако възникнат въпроси или проблеми по време на процеса на настройка, не се колебайте да се свържете с нас по всяко време на [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. Entity Framework Code Първо със синоними на SQL Server

  2. JSON_VALUE() Примери в SQL Server (T-SQL)

  3. Преобразувайте „datetime2“ в „datetime“ в SQL Server (T-SQL примери)

  4. Адаптивният сървър не е наличен или не съществува грешка при свързване към SQL Server от PHP

  5. SQL NVARCHAR и VARCHAR граници