Sql-Server

檢查非同步執行的數據庫還原的進度

  • December 7, 2018

我有一個使用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');

此查詢適用於 T-SQL 觸發的還原(或 SSMS 還原),但不會顯示由 Powershell 腳本觸發的還原的還原進度。

我可以在 SSMS 的對象資源管理器中看到我的數據庫處於“正在恢復”狀態,所以我知道它正在工作,但是……它正在執行嗎?

在非同步模式下執行它的恢復過程似乎比通過 T-SQL 執行它需要更多的時間,到目前為止是兩倍,但仍未完成。

有什麼我想念的嗎?任何幫助,將不勝感激。

我沒有看到任何明顯的關於為什麼這個命令不會像任何其他恢復命令一樣顯示,除非它正忙於做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>;

這將幫助您驗證:

  • 如果命令實際上是 aRESTORE或者 Powershell 實際上首先在做其他事情
  • 目前狀態
  • 完成百分比,如果可用並非總是如此
  • 它在等待什麼(如果你反復執行它,如果這正在改變)
  • 如果您的還原實際上被任何東西阻止

嘗試列出活動程序:

選擇 session_id 作為 SPID
, 命令
, a.text AS查詢
, 開始時間
, 百分比完成
, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time
FROM sys.dm_exec_requests r
交叉應用 sys.dm_exec_sql_text(r.sql_handle) a
--WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')

看看你是否能發現這個過程。(我的猜測是該命令是一個 sp_ExecuteSQL)

引用自:https://dba.stackexchange.com/questions/202819