Sql-Server

如何成功設置 sp_AllNightLog 以創建報告伺服器?

  • July 25, 2019

我想設置一個輔助的、鏡像的SQL Server 用於報告目的。

報告數據庫不必與數據庫保持同步,通常可以比生產數據庫滯後一天,甚至更多。

幾天來,我一直在嘗試實現這樣的目標,但幾乎沒有成功,使用 Brent Ozar 的SQL-Server-First-Responder-Kitsp_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 需要獨占訪問數據庫才能進行還原。

這意味著在以下情況下您會遇到麻煩:

  1. 使用者啟動了一個執行時間很長的查詢
  2. sp_AllNightLog 嘗試啟動日誌還原,但被阻止
  3. 其他使用者嘗試啟動查詢,但被 sp_AllNightLog 阻止,導致超時和憤怒的使用者

我不會為此目的使用 sp_AllNightLog (這不是它的設計目的,所以這就是為什麼你沒有找到關於如何做到這一點的教程。)如果你堅持這樣做,你需要編寫程式碼:

  1. 檢查是否有任何使用者查詢正在執行
  2. 如果是,則在不嘗試開始恢復的情況下優雅地退出(但可能會檢查恢復完成後是否已經很長時間 - 因為您可能處於需要終止報告查詢以獲取數據趕上)
  3. 如果否,則開始恢復過程

這留給讀者作為練習。

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