Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर डेटाबेस स्कीमा सिंक्रनाइज़ेशन की प्रक्रिया को स्वचालित कैसे करें

लक्ष्य

दो डेटाबेस को सिंक में रखना एक ऐसा कार्य है जिसका सामना हम अक्सर SQL डेटाबेस डेवलपमेंट और मेंटेनेंस पर काम करते समय करते हैं। एक विशेष मामला यह है - परीक्षण और विकास वातावरण पर मौजूद डेटाबेस के संस्करणों को यह सुनिश्चित करने के लिए लगातार सिंक्रनाइज़ करने की आवश्यकता है कि परीक्षण नवीनतम संस्करण पर चल रहे हैं। यह एक डेटाबेस के विकास संस्करण में स्कीमा परिवर्तनों का पता लगाकर और फिर उन्हें एक निर्धारित आधार पर परीक्षण वातावरण से संस्करण के साथ स्वचालित रूप से सिंक्रनाइज़ करके किया जाना चाहिए।

इसे कैसे प्राप्त करें

हम देखेंगे कि कैसे PowerShell स्क्रिप्ट और शेड्यूलिंग के साथ स्कीमा तुलना टूल को मिलाकर दो SQL डेटाबेस का स्वचालित सिंक्रनाइज़ेशन प्राप्त किया जा सकता है।

उदाहरण में हम देखने जा रहे हैं, डेटाबेस हर 15 मिनट में सिंक्रनाइज़ किए जाएंगे। जैसा कि हम एक स्कीमा तुलना उपकरण का उपयोग कर रहे हैं, हम यह सुनिश्चित कर सकते हैं कि डेटाबेस केवल तभी अपडेट होगा जब डेटाबेस के विकास और परीक्षण संस्करणों के बीच कुछ वास्तविक परिवर्तन होंगे - यह अनावश्यक संसाधन-भारी संचालन के निष्पादन को रोकता है।

हम SQL सर्वर डेटाबेस को अलग और सिंक्रनाइज़ करने के लिए पसंद की उपयोगिता के रूप में Devart स्कीमा तुलना का उपयोग करेंगे। यह एक उपकरण है जो आपको लाइव SQL सर्वर डेटाबेस, स्नैपशॉट और बैकअप की तुलना और सिंक करने की अनुमति देता है। आइए देखें कि हम नीचे अपनी परियोजना को कैसे लागू कर सकते हैं।

सेटअप

सबसे पहले, हमें कुछ चीज़ें सेट अप करनी होंगी:

  1. स्कीमा तुलना चलाएँ
  2. क्लिक करें नई स्कीमा तुलना ' टूलबार पर बटन या, वैकल्पिक रूप से, प्रारंभ पृष्ठ के ऊपरी दाएँ भाग में:
  3. स्रोत और लक्ष्य में नई स्कीमा तुलना . का टैब विंडो में, वांछित स्रोत और लक्ष्य डेटाबेस चुनें:
  4. विकल्पों . में , स्कीमा मैपिंग , और टेबल मैपिंग टैब, आप आवश्यक तुलना और सिंक्रनाइज़ेशन विकल्प सेट कर सकते हैं:
  5. जब सब कुछ सेट हो जाता है, तो आप तुलना करें . दबा सकते हैं ' तुलना प्रक्रिया शुरू करने के लिए निचले दाएं कोने में स्थित बटन।
  6. जब तुलना समाप्त हो जाती है, तो आप खिड़की के शीर्ष भाग में तुलना की गई सभी वस्तुओं और उनकी संबंधित अंतर स्थिति देख सकते हैं, जबकि उन वस्तुओं में से प्रत्येक के लिए विस्तृत स्क्रिप्ट नीचे स्थित होगी:
  7. सभी ऑब्जेक्ट को सिंक्रोनाइज़ेशन प्रक्रिया में शामिल करने के लिए जांचें और सहेजें पर क्लिक करें ' बटन दबाएं या फ़ाइल> सहेजें . दबाएं :यह परियोजना को उन सभी सूचनाओं के साथ बचाएगा जो हमें सिंक्रनाइज़ेशन प्रक्रिया शुरू करने के लिए चाहिए।
  8. प्रोजेक्ट के सहेजे जाने के बाद, 'ऑब्जेक्ट्स को सिंक्रोनाइज़ करें . पर क्लिक करें ' बटन:
  9. स्कीमा तुल्यकालन विज़ार्ड खोला जाएगा। सबसे पहले, 'लक्षित डेटाबेस के विरुद्ध सीधे स्क्रिप्ट निष्पादित करें . चुनें ' आउटपुट . में टैब:
  10. आप विकल्प . में आवश्यक सेटिंग चुन सकते हैं टैब:
  11. आप उन सभी वस्तुओं की जांच कर सकते हैं जिन्हें सारांश . में सिंक्रोनाइज़ किया जा रहा है टैब:
  12. क्लिक करें सिंक्रनाइज़ करें ' सिंक्रोनाइज़ेशन प्रक्रिया का परीक्षण करने के लिए नीचे-दाएँ कोने में।
  13. आप विंडो के निचले फलक में प्रदर्शित परिणाम देखेंगे:

