Sql server 等待AWS RDS本机sql备份完成
在批处理或powershell中创建EC2或RDS实例时,可以运行内置的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
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
。