我想使用来自 http://www.wisesoft.co.uk/articles/tsql_backup_restore_progress.aspx 的脚本获取正在运行的特定 SQL-Server 恢复作业的进度信息。为了实现这一点,我对其进行了一些更改:
SELECT command,
s.text,
start_time,
percent_complete,
CAST(((DATEDIFF(s,start_time,GetDate()))/3600) as varchar) + ' hour(s), '
+ CAST((DATEDIFF(s,start_time,GetDate())%3600)/60 as varchar) + 'min, '
+ CAST((DATEDIFF(s,start_time,GetDate())%60) as varchar) + ' sec' as running_time,
CAST((estimated_completion_time/3600000) as varchar) + ' hour(s), '
+ CAST((estimated_completion_time %3600000)/60000 as varchar) + 'min, '
+ CAST((estimated_completion_time %60000)/1000 as varchar) + ' sec' as est_time_to_go,
dateadd(second,estimated_completion_time/1000, getdate()) as est_completion_time
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s
WHERE r.command = 'RESTORE DATABASE' and r.database_id = db_id('database_name')
不幸的是,这不起作用,因为 r.database_id 永远不会等于 db_id('database_name')。这是什么原因?这个SQL语句有什么问题?此脚本适用于 'r.command = BACKUP DATABASE'。
是否有其他基于 T-SQL 的可能性来获取特定 SQL-Server 作业的进度状态?
最佳答案
当您运行 BACKUP 时,数据库在线并且命令在数据库内部运行。但是,当您运行 RESTORE 时,数据库无法在线(您正在主动恢复它,因此它无法在线)因此该命令无法在所述数据库的上下文中执行。
因此,与其查看 DB_ID 来猜测哪个请求是您的请求,不如在对 SqlConnection 执行 RESTORE 命令之前偷偷输入 @@SPID
,然后查看带有该 的请求session_id
:这将是您的 RESTORE 请求。
关于sql-server - 获取 SQL-Server 还原作业的进度状态时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3419273/