0

我编写了一个 PowerShell 脚本来使用 Azure 自动化自动复制数据库。它已经工作了几个月,但出现了一些与 Get-AzureSqlDatabaseCopy 命令相关的奇怪行为。在进入下一步之前,我使用 Get-AzureSqlDatabaseCopy 检查数据库副本是否已完成。如果数据库副本没有及时完成,则会导致错误。

$SqlServer = 'servername.database.windows.net'
$DatabaseSource = 'Database1'
$DatabaseDestination = 'Database2'

Write-Output "Starting database copy - $DatabaseDestination"
Start-AzureSqlDatabaseCopy -ServerName $SqlServer -DatabaseName $DatabaseSource -PartnerServer $SqlServer -PartnerDatabase $DatabaseDestination    

$i = 0
$secs = 0
do
{
    $check = Get-AzureSqlDatabaseCopy -ServerName $SqlServer -DatabaseName $DatabaseDestination
    $i = $check.PercentComplete
    Write-Output "Database Copy ($DatabaseDestination) not complete in $secs seconds"

    $secs += 10
    Start-Sleep -s 10
}
while($i -ne $null -and $secs -lt 600)

此代码过去运行良好,数据库复制通常需要 30-40 秒才能完成。似乎有问题

$check = Get-AzureSqlDatabaseCopy -ServerName $SqlServer -DatabaseName $DatabaseDestination

$check 看起来没有被设置为任何值,因此 $i 为空并且循环不起作用。这是上周才开始发生的事情。我浏览了一些工作记录,直到星期四它一直运行良好。我今天运行了一些测试数据库副本,并且始终没有设置 $check。

有谁知道这种行为变化的原因?是否有更好的方法在 Azure 自动化中使用 PowerShell 监控数据库副本?

4

1 回答 1

2

下面检查副本是否存在是在目标端完成的:

$check = Get-AzureSqlDatabaseCopy -ServerName $SqlServer -DatabaseName $DatabaseDestination

不保证在 Start-AzureSqlDtaabaseCopy 返回之前创建目标端副本对象,因此 $check 过早地变为 null,这意味着副本实际上并未完成。

要解决此问题,我们建议在源端检查副本是否存在:

$check = Get-AzureSqlDatabaseCopy -ServerName $SqlServer -DatabaseName $DatabaseSource -PartnerDatabase $DatabaseDestination
于 2015-08-14T00:20:42.890 回答