Sql-Server-2008
這是在恢復日誌(用於 Sql Server 日誌傳送)之前等待空閒數據庫目錄的正確方法嗎?
我想要一個單獨的 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. );
本質上,如果此查詢返回零行,則目錄處於空閒狀態,我會執行還原。如果沒有,那麼恢復不會在那個時候發生。
查詢效果很好。我在恢復工作中成功使用了它。沒有任何程序在查詢過程中被踢出數據庫。
我自己沒有嘗試過,但我認為你需要的功能是內置的,如果你在配置日誌傳送輔助時取消選中“在恢復備份時斷開數據庫中的使用者”複選框。