प्रक्रिया को स्वचालित करना

चूंकि स्कीमा सिंक्रोनाइज़ेशन सफल रहा था और अब जब हमारे पास सभी आवश्यक जानकारी के साथ एक प्रोजेक्ट फ़ाइल है, तो आइए पावरशेल स्क्रिप्ट का उपयोग करके सिंक्रोनाइज़ेशन प्रक्रिया को स्वचालित करें।

निम्नलिखित उदाहरण में, यह माना जाता है कि आप एकीकृत सुरक्षा का उपयोग करते हैं लेकिन संग्रहीत और एन्क्रिप्टेड डेटाबेस को अभी भी प्रोजेक्ट फ़ाइल से रिपॉजिटरी क्रेडेंशियल्स के साथ आसानी से एक्सेस किया जा सकता है।

हम स्क्रिप्ट निर्माण प्रक्रिया के कुछ हिस्सों को देखेंगे जो विशेष रूप से दिलचस्प हो सकते हैं, लेकिन तैयार स्क्रिप्ट को तुरंत डाउनलोड करने और परीक्षण करने के लिए इस अनुभाग को छोड़ने के लिए स्वतंत्र महसूस करें।

एक स्क्रिप्ट बनाना

सबसे पहले, हमें एक फ़ंक्शन बनाना होगा जो यह जांचता है कि आउटपुट फ़ोल्डर मौजूद है या नहीं। इस फ़ोल्डर का उद्देश्य डेटा-मुद्रांकित प्रतिबद्ध सारांशों को संग्रहीत करना है। फ़ंक्शन इस तरह दिखना चाहिए:

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

स्क्रिप्ट का अंतिम भाग सभी संभावित परिणामों को परिभाषित करने का काम करेगा:

  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

शेड्यूलिंग

पावरशेल स्क्रिप्ट तैयार होने और प्रक्रिया स्वचालित होने के साथ, हम इसे कुछ अलग तरीकों से शेड्यूल कर सकते हैं, उदा। विंडोज शेड्यूलर के माध्यम से।

परिणाम देखना

अब जबकि शेड्यूल किया गया कार्य पूरा हो गया है और चल रहा है, आप जब चाहें स्कीमा आउटपुट सारांश देख सकते हैं। उदाहरण में हमने अभी देखा, $outLoc चर ने स्कीमा आउटपुट सारांश के स्थान को परिभाषित किया। परिणामस्वरूप, ऐसे सारांश $rootFolder\$outsLoc में सहेजे जाएंगे - इस विशेष मामले में, SchemaSync\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 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

[/विस्तार]

यदि इसे स्थापित करने की प्रक्रिया के दौरान कोई प्रश्न या समस्या उत्पन्न होती है, तो किसी भी समय हमसे बेझिझक संपर्क करें [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. SQL सर्वर में FORMAT () द्वारा समर्थित कस्टम दिनांक/समय प्रारूप स्ट्रिंग्स

  2. वस्तु को नहीं छोड़ा जा सका क्योंकि यह एक विदेशी कुंजी बाधा द्वारा संदर्भित है - SQL सर्वर / TSQL ट्यूटोरियल भाग 74

  3. SQL सर्वर पर हमेशा उपलब्धता समूहों को कॉन्फ़िगर करना

  4. एक स्थिति के अपवाद के साथ, तालिका में अद्यतनों को कैसे रोकें?

  5. Windows सेवा और SQL सर्वर का उपयोग करके OneWay WCF संदेशों में कतारबद्ध करना