等待AWS RDS本机sql备份完成

时间:2017-12-04 19:05:10

标签: sql-server powershell batch-file amazon-rds

在批处理或powershell中创建EC2或RDS实例时,您可以运行内置aws rds wait db-instance-available --db-instance-identifier 'myDbInstance'以等待它运行进一步命令之前可用。

我有一个脚本可以将RDS快照还原到新实例($ devInstanceDnsName),然后将该实例(在MS SQL中)中的单个数据库备份到S3。 在powershell中,要运行本机备份,请运行sqlcmd -X -b -S "tcp:$devInstanceDnsName,1433" -d dbName -U dbUser -P dbPwd -Q "exec msdb.dbo.rds_backup_database @source_db_name='dbName', @s3_arn_to_backup_to='arn:aws:s3:::backupsbucket/$backupFileName', @overwrite_S3_backup_file=1"

这是一个异步任务,它会安排备份并立即返回。但是脚本如何知道本机备份何时完成并同步继续执行?

2 个答案:

答案 0 :(得分:2)

我已经完成了一个简单的PowerShell函数,如下所示:

Wait-RdsNativeBackupSuccess -server "$devInstanceDnsName,1433" -database dbName -user dbUser -pwd dbPwd

并定义如下:

function Wait-RdsNativeBackupSuccess($server, $database, $user, $pwd)
{
    $startDate = Get-Date
    $timeOutminutes = 45
    $retryIntervalSeconds = 30

    do {
            $awsResponse = Invoke-Sqlcmd -ServerInstance $server -Database $database -Username $user -Password $pwd -Query "exec msdb.dbo.rds_task_status @db_name='clarinet'" -DisableCommands -AbortOnError
            Write-Host $awsResponse.lifecycle $awsResponse."% complete"

            if($awsResponse.lifecycle -eq "SUCCESS") {break}
            start-sleep -seconds $retryIntervalSeconds

    } while ($startDate.AddMinutes($timeOutminutes) -gt (Get-Date))

}

它每X秒调用rds_task_status个sproc,最多X分钟,直到它的生命周期值为" SUCCESS"。

你当然可以改善这一点:

  • 添加返回代码或抛出超时,
  • 处理错误的生命周期值,可能会显示task_info的值,该值将包含错误。
  • 传递更多参数以使其更通用(如超时和重试的端口号)等。

输出如下:

Task created successfully.
Task Id: 1
CREATED 0
CREATED 0
CREATED 0
IN_PROGRESS 0
IN_PROGRESS 0
IN_PROGRESS 5
IN_PROGRESS 5
IN_PROGRESS 10
...

答案 1 :(得分:0)

将查询更改为使用task_id而不是db_name。然后,您要检查该任务的状态,而不是该数据库上的所有操作。