Tujuan
Menjaga dua database tetap sinkron adalah tugas yang sering kita temui saat mengerjakan pengembangan dan pemeliharaan database SQL. Satu kasus khusus adalah ini – versi database yang ada pada lingkungan pengujian dan pengembangan perlu disinkronkan secara konsisten untuk memastikan bahwa pengujian berjalan pada versi terbaru. Ini harus dilakukan dengan mendeteksi perubahan skema dalam versi pengembangan database dan kemudian secara otomatis menyinkronkannya dengan versi dari lingkungan pengujian secara terjadwal.
Cara mencapainya
Kita akan melihat bagaimana sinkronisasi otomatis dua database SQL dapat dicapai dengan menggabungkan alat perbandingan skema dengan skrip dan penjadwalan PowerShell.
Dalam contoh yang akan kita lihat, database akan disinkronkan setiap 15 menit. Karena kami menggunakan alat perbandingan skema, kami dapat yakin bahwa basis data hanya akan diperbarui jika ada beberapa perubahan aktual antara versi pengembangan dan pengujian basis data – ini mencegah eksekusi operasi yang membutuhkan banyak sumber daya yang tidak perlu.
Kami akan menggunakan Perbandingan Skema Devart sebagai utilitas pilihan untuk membedakan dan menyinkronkan database SQL Server. Ini adalah alat yang memungkinkan Anda untuk membandingkan dan menyinkronkan database SQL Server langsung, snapshot, dan cadangan. Mari kita lihat bagaimana kita dapat mengimplementasikan proyek kita di bawah ini.
Penyiapan
Pertama-tama, kita perlu menyiapkan beberapa hal:
- Jalankan Perbandingan Skema
- Klik ‘Perbandingan Skema Baru ‘ pada bilah alat atau, sebagai alternatif, di bagian kanan atas halaman awal:
- Di Sumber dan Target tab Perbandingan Skema Baru jendela, pilih sumber dan target database yang diinginkan:
- Dalam Opsi , Pemetaan Skema , dan Pemetaan Tabel tab, Anda dapat mengatur opsi perbandingan dan sinkronisasi yang diperlukan:
- Saat semuanya sudah diatur, Anda dapat menekan tombol ‘Bandingkan ‘ tombol di pojok kanan bawah untuk memulai proses perbandingan.
- Setelah perbandingan selesai, Anda dapat melihat semua objek yang telah dibandingkan dan status perbedaannya masing-masing di bagian atas jendela, sedangkan skrip detail untuk masing-masing objek tersebut akan terletak di bagian bawah:
- Centang semua objek untuk memasukkannya ke dalam proses sinkronisasi dan klik tombol ‘Simpan ‘ atau tekan File> Simpan :Ini akan menyimpan proyek dengan semua informasi yang kita perlukan untuk memulai proses sinkronisasi.
- Setelah proyek disimpan, klik tombol ‘Sinkronkan objek ' tombol:
- Wizard Sinkronisasi Skema akan dibuka. Pertama, pilih ‘Jalankan skrip secara langsung terhadap database target ' di Keluaran tab:
- Anda dapat memilih setelan yang diperlukan di Opsi tab:
- Anda dapat memeriksa semua objek yang akan disinkronkan di Ringkasan tab:
- Klik ‘Sinkronkan ‘ di pojok kanan bawah untuk menguji proses sinkronisasi.
- Anda akan melihat hasil yang ditampilkan di panel bawah jendela:
Mengotomatiskan proses
Karena sinkronisasi skema berhasil dan sekarang kita memiliki file proyek dengan semua info yang diperlukan, mari kita otomatisasi proses sinkronisasi dengan menggunakan skrip PowerShell.
Dalam contoh berikut, diasumsikan bahwa Anda menggunakan keamanan Terintegrasi tetapi database yang disimpan dan dienkripsi masih dapat diakses dengan mudah dari file proyek, bersama dengan kredensial repositori.
Kita akan melihat beberapa bagian dari proses pembuatan skrip yang mungkin sangat menarik, tetapi silakan lewati bagian ini untuk mengunduh dan menguji skrip yang sudah selesai segera.
Membuat skrip
Pertama, kita perlu membuat fungsi yang memeriksa apakah folder Output ada. Tujuan folder ini adalah untuk menyimpan ringkasan komit yang dicap data. Fungsinya akan terlihat seperti ini:
#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 }
Selanjutnya, kita akan menentukan folder root dan lokasi ringkasan output skema:
#defining the root folder for the synchronization process $rootFolder = "d:\temp\SchemaSync" #defining the location of schema output summaries $outsLoc = CheckAndCreateFolder $rootFolder -Outputs
Sekarang, kita perlu menentukan lokasi Perbandingan Skema, variabel cap tanggal, dan parameter aplikasi:
#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")
Dengan ini, kita dapat mengatur jalur ke file log keluaran:
#output log file path $logPath = "$outsLoc\SchemaOutput_$stamp.txt" $Params = "/schemacompare /compfile:""D:\temp\SchemaSync\Project\AdventureWorksLTDvsAdventureWorksDW.scomp"" /log:""$logPath""" $sync = " /sync"
Selanjutnya, kami akan memanggil Perbandingan Skema dan membiarkannya menjalankan parameter sinkronisasinya:
#initiate the schema comparison and synchronization process (Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params)) $returnCode = $LASTEXITCODE $message = ""
Bagian akhir skrip akan berfungsi untuk menentukan semua kemungkinan hasil:
- Perubahan skema terdeteksi, kembalikan kode 0 – Berhasil
- Tidak ada perubahan skema yang terdeteksi, kembalikan kode 100– Tidak ada perubahan skema yang terdeteksi
- Terjadi kesalahan dan ringkasan keluaran akan dibuka.
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
Penjadwalan
Dengan skrip PowerShell yang siap dan prosesnya otomatis, kami dapat menjadwalkannya dengan beberapa cara berbeda, mis. melalui Penjadwal Windows.
Melihat hasil
Sekarang setelah pekerjaan terjadwal aktif dan berjalan, Anda dapat melihat ringkasan keluaran skema kapan saja Anda butuhkan. Dalam contoh yang baru saja kita lihat, variabel $outsLoc mendefinisikan lokasi ringkasan output skema. Akibatnya, ringkasan tersebut akan disimpan ke $rootFolder\$outsLoc – dalam kasus khusus ini, SchemaSync\Outputs:
Jika ada kesalahan, mis. ekstensi file proyek salah dimasukkan, pesan kesalahan yang sesuai akan ditampilkan dalam ringkasan output.
Daftar kode kesalahan pengembalian akan membantu kami untuk lebih memahami kesalahan spesifik yang kami temui.
[expand title =”SKRIP LENGKAP “]
#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]
Jika ada pertanyaan atau masalah yang muncul selama proses pengaturan ini, jangan ragu untuk menghubungi kami kapan saja di [email protected]