无论如何,我们是否可以通过API按需触发Azure数据同步,而无需使用自动同步?
答案 0 :(得分:0)
不确定是否有开放的API,但这是用于手动触发Azure数据同步的powershell脚本。它包括HUB,手动和同步数据库创建以及手动添加触发器。
您可以使用它来创建自定义api并从您的代码中触发它。
# prerequisites:
# 1. Create an Azure SQL Database from AdventureWorksLT sample database as hub database
# 2. Create an Azure SQL Database in the same region as sync database
# 3. Create an Azure SQL Database as member database
# 4. Update the parameters below before running the sample
#
using namespace Microsoft.Azure.Commands.Sql.DataSync.Model
using namespace System.Collections.Generic
# Hub database info
# Subscription id for hub database
$SubscriptionId = "subscription_guid"
# Resource group name for hub database
$ResourceGroupName = "ResourceGroup"
# Server name for hub database
$ServerName = "Server"
# Database name for hub database
$DatabaseName = "AdventureWorks"
# Sync database info
# Resource group name for sync database
$SyncDatabaseResourceGroupName = "ResourceGroup"
# Server name for sync database
$SyncDatabaseServerName = "Server"
# Sync database name
$SyncDatabaseName = "SyncDatabase"
# Sync group info
# Sync group name
$SyncGroupName = "SampleSyncGroup1"
# Conflict resolution Policy. Value can be HubWin or MemberWin
$ConflictResolutionPolicy = "HubWin"
# Sync interval in seconds. Value must be no less than 300
$IntervalInSeconds = 300
# Member database info
# Member name
$SyncMemberName = "member"
# Member server name
$MemberServerName = "MemberServer"
# Member database name
$MemberDatabaseName = "SyncDatabase1"
# Member database type. Value can be AzureSqlDatabase or SqlServerDatabase
$MemberDatabaseType = "AzureSqlDatabase"
# Sync direction. Value can be Bidirectional, Onewaymembertohub, Onewayhubtomember
$SyncDirection = "Bidirectional"
# Other info
# 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 this section if it is safe to show password in the script.
# Otherwise, use the PromptForCredential
# $User = "username"
# $PWord = ConvertTo-SecureString -String "Password" -AsPlainText -Force
# $Credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $User, $PWord
$Credential = $Host.ui.PromptForCredential("Need credential",
"Please enter your user name and password for server "+$ServerName+".database.windows.net",
"",
"")
# Create a new sync group
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
# Use this section if it is safe to show password in the script.
#$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 "+$MemberServerName,
"",
"")
# Add a new sync member
# You can add members from other subscriptions, you don't need to specify Subscription Id for the member
Write-Host "Adding member"$SyncMemberName" to the sync group"
New-AzSqlSyncMember -ResourceGroupName $ResourceGroupName `
-ServerName $ServerName `
-DatabaseName $DatabaseName `
-SyncGroupName $SyncGroupName `
-Name $SyncMemberName `
-MemberDatabaseCredential $Credential `
-MemberDatabaseName $MemberDatabaseName `
-MemberServerName ($MemberServerName + ".database.windows.net") `
-MemberDatabaseType $MemberDatabaseType `
-SyncDirection $SyncDirection
# 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:\tmp\databaseSchema"
$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"c }
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
# workaround 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
}
}
}
# Clean up deployment
# Remove-AzResourceGroup -ResourceGroupName $resourcegroupname
# Remove-AzResourceGroup -ResourceGroupName $SyncDatabaseResourceGroupName
希望有帮助。
答案 1 :(得分:0)
azure rest api是同步的好选择,而不必依赖自动同步。 POST api调用的格式为:
POST https://management.azure.com/subscriptions/ {subscriptionId} / resourceGroups / {resourceGroupName} /providers/Microsoft.Sql/servers/ {serverName} / databases / {databaseName} / syncGroups / {syncGroupName} / triggerSync?api-version = 2015 -05-01-预览
以下是指向API文档的链接: