Nossa equipe está migrando um de nossos bancos de dados para o Amazon RDS MS SQL Server. Como parte disso, temos que reescrever alguns de nossos procedimentos armazenados.
Temos um procedimento armazenado que realiza um backup do banco de dados para um armazenamento de rede.
BACKUP DATABASE [MyDB] TO DISK = '\\myserver\share\MydbBackup.bak'
WITH RETAINDAYS = 0,
INIT
O procedimento armazenado acima está bloqueando, ou seja, ele pausará a linha de execução - exec stored_proc
- até que o backup seja concluído.
Eu alterei esse procedimento armazenado para que ele use o rds_backup_database
proc armazenado para que o backup seja salvo em um bucket do S3.
exec msdb.dbo.rds_backup_database
@source_db_name='MyDB',
@s3_arn_to_backup_to='arn:aws:s3:::temp-poc-bucket/db_backups/MyDBBackup.bak',
@overwrite_s3_backup_file=1;
O problema é que nosso fluxo de trabalho (o procedimento armazenado é chamado de nosso aplicativo) exige que ele seja síncrono.
Existe alguma maneira de "aguardar" a execução do msdb.dbo.rds_backup_database
procedimento armazenado?
Documentos do AWS RDS .
De acordo com os documentos :
Então, após iniciar o backup com
rds_backup_database
, você só precisaria entrar em um loop onde você usards_task_status
para encontrar o status atual, e se não for "SUCCESS", você pode usarWAITFOR DELAY '00:00:30'
para dormir por 30 segundos, antes de continuar seu loop para verificar o status novamente e repita.Há também esta resposta no Stack Overflow que implementa uma solução semelhante do PowerShell. Independentemente de você implementar seu código no PowerShell ou T-SQL, a lógica para verificação e loop seria semelhante.