检查异步运行的数据库恢复进度

Rad*_*hiu 0 sql-server powershell sql-server-2008-r2

我有一个使用SqlRestoreAsync方法恢复数据库的 Powershell 脚本。

我有一个大小适中的数据库,我正在恢复(~55Gb),我正在尝试查找恢复过程的进度。

我知道,如果我通过 T-SQL 命令运行恢复,那么我可以通过查询一些 DMV 或使用以下查询来查看恢复的进度:

SELECT r.session_id
    , r.command
    , CONVERT(NUMERIC(6, 2), r.percent_complete) AS [Percent Complete]
    , CONVERT(VARCHAR(20), DATEADD(ms, r.estimated_completion_time, GetDate()), 20) AS [ETA Completion Time]
    , CONVERT(NUMERIC(10, 2), r.total_elapsed_time / 1000.0 / 60.0) AS [Elapsed Min]
    , CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0) AS [ETA Min]
    , CONVERT(NUMERIC(10, 2), r.estimated_completion_time / 1000.0 / 60.0 / 60.0) AS [ETA Hours]
    , CONVERT(VARCHAR(1000), (
            SELECT SUBSTRING(TEXT, r.statement_start_offset / 2, CASE 
                        WHEN r.statement_end_offset = - 1
                            THEN 1000
                        ELSE (r.statement_end_offset - r.statement_start_offset) / 2
                        END)
            FROM sys.dm_exec_sql_text(sql_handle)
            )) AS [SQL]
FROM sys.dm_exec_requests r
WHERE command IN ('RESTORE DATABASE', 'BACKUP DATABASE');
Run Code Online (Sandbox Code Playgroud)

此查询适用于 T-SQL 触发的还原(或 SSMS 还原),但不显示 Powershell 脚本触发的还原的还原进度。

我可以在 SSMS 的对象资源管理器中看到我的数据库处于“正在恢复”状态,所以我知道它正在工作,但是..它正在运行吗?

以异步模式运行此程序的恢复过程似乎比通过 T-SQL 运行它时花费的时间多一点,到目前为止是两倍,但仍未完成。

有什么我想念的吗?任何帮助,将不胜感激。

Aar*_*and 5

我看不出为什么此命令不会像任何其他还原命令一样显示的任何明显信息,除非它忙于执行RESTORE DATABASE.

我建议确定session_id正在使用的PowerShell(您应该能够在sys.dm_exec_sessions或 中看到sys.dm_exec_connections),或者您可以更改脚本以获取它并将其打印到控制台。然后将您的过滤器更改为:

SELECT command, status, percent_complete, 
  wait_type, last_wait_type, wait_resource,
  blocking_session_id
FROM sys.dm_exec_requests
WHERE session_id = <x>;
Run Code Online (Sandbox Code Playgroud)

这将帮助您验证:

  • 如果命令实际上是 aRESTORE或者 Powershell 实际上首先在做其他事情
  • 当前状态
  • 完成百分比,如果可用并非总是如此
  • 它在等待什么(如果你反复运行它,如果这正在改变)
  • 如果您的恢复实际上被任何东西阻止了