Sql-Server

維護計劃不要停止,不要備份所有數據庫

  • October 3, 2017

我有一個包含 100 個數據庫的伺服器,我有一個用於備份的維護計劃 (MP)。我注意到,當我查看備份文件夾目標時,維護計劃不會備份所有數據庫,我可以看到它在 50 個數據庫 +- 後停止。該作業仍處於執行模式 - 它不會停止。

因此,一方面,我可以看到沒有新的備份文件(前 50 個之後),另一方面,工作沒有停止。

如果作業仍在執行,請使用 Adam Machanic 出色的免費儲存過程sp_WhoIsActive檢查目前正在執行的命令。安裝後(通常在 master 數據庫中),您可以執行 sp_WhoIsActive 以列出正在執行的查詢並查看它們現在正在執行的命令。

甚至還有一個完成百分比列,用於填充備份和恢復。

您可能有一個特別大的數據庫(或日誌文件)正在備份中。

如需進一步跟進和澄清,請嘗試拍照或複制/粘貼 sp_WhoIsActive 結果,顯示維護計劃目前正在執行的操作。

使用這 2 個查詢,您可以找到您的工作正在等待什麼

第一個查詢列出了所有正在執行的使用者程序,如果您不知道您的作業 spid,您會發現它按程序過濾。

第二個查詢將顯示您的工作正在等待什麼:

select s.session_id, s.host_name, s.login_name, 
      db_name(s.database_id) as db,
      r.percent_complete,
      s.login_time,
      s.last_request_start_time, 
      r.status as r_status,        
      r.wait_type, 
      s.program_name, 
      s.cpu_time, 
      s.reads, 
      s.logical_reads,
      c.num_reads,
      c.num_writes, 
      cast(s.logical_reads / 1024. * 8/ 1024 as decimal(20,2)) as Gb ,
      s.row_count,
      s.writes,
      c.last_read,
      c.last_write,
      r.command, 
      r.wait_time, 
      r.last_wait_type,
      [individual query] = substring(t.text , r.statement_start_offset / 2 + 1, (
                               case
                                   when r.statement_end_offset = - 1
                                   then len(convert(nvarchar(max), t.text)) * 2
                                   else r.statement_end_offset
                               end - r.statement_start_offset
                               ) / 2),

      t.text
      --p.query_plan
from sys.dm_exec_sessions s
    join sys.dm_exec_connections c
       on s.session_id = c.session_id
    /*left*/ join sys.dm_exec_requests r
       on s.session_id = r.session_id  
    outer apply sys.dm_exec_sql_text(r.sql_handle) t 
   -- outer apply sys.dm_exec_query_plan(r.plan_handle) p
where s.is_user_process = 1 and s.session_id  <> @@spid
--order by 2

select s.login_name,      
      wt.*
from sys.dm_os_waiting_tasks wt
    join sys.dm_exec_sessions s
       on wt.session_id = s.session_id
where s.is_user_process = 1 and s.session_id <> @@spid
order by wt.session_id;

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