Azure SQL Veritabanı'da birden çok veritabanı arasında veri eşitlemek için PowerShell kullanma
Şunlar için geçerlidir: Azure SQL Veritabanı
Önemli
SQL Data Sync 30 Eylül 2027'de kullanımdan kaldırılacaktır. Alternatif veri çoğaltma/eşitleme çözümlerine geçiş yapmayı göz önünde bulundurun.
Bu Azure PowerShell örneği, SQL Data Sync'i Azure SQL Veritabanı'daki birden çok veritabanı arasında veri eşitlemek için yapılandırıyor.
Azure aboneliğiniz yoksa başlamadan önce birücretsiz Azure hesabı oluşturun.
Not
Bu makalede, Azure ile etkileşim için önerilen PowerShell modülü olan Azure Az PowerShell modülü kullanılır. Az PowerShell modülünü kullanmaya başlamak için Azure PowerShell’i yükleyin. Az PowerShell modülüne nasıl geçeceğinizi öğrenmek için bkz. Azure PowerShell’i AzureRM’den Az’ye geçirme.
Azure Cloud Shell kullanma
Azure, tarayıcınız aracılığıyla kullanabileceğiniz etkileşimli bir kabuk ortamı olan Azure Cloud Shell'i barındırıyor. Azure hizmetleriyle çalışmak için Cloud Shell ile Bash veya PowerShell kullanabilirsiniz. Yerel ortamınıza herhangi bir şey yüklemek zorunda kalmadan bu makaledeki kodu çalıştırmak için Cloud Shell önceden yüklenmiş komutlarını kullanabilirsiniz.
Azure Cloud Shell'i başlatmak için:
Seçenek | Örnek/Bağlantı |
---|---|
Kod bloğunun sağ üst köşesindeki Deneyin’i seçin. Deneyin seçildiğinde kod otomatik olarak Cloud Shell'e kopyalanmaz. | |
https://shell.azure.comadresine gidin veya Cloud Shell'i tarayıcınızda açmak için Cloud Shell'i Başlat düğmesini seçin. | |
Azure portalının sağ üst kısmındaki menü çubuğunda Cloud Shell düğmesini seçin. |
Azure Cloud Shell'de bu makaledeki kodu çalıştırmak için:
Cloud Shell'i başlatın.
Kodu kopyalamak için kod bloğundaki Kopyala düğmesini seçin.
Windows ve Linux'ta Ctrl+Shift V'yi seçerek veya macOS üzerinde Cmd+Shift++V'yi seçerek kodu Cloud Shell oturumuna yapıştırın.
Kodu çalıştırmak için Enter'ı seçin.
PowerShell'i yerel olarak yükleyip kullanmayı seçerseniz, bu öğretici için Az PowerShell 1.4.0 veya üzeri gerekir. Yükseltmeniz gerekirse, bkz. Azure PowerShell modülünü yükleme. PowerShell'i yerel olarak çalıştırıyorsanız Azure bağlantısı oluşturmak için Connect-AzAccount
komutunu da çalıştırmanız gerekir.
SQL Data Sync'e genel bakış için bkz. Azure için SQL Data Sync nedir?
SQL Data Sync Azure SQL Yönetilen Örneği veya Azure Synapse Analytics'i desteklemez.
Önkoşullar
- AdventureWorksLT örnek veritabanından merkez veritabanı olarak Azure SQL Veritabanı veritabanı oluşturun.
- Eşitleme veritabanıyla aynı bölgede Azure SQL Veritabanı bir veritabanı oluşturun.
- Örneği çalıştırmadan önce parametre yer tutucularını güncelleştirin.
Örnekler
using namespace Microsoft.Azure.Commands.Sql.DataSync.Model
using namespace System.Collections.Generic
# hub database info
$subscriptionId = "<subscriptionId>"
$resourceGroupName = "<resourceGroupName>"
$serverName = "<serverName>"
$databaseName = "<databaseName>"
# sync database info
$syncDatabaseResourceGroupName = "<syncResourceGroupName>"
$syncDatabaseServerName = "<syncServerName>"
$syncDatabaseName = "<syncDatabaseName>"
# sync group info
$syncGroupName = "<syncGroupName>"
$conflictResolutionPolicy = "HubWin" # can be HubWin or MemberWin
$intervalInSeconds = 300 # sync interval in seconds (must be no less than 300)
# member database info
$syncMemberName = "<syncMemberName>"
$memberServerName = "<memberServerName>"
$memberDatabaseName = "<memberDatabaseName>"
$memberDatabaseType = "SqlServerDatabase" # can be AzureSqlDatabase or SqlServerDatabase
$syncDirection = "Bidirectional" # can be Bidirectional, Onewaymembertohub, Onewayhubtomember
# sync agent info
$syncAgentName = "<agentName>"
$syncAgentResourceGroupName = "<syncAgentResourceGroupName>"
$syncAgentServerName = "<syncAgentServerName>"
$syncMemberResourceId = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Sql/servers/$serverName/databases/$syncMemberDBName"
# temp file to save the sync schema
$tempFile = $env:TEMP+"\syncSchema.json"
# list of included columns and tables in quoted name
$includedColumnsAndTables = "[SalesLT].[Address].[AddressID]",
"[SalesLT].[Address].[AddressLine2]",
"[SalesLT].[Address].[rowguid]",
"[SalesLT].[Address].[PostalCode]",
"[SalesLT].[ProductDescription]"
$metadataList = [System.Collections.ArrayList]::new($includedColumnsAndTables)
Connect-AzAccount
Select-AzSubscription -SubscriptionId $subscriptionId
# use if it's safe to show password in script, otherwise use PromptForCredential
# $user = "username"
# $password = ConvertTo-SecureString -String "password" -AsPlainText -Force
# $credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $user, $password
$credential = $Host.ui.PromptForCredential("Need credential",
"Please enter your user name and password for server "+$serverName+".database.windows.net",
"",
"")
# create a new sync group (if you use private link, make sure to manually approve it)
Write-Host "Creating Sync Group "$syncGroupName"..."
New-AzSqlSyncGroup -ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName -Name $syncGroupName `
-SyncDatabaseName $syncDatabaseName -SyncDatabaseServerName $syncDatabaseServerName -SyncDatabaseResourceGroupName $syncDatabaseResourceGroupName `
-ConflictResolutionPolicy $conflictResolutionPolicy -DatabaseCredential $credential -UsePrivateLinkConnection | Format-list
# use if it's safe to show password in script, otherwise use PromptForCredential
# $user = "username"
# $password = ConvertTo-SecureString -String "password" -AsPlainText -Force
# $credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $user, $password
$credential = $Host.ui.PromptForCredential("Need credential",
"Please enter your user name and password for server "+$serverName+".database.windows.net",
"",
"")
# add a new sync member (if you use private link, make sure to manually approve it)
Write-Host "Adding member"$syncMemberName" to the sync group..."
New-AzSqlSyncMember -ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName `
-SyncGroupName $syncGroupName -Name $syncMemberName -MemberDatabaseType $memberDatabaseType -SyncAgentResourceGroupName $syncAgentResourceGroupName `
-SyncAgentServerName $syncAgentServerName -SyncAgentName $syncAgentName -SyncDirection $syncDirection -SqlServerDatabaseID $syncAgentInfo.DatabaseId `
-SyncMemberAzureDatabaseResourceId $syncMemberResourceId -UsePrivateLinkConnection | Format-list
# update existing sync member to use private link connection
Update-AzSqlSyncMember `
-ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName -SyncGroupName $syncGroupName -Name $syncMemberName `
-MemberDatabaseCredential $memberDatabaseCredential -SyncMemberAzureDatabaseResourceId $syncMemberResourceId -UsePrivateLinkConnection $true
# update existing sync group and remove private link connection
Update-AzSqlSyncGroup `
-ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName -Name $syncGroupName -UsePrivateLinkConnection $false
# run the following Get-AzSqlSyncGroup/ Get-AzSqlSyncMember commands to confirm that a private link has been setup for Data Sync, if you decide to use private link.
# Get-AzSqlSyncMember returns information about one or more Azure SQL Database Sync Members. Specify the name of a sync member to see information for only that sync member.
Get-AzSqlSyncMember `
-ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName -SyncGroupName $syncGroupName -Name $syncMemberName ` | Format-List
# Get-AzSqlSyncGroup returns information about one or more Azure SQL Database Sync Groups. Specify the name of a sync group to see information for only that sync group.
Get-AzSqlSyncGroup `
-ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName ` | Format-List
# approve private endpoint connection, if you decide to use private link
Approve-AzPrivateEndpointConnection `
-Name myPrivateEndpointConnection -ResourceGroupName myResourceGroup -ServiceName myPrivateLinkService
# refresh database schema from hub database, specify the -SyncMemberName parameter if you want to refresh schema from the member database
Write-Host "Refreshing database schema from hub database..."
$startTime = Get-Date
Update-AzSqlSyncSchema -ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName -SyncGroupName $syncGroupName
# waiting for successful refresh
$startTime = $startTime.ToUniversalTime()
$timer=0
$timeout=90
# check the log and see if refresh has gone through
Write-Host "Check for successful refresh..."
$isSucceeded = $false
while ($isSucceeded -eq $false) {
Start-Sleep -s 10
$timer=$timer+10
$details = Get-AzSqlSyncSchema -SyncGroupName $syncGroupName -ServerName $serverName -DatabaseName $databaseName -ResourceGroupName $resourceGroupName
if ($details.LastUpdateTime -gt $startTime) {
Write-Host "Refresh was successful"
$isSucceeded = $true
}
if ($timer -eq $timeout) {
Write-Host "Refresh timed out"
break;
}
}
# get the database schema
Write-Host "Adding tables and columns to the sync schema..."
$databaseSchema = Get-AzSqlSyncSchema -ResourceGroupName $ResourceGroupName -ServerName $ServerName `
-DatabaseName $DatabaseName -SyncGroupName $SyncGroupName `
$databaseSchema | ConvertTo-Json -depth 5 -Compress | Out-File "C:\Users\OnPremiseServer\AppData\Local\Temp\syncSchema.json"
$newSchema = [AzureSqlSyncGroupSchemaModel]::new()
$newSchema.Tables = [List[AzureSqlSyncGroupSchemaTableModel]]::new();
# add columns and tables to the sync schema
foreach ($tableSchema in $databaseSchema.Tables) {
$newTableSchema = [AzureSqlSyncGroupSchemaTableModel]::new()
$newTableSchema.QuotedName = $tableSchema.QuotedName
$newTableSchema.Columns = [List[AzureSqlSyncGroupSchemaColumnModel]]::new();
$addAllColumns = $false
if ($MetadataList.Contains($tableSchema.QuotedName)) {
if ($tableSchema.HasError) {
$fullTableName = $tableSchema.QuotedName
Write-Host "Can't add table $fullTableName to the sync schema" -foregroundcolor "Red"
Write-Host $tableSchema.ErrorId -foregroundcolor "Red"
continue;
}
else {
$addAllColumns = $true
}
}
foreach($columnSchema in $tableSchema.Columns) {
$fullColumnName = $tableSchema.QuotedName + "." + $columnSchema.QuotedName
if ($addAllColumns -or $MetadataList.Contains($fullColumnName)) {
if ((-not $addAllColumns) -and $tableSchema.HasError) {
Write-Host "Can't add column $fullColumnName to the sync schema" -foregroundcolor "Red"
Write-Host $tableSchema.ErrorId -foregroundcolor "Red"
}
elseif ((-not $addAllColumns) -and $columnSchema.HasError) {
Write-Host "Can't add column $fullColumnName to the sync schema" -foregroundcolor "Red"
Write-Host $columnSchema.ErrorId -foregroundcolor "Red"
}
else {
Write-Host "Adding"$fullColumnName" to the sync schema"
$newColumnSchema = [AzureSqlSyncGroupSchemaColumnModel]::new()
$newColumnSchema.QuotedName = $columnSchema.QuotedName
$newColumnSchema.DataSize = $columnSchema.DataSize
$newColumnSchema.DataType = $columnSchema.DataType
$newTableSchema.Columns.Add($newColumnSchema)
}
}
}
if ($newTableSchema.Columns.Count -gt 0) {
$newSchema.Tables.Add($newTableSchema)
}
}
# convert sync schema to JSON format
$schemaString = $newSchema | ConvertTo-Json -depth 5 -Compress
# work around a PowerShell bug
$schemaString = $schemaString.Replace('"Tables"', '"tables"').Replace('"Columns"', '"columns"').Replace('"QuotedName"', '"quotedName"').Replace('"MasterSyncMemberName"','"masterSyncMemberName"')
# save the sync schema to a temp file
$schemaString | Out-File $tempFile
# update sync schema
Write-Host "Updating the sync schema..."
Update-AzSqlSyncGroup -ResourceGroupName $resourceGroupName -ServerName $serverName `
-DatabaseName $databaseName -Name $syncGroupName -Schema $tempFile
$syncLogStartTime = Get-Date
# trigger sync manually
Write-Host "Trigger sync manually..."
Start-AzSqlSyncGroupSync -ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName -SyncGroupName $syncGroupName
# check the sync log and wait until the first sync succeeded
Write-Host "Check the sync log..."
$isSucceeded = $false
for ($i = 0; ($i -lt 300) -and (-not $isSucceeded); $i = $i + 10) {
Start-Sleep -s 10
$syncLogEndTime = Get-Date
$syncLogList = Get-AzSqlSyncGroupLog -ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName `
-SyncGroupName $syncGroupName -StartTime $syncLogStartTime.ToUniversalTime() -EndTime $syncLogEndTime.ToUniversalTime()
if ($synclogList.Length -gt 0) {
foreach ($syncLog in $syncLogList) {
if ($syncLog.Details.Contains("Sync completed successfully")) {
Write-Host $syncLog.TimeStamp : $syncLog.Details
$isSucceeded = $true
}
}
}
}
if ($isSucceeded) {
# enable scheduled sync
Write-Host "Enable the scheduled sync with 300 seconds interval..."
Update-AzSqlSyncGroup -ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName `
-Name $syncGroupName -IntervalInSeconds $intervalInSeconds
}
else {
# output all log if sync doesn't succeed in 300 seconds
$syncLogEndTime = Get-Date
$syncLogList = Get-AzSqlSyncGroupLog -ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName `
-SyncGroupName $syncGroupName -StartTime $syncLogStartTime.ToUniversalTime() -EndTime $syncLogEndTime.ToUniversalTime()
if ($synclogList.Length -gt 0) {
foreach ($syncLog in $syncLogList) {
Write-Host $syncLog.TimeStamp : $syncLog.Details
}
}
}
Dağıtımı temizleme
Örnek betiği çalıştırdıktan sonra kaynak grubunu ve onunla ilişkili tüm kaynakları kaldırmak için aşağıdaki komutu çalıştırabilirsiniz.
Remove-AzResourceGroup -ResourceGroupName $ResourceGroupName
Remove-AzResourceGroup -ResourceGroupName $SyncDatabaseResourceGroupName
Betik açıklaması
Bu betik aşağıdaki komutları kullanır. Tablodaki her komut, komuta özgü belgelere yönlendirir.
Command | Notlar |
---|---|
New-AzSqlSyncAgent | Yeni bir Eşitleme Aracısı oluşturur. |
New-AzSqlSyncAgentKey | Eşitleme Aracısı ile ilişkili aracı anahtarını oluşturur. |
Get-AzSqlSyncAgentLinkedDatabase | Eşitleme Aracısı için tüm bilgileri alın. |
New-AzSqlSyncMember | Eşitleme grubuna yeni bir üye ekleyin. |
Update-AzSqlSyncSchema | Veritabanı şema bilgilerini yeniler. |
Get-AzSqlSyncSchema | Veritabanı şema bilgilerini alın. |
Update-AzSqlSyncGroup | Eşitleme grubunu güncelleştirir. |
Start-AzSqlSyncGroupSync | Eşitlemeyi tetikler. |
Get-AzSqlSyncGroupLog | Eşitleme Günlüğünü denetler. |
İlgili içerik
Azure PowerShell hakkında daha fazla bilgi için bkz. Azure PowerShell belgeleri.
Ek SQL Veritabanı PowerShell betiği örnekleri Azure SQL Veritabanı PowerShell betikleri içinde bulunabilir.
SQL Data Sync hakkında daha fazla bilgi için bkz:
- Genel Bakış - Azure'da SQL Data Sync ile birden çok bulut ve şirket içi veritabanında verileri eşitleme
- Data Sync'i ayarlama
- Azure portalını kullanma - Öğretici: SQL Data Sync'i Azure SQL Veritabanı ile SQL Server arasında veri eşitlemek için ayarlama
- PowerShell kullanma - Azure SQL Veritabanı ve SQL Server'da bir veritabanı arasında veri eşitlemek için PowerShell kullanma
- Data Sync Aracısı - Azure'da SQL Data Sync için Veri Eşitleme Aracısı
- En iyi yöntemler - Azure'da SQL Data Sync için en iyi yöntemler
- İzleyici - Azure İzleyici günlükleriyle SQL Data Sync'i izleme
- Sorun giderme - Azure'da SQL Data Sync ile ilgili sorunları giderme
- Eşitleme şemasını güncelleştirme
- Transact-SQL kullanma - Azure'da SQL Data Sync'te şema değişikliklerini çoğaltmayı otomatikleştirme
- PowerShell kullanma - Mevcut bir eşitleme grubundaki eşitleme şemasını güncelleştirmek için PowerShell kullanma
SQL Veritabanı hakkında daha fazla bilgi için bkz: