等待AWS RDS本机sql备份完成

Thi*_*y_S 4 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".

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

Thi*_*y_S 5

我做了一个简单的 powershell 函数,如下所示:

Wait-RdsNativeBackupSuccess -server "$devInstanceDnsName,1433" -database dbName -user dbUser -pwd dbPwd
Run Code Online (Sandbox Code Playgroud)

并定义如下:

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='dbName'" -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))

}
Run Code Online (Sandbox Code Playgroud)

它每 X 秒调用rds_task_status存储过程,最多 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
...
Run Code Online (Sandbox Code Playgroud)