Sql server 等待AWS RDS本机sql备份完成

Sql server 等待AWS RDS本机sql备份完成,sql-server,powershell,batch-file,amazon-rds,Sql Server,Powershell,Batch File,Amazon Rds,在批处理或powershell中创建EC2或RDS实例时,可以运行内置的aws RDS wait db实例available--db实例标识符“myDbInstance”,等待其可用,然后再对其运行其他命令 我有一个脚本,可以将RDS快照恢复到一个新实例($devInstanceDnsName),然后将单个数据库从该实例(在MS SQL中)备份到S3。 在powershell中,要运行本机备份,请运行sqlcmd-X-b-S“tcp:$devInstanceDnsName,1433”-d dbN

在批处理或powershell中创建EC2或RDS实例时,可以运行内置的
aws RDS wait db实例available--db实例标识符“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_='arn:aws:s3::backupbucket/$backupFileName',@overwrite_s3_backup_file=1”


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

我已经完成了一个简单的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))

}
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
...
定义如下:

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))

}
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
...
它每X秒调用一次存储过程,最多调用X分钟,直到其生命周期值为“SUCCESS”

当然,您可以改进这一点:

  • 添加返回码或在超时时抛出
  • 处理错误的生命周期值,可能会显示包含错误的任务信息的值
  • 传入更多参数以使其更通用(如超时和重试的端口号),等等
输出如下所示:

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))

}
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
...

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

谢谢您的回答,帮助很大!我想补充一点,这个检查当前状态的查询不适用于为此数据库运行的多个作业。如果以前有一个作业成功,则新创建的用于检查当前状态的计时器最终将计算为
created SUCCESS 0 100