Sql-Server-2008

這是在恢復日誌(用於 Sql Server 日誌傳送)之前等待空閒數據庫目錄的正確方法嗎?

  • April 26, 2014

我想要一個單獨的 Sql Server 實例,專門用於“報告”角色。我決定通過日誌傳送填充該伺服器(因為鏡像不起作用,並且可用性組非常昂貴)。我發現我只需要按時間間隔備份事務日誌,將它們複製到報告實例可訪問的位置,然後在目標實例上執行恢復。

我沒有找到一個被廣泛接受的解決方案的問題是,如果沒有對目標目錄的獨占訪問權限,就無法恢復日誌。我想經常刷新數據,但讓刷新過程等待最終使用者執行的任何活動報告/查詢;由於連接池,您不能只跟踪打開的連接。所以我的解決方案的關鍵是能夠確定數據庫目錄是否“忙”。我提出了這個查詢,列出了“活動”查詢——我的程序應該等待的那些。有誰知道為什麼這不起作用,或者有人可以確認它會起作用嗎?(例如,阻塞資訊是否比我已經檢查的更重要?)

SELECT USER_NAME(user_id) AS LoginName
   , DB_NAME(database_id) AS DbCat
   , blocking_session_id AS BlockedBy
   , open_transaction_count AS OpenTrans
   , status AS ExecStatus
   , cpu_time AS CpuTime
   , logical_reads AS LogicalReads
   , *
   FROM sys.dm_exec_requests
   WHERE session_id != @@SPID
       AND database_id = DB_ID()
       AND status != 'background' --always non-client activity; not something that should block log-shipping.
       AND (open_transaction_count > 0 --open transactions always need to be waited on
           OR status != 'sleeping' --sleeping=idle, except when there's an open transaction.
       );

本質上,如果此查詢返回零行,則目錄處於空閒狀態,我會執行還原。如果沒有,那麼恢復不會在那個時候發生。

查詢效果很好。我在恢復工作中成功使用了它。沒有任何程序在查詢過程中被踢出數據庫。

我自己沒有嘗試過,但我認為你需要的功能是內置的,如果你在配置日誌傳送輔助時取消選中“在恢復備份時斷開數據庫中的使用者”複選框。

在此處輸入圖像描述

引用自:https://serverfault.com/questions/576865