如何等待rds_backup_database存储过程的执行?

Geo*_*iev 5 sql-server amazon-rds

我们的团队正在将我们的数据库之一迁移到 Amazon RDS MS SQL Server。作为其中的一部分,我们必须重写一些存储过程。

我们有一个存储过程,用于将数据库备份到网络存储。

BACKUP DATABASE [MyDB] TO DISK = '\\myserver\share\MydbBackup.bak'
WITH RETAINDAYS = 0,
    INIT
Run Code Online (Sandbox Code Playgroud)

上面的存储过程是阻塞的,即它将暂停执行行--exec stored_proc直到备份完成。

我已更改该存储过程,以便它使用rds_backup_database存储过程,以便将备份保存在 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;
Run Code Online (Sandbox Code Playgroud)

问题是我们的工作流程(从我们的应用程序调用存储过程)要求它是同步的。

有没有办法“等待”存储过程的执行msdb.dbo.rds_backup_database

AWS RDS文档

AMt*_*two 4

根据文档

当调用rds_backup_database或rds_restore_database存储过程时,任务启动并输出有关任务的信息。
...
当任务的生命周期状态为SUCCESS时,任务完成。
...
您可以在执行备份或恢复语句后获取任务ID。或者,您可以使用以下脚本来识别特定数据库的所有已完成和待处理任务:

exec msdb.dbo.rds_task_status @db_name='database_name'

要跟踪作业的状态,请使用以下 SQL 语句:

exec msdb..rds_task_status @task_id= 5

因此,在使用 启动备份后rds_backup_database,您只需要进入一个循环来rds_task_status查找当前状态,如果不是“成功”,您可以先休眠WAITFOR DELAY '00:00:30'30 秒,然后再继续循环检查状态再次并重复。

Stack Overflow 上也有这个答案,它从 PowerShell 实现了类似的解决方案。无论您是在 PowerShell 还是 T-SQL 中实现代码,检查和循环的逻辑都是相似的。