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文档。
根据文档:
当调用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 中实现代码,检查和循环的逻辑都是相似的。