如何成功設置 sp_AllNightLog 以創建報告伺服器?
我想設置一個輔助的、鏡像的SQL Server 用於報告目的。
報告數據庫不必與主數據庫保持同步,通常可以比生產數據庫滯後一天,甚至更多。
幾天來,我一直在嘗試實現這樣的目標,但幾乎沒有成功,使用 Brent Ozar 的SQL-Server-First-Responder-Kit和
sp_AllNightLog
.通常,第一個 FULL 備份會被恢復,有時甚至會恢復一些 LOG 備份,但隨後它就會卡住,它不再看到更新的備份,只是進入一個循環,什麼都不做。
故障排除似乎向我表明,
sp_AllNightLog @Restore = 1
在恢復數據庫或日誌文件時遇到錯誤,將其記錄在restore_worker
表中,這會阻止發出所有進一步的恢復。如果我清除error_number
(-1) 並last_error_date
從表中清除,它會再次開始恢復,但隨後再次出現錯誤,因為它開始恢復 FULL 備份,而不是繼續進行 LOG 恢復。然後它記錄錯誤日期和錯誤編號並再次停止。另一個問題是
sp_DatabaseRestore
(來自 Kit)使恢復的數據庫(無論是從 FULL 恢復還是 LOG 恢復)處於未恢復狀態(始終使用NORECOVERY
並且從不執行RESTORE WITH RECOVERY
)。這使得數據庫在輔助數據庫上不可讀,除非我sp_AllNightLog
從 using更改@RunRecovery = 0
為@RunRecovery = 1
:-- Line 1302 IF @restore_full = 0 BEGIN IF @Debug = 1 RAISERROR ('Starting Log only restores', 0, 1) WITH NOWAIT; EXEC master.dbo.sp_DatabaseRestore @Database = @database, @BackupPathFull = @restore_path_full, @BackupPathLog = @restore_path_log, @ContinueLogs = 1, @RunRecovery = 1, @OnlyLogsAfter = @only_logs_after, @Debug = @Debug END IF @restore_full = 1 BEGIN IF @Debug = 1 RAISERROR ('Starting first Full restore from: ', 0, 1) WITH NOWAIT; IF @Debug = 1 RAISERROR (@restore_path_full, 0, 1) WITH NOWAIT; EXEC master.dbo.sp_DatabaseRestore @Database = @database, @BackupPathFull = @restore_path_full, @BackupPathLog = @restore_path_log, @ContinueLogs = 0, @RunRecovery = 1, @Debug = @Debug END
我是否必須在設置之前刪除備份歷史記錄?有沒有人寫過一個完整的指南來設置這樣的東西?即使在Google搜尋時,我似乎也真的找不到。
任何幫助是極大的讚賞!
與任何事務日誌還原一樣,sp_AllNightLog 需要獨占訪問數據庫才能進行還原。
這意味著在以下情況下您會遇到麻煩:
- 使用者啟動了一個執行時間很長的查詢
- sp_AllNightLog 嘗試啟動日誌還原,但被阻止
- 其他使用者嘗試啟動查詢,但被 sp_AllNightLog 阻止,導致超時和憤怒的使用者
我不會為此目的使用 sp_AllNightLog (這不是它的設計目的,所以這就是為什麼你沒有找到關於如何做到這一點的教程。)如果你堅持這樣做,你需要編寫程式碼:
- 檢查是否有任何使用者查詢正在執行
- 如果是,則在不嘗試開始恢復的情況下優雅地退出(但可能會檢查恢復完成後是否已經很長時間 - 因為您可能處於需要終止報告查詢以獲取數據趕上)
- 如果否,則開始恢復過程
這留給讀者作為練習。