在批处理或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"
。
这是一个异步任务,它会安排备份并立即返回。但是脚本如何知道本机备份何时完成并同步继续执行?
答案 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 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。然后,您要检查该任务的状态,而不是该数据库上的所有操作。