我编写了一个 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 为 null 并且循环不起作用。这是上周才开始发生的事情。我查看了一些工作记录,直到周四为止一直运行良好。我今天运行了一些测试数据库副本,但 $check 始终未设置。
有人知道这种行为改变的原因吗?是否有更好的方法在 Azure 自动化中使用 PowerShell 监视数据库副本?
最佳答案
下面检查目标端是否存在副本:
$check = Get-AzureSqlDatabaseCopy -ServerName $SqlServer -DatabaseName $DatabaseDestination
不保证在 Start-AzureSqlDtaabaseCopy 返回之前创建目标端复制对象,因此 $check 过早变为 null,这意味着复制实际上并未完成。
要解决此问题,我们建议检查源端是否存在副本:
$check = Get-AzureSqlDatabaseCopy -ServerName $SqlServer -DatabaseName $DatabaseSource -PartnerDatabase $DatabaseDestination
关于powershell - 使用 Azure 自动化复制数据库时 Get-AzureSqlDatabaseCopy 未返回预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31940043/