Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách tự động hóa quy trình đồng bộ hóa lược đồ cơ sở dữ liệu SQL Server

Mục tiêu

Giữ đồng bộ hai cơ sở dữ liệu là một nhiệm vụ chúng ta thường gặp khi làm việc về phát triển và bảo trì cơ sở dữ liệu SQL. Một trường hợp cụ thể là điều này - các phiên bản của cơ sở dữ liệu có trên môi trường thử nghiệm và phát triển cần được đồng bộ hóa nhất quán để đảm bảo rằng các thử nghiệm đang chạy trên phiên bản mới nhất. Điều này nên được thực hiện bằng cách phát hiện các thay đổi lược đồ trong phiên bản phát triển của cơ sở dữ liệu và sau đó tự động đồng bộ hóa chúng với phiên bản từ môi trường thử nghiệm theo lịch trình.

Làm thế nào để đạt được nó

Chúng ta sẽ xem xét cách thức đồng bộ hóa tự động hai cơ sở dữ liệu SQL có thể đạt được bằng cách kết hợp công cụ so sánh giản đồ với lập lịch và tập lệnh PowerShell.

Trong ví dụ mà chúng ta sẽ thấy, các cơ sở dữ liệu sẽ được đồng bộ hóa sau mỗi 15 phút. Vì chúng tôi đang sử dụng công cụ so sánh giản đồ, chúng tôi có thể chắc chắn rằng cơ sở dữ liệu sẽ chỉ được cập nhật nếu có một số thay đổi thực tế giữa phiên bản phát triển và thử nghiệm của cơ sở dữ liệu - điều này ngăn cản việc thực thi các hoạt động tốn nhiều tài nguyên không cần thiết.

Chúng tôi sẽ sử dụng Devart Schema Compare làm tiện ích được lựa chọn để khác biệt và đồng bộ hóa cơ sở dữ liệu SQL Server. Đây là một công cụ cho phép bạn so sánh và đồng bộ hóa cơ sở dữ liệu SQL Server trực tiếp, ảnh chụp nhanh và sao lưu. Hãy xem cách chúng tôi có thể triển khai dự án của mình bên dưới.

Thiết lập

Trước hết, chúng ta cần thiết lập một số thứ:

  1. Chạy So sánh lược đồ
  2. Nhấp vào So sánh Lược đồ Mới trên thanh công cụ hoặc, cách khác, ở phần trên cùng bên phải của trang bắt đầu:
  3. Trong Nguồn và Mục tiêu tab So sánh giản đồ mới cửa sổ, chọn cơ sở dữ liệu nguồn và đích mong muốn:
  4. Trong Tùy chọn , Ánh xạ giản đồ Lập bản đồ bảng , bạn có thể thiết lập các tùy chọn so sánh và đồng bộ hóa cần thiết:
  5. Khi mọi thứ được thiết lập, bạn có thể nhấn vào nút So sánh ở góc dưới cùng bên phải để bắt đầu quá trình so sánh.
  6. Khi quá trình so sánh kết thúc, bạn có thể thấy tất cả các đối tượng đã được so sánh và trạng thái khác biệt tương ứng của chúng ở phần trên cùng của cửa sổ, trong khi tập lệnh chi tiết cho từng đối tượng đó sẽ nằm ở dưới cùng:
  7. Kiểm tra tất cả các đối tượng để đưa chúng vào quá trình đồng bộ hóa và nhấp vào nút Lưu hoặc nhấn Tệp> Lưu : Thao tác này sẽ lưu dự án với tất cả thông tin chúng ta cần để bắt đầu quá trình đồng bộ hóa.
  8. Sau khi dự án được lưu, hãy nhấp vào nút ‘ Đồng bộ hóa các đối tượng ' cái nút:
  9. Trình hướng dẫn Đồng bộ hóa Lược đồ sẽ được mở ra. Đầu tiên, chọn ‘ Thực thi tập lệnh trực tiếp trên cơ sở dữ liệu đích ‘Trong Đầu ra chuyển hướng:
  10. Bạn có thể chọn các cài đặt cần thiết trong Tùy chọn chuyển hướng:
  11. Bạn có thể kiểm tra tất cả các đối tượng sẽ được đồng bộ hóa trong Tóm tắt chuyển hướng:
  12. Nhấp vào Đồng bộ hoá ở góc dưới cùng bên phải để kiểm tra quá trình đồng bộ hóa.
  13. Bạn sẽ thấy kết quả được hiển thị trong ngăn dưới cùng của cửa sổ:

Tự động hóa quy trình

Vì đồng bộ hóa giản đồ đã thành công và bây giờ chúng ta có tệp dự án với tất cả thông tin cần thiết, hãy tự động hóa quá trình đồng bộ hóa bằng cách sử dụng tập lệnh PowerShell.

Trong ví dụ sau, giả sử rằng bạn sử dụng Bảo mật tích hợp nhưng cơ sở dữ liệu được lưu trữ và mã hóa vẫn có thể dễ dàng truy cập từ tệp dự án, cùng với thông tin đăng nhập kho lưu trữ.

Chúng ta sẽ xem xét một số phần của quy trình tạo tập lệnh có thể đặc biệt thú vị, nhưng vui lòng bỏ qua phần này để tải xuống và kiểm tra tập lệnh hoàn chỉnh ngay lập tức.

Tạo tập lệnh

Trước tiên, chúng ta sẽ cần tạo một hàm kiểm tra xem thư mục Kết quả có tồn tại hay không. Mục đích của thư mục này là lưu trữ các bản tóm tắt cam kết có đóng dấu dữ liệu. Hàm sẽ giống như sau:

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

Tiếp theo, chúng tôi sẽ xác định thư mục gốc và vị trí của các bản tóm tắt đầu ra giản đồ:

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

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

Bây giờ, chúng ta sẽ cần xác định vị trí của Schema Compare, biến dấu ngày tháng và các thông số của ứng dụng:

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

Với điều này tại chỗ, chúng tôi có thể đặt đường dẫn đến tệp nhật ký đầu ra:

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

Tiếp theo, chúng tôi sẽ gọi Schema Compare và để nó thực thi các tham số đồng bộ hóa:

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

$message = ""

Phần cuối cùng của tập lệnh sẽ dùng để xác định tất cả các kết quả có thể xảy ra:

  1. Các thay đổi giản đồ được phát hiện, trả về mã 0 - Thành công
  2. Không phát hiện thấy thay đổi giản đồ nào, trả về mã 100– Không phát hiện thấy thay đổi giản đồ nào
  3. Đã xảy ra lỗi và bản tóm tắt đầu ra sẽ được mở.
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

Lập lịch

Với tập lệnh PowerShell đã sẵn sàng và quá trình tự động hóa, chúng tôi có thể lập lịch trình này theo một vài cách khác nhau, ví dụ:thông qua Bộ lập lịch của Windows.

Xem kết quả

Bây giờ công việc đã lên lịch đã bắt đầu và đang chạy, bạn có thể xem tóm tắt kết quả đầu ra của lược đồ bất cứ lúc nào bạn cần. Trong ví dụ mà chúng ta vừa thấy, biến $ outsLoc đã xác định vị trí của các bản tóm tắt đầu ra của lược đồ. Do đó, các bản tóm tắt như vậy sẽ được lưu vào $ rootFolder \ $ outsLoc - trong trường hợp cụ thể này là SchemaSync \ Outputs:

Nếu gặp bất kỳ lỗi nào, ví dụ:phần mở rộng của tệp dự án được nhập không chính xác, thông báo lỗi tương ứng sẽ được hiển thị trong phần tóm tắt đầu ra.

Danh sách các mã lỗi trả lại sẽ giúp chúng tôi hiểu rõ hơn về lỗi cụ thể mà chúng tôi gặp phải.

[expand title =” FULL 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

[/ mở rộng]

Nếu có bất kỳ câu hỏi hoặc vấn đề nào phát sinh trong quá trình thiết lập này, vui lòng liên hệ với chúng tôi bất cứ lúc nào tại [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. Sử dụng SQL Server trong một giao dịch XA được phân phối

  2. Tạo mặt nạ dữ liệu động trong SQL Server cho người mới bắt đầu

  3. Làm cách nào để đặt chuỗi kết nối theo chương trình cho Entity-Framework Code-First?

  4. Cách trả lại các khóa trùng lặp từ tài liệu JSON trong SQL Server

  5. Phát hiện các phạm vi ngày liên tiếp bằng SQL