如何修復SQL數據庫卡在恢復模式中的問題

SQL Server數據庫偶爾會進入“恢復中”模式,這往往會讓數據庫管理員措手不及。這種狀態發生在重新啟動、數據庫恢復或非預期關機期間,因為SQL Server正在重放或撤消不完整的事務以維護數據完整性。儘管這個過程通常是自動的,但有時可能需要比預期更長的時間 — 或者甚至看起來卡住了 — 這會讓管理員不確定應該如何繼續進行。

如果您遇到這個問題,不用擔心。本文將幫助您了解背後發生了什麼,並教您如何應對。以下是您將學到的內容的快速概述:

  • “恢復中”模式的含義 — 您的數據庫進入此狀態的原因以及SQL Server在後台正在進行的工作。
  • 恢復的三個階段 — SQL Server在恢復期間遵循的分析、重做和撤消階段的明確分解。
  • 延遲的常見原因 — 從大型事務日誌到過多的虛擬日誌文件(VLFs),看看可能拖慢流程的原因。
  • 如何恢復上線 — 學習將數據庫恢復到一致狀態的實用步驟,從等待到使用SQL修復工具。
  • 何時尋求進階幫助 — 如果恢復過程似乎卡住且沒有任何進展,應該怎麼做。

通過閱讀本指南,您將對SQL Server的恢復過程有深入的了解,並了解可以用來盡快使數據庫恢復上線的工具。

理解SQL Server中的“恢復中”模式

SQL Server 重新啟動或從備份還原數據庫時,它會進入「恢復中」模式以維護數據完整性。在此階段,SQL Server 會重放或撤消未完成的事務,以防止數據損壞並確保事務一致性。

重新啟動 SQL Server 後,數據庫會進入「恢復中」模式。在啟動時或從備份還原數據庫時,您也可能會看到 SQL Server 數據庫處於恢復狀態。

圖 1- SQL 數據庫「恢復中」模式

數據庫的「恢復中」狀態意味著數據庫正在執行恢復過程,一旦過程完成,它將自動上線。然而,您可能會遇到恢復過程緩慢,數據庫陷入恢復狀態的情況。根據數據庫文件大小不同,您的數據庫可能仍然處於恢復狀態,因為 SQL 數據庫需要經歷三個恢復階段,這可能需要一段時間。

SQL 數據庫恢復的三個階段

通常,在 SQL Server 重新啟動時,如果數據庫沒有正確關閉,它會進行崩潰恢復,以確保數據庫保持一致。SQL 數據庫需要經歷三個恢復階段:

階段 1:分析

這個階段從“最後的檢查點到交易記錄結束”開始。它創建一個‘Dirty Page Table’(DPT)表來幫助確定崩潰時的所有髒頁。同時,它還創建了一個‘Active Transaction Table’(ATT)表來識別SQL Server停止時未提交的交易。

階段2:重做

在這個階段,SQL Server將所有在檢查點之後且在崩潰之前發生的更改進行重放。基本上,在重做階段,所有已提交但尚未通過檢查點寫入SQL數據文件(.mdf/.ldf)的交易都需要被向前滾動。

階段3:撤銷

如果在數據庫恢復時有任何未提交的交易,它們必須在撤銷階段中被回滾以使數據庫處於一致狀態。

如果您的數據庫陷入恢復模式怎麼辦?

檢查SQL Server錯誤日誌,查看數據庫中可能類似以下的第一條消息:

Starting up database ‘DatabaseName’

這表示數據庫文件已打開,恢復過程已啟動。稍後,您應該看到SQL Server進行3個恢復階段。如果您想獲得有關如何備份和還原數據庫的指南,請查看這份有關備份和還原Azure SQL數據庫的指南。

數據庫恢復的第1階段如下所示:

Plain Text

 

在第1階段完成後,SQL Server將進行第2和第3階段的恢復:

Plain Text

 

一旦第2和第3階段完成,您將看到類似於:

Plain Text

 

在錯誤日誌中,請注意消息“無需用戶操作”。這表示數據庫處於恢復狀態。然而,恢復可能需要比預期更長的時間,數據庫將被困在恢復模式中。

SQL數據庫被困在“恢復中”模式背後的原因

以下是可能導致SQL數據庫被困在恢復模式中的原因:

  • 一個長時間運行的事務正在回滾
  • 事務日誌文件大小巨大
  • 事務日誌內有太多虛擬日誌文件(VLF)
  • SQL Server中存在錯誤,現在已修復。

您可以採取哪些措施將數據庫恢復到一致狀態?

解決方法1:等待數據庫恢復完成

將數據庫帶回線上的最明顯解決方案是耐心等待恢復過程完成;這可能需要幾個小時或幾天。如果對於SQL Server 2008或2008 R2中的DB來說,恢復所需的時間比預期長,則應用Microsoft修復可能有所幫助。

注意:避免執行 RESTORE 命令以將資料庫帶入一致狀態,因為 SQL Server 已經在嘗試執行相同的任務。而執行 ‘RESTORE with..Recovery’ 意味著讓資料庫再次經歷相同的步驟。

解決方法 2:使用專業的 SQL 數據庫修復工具

如果恢復完成但無法將資料庫帶入一致狀態,使用專門的 SQL 修復工具可能有助於將資料庫恢復到其原始狀態。

  • Stellar Repair for MS SQL — 一款專門的工具,可在數據損壞或故障後幫助恢復 SQL 數據庫到其原始狀態。
  • ApexSQL Recover — 此工具幫助恢復已刪除、截斷或損壞的 SQL Server 數據庫數據。
  • dbForge SQL Complete — 雖然主要是一個 IDE 擴展,但它提供了有用的錯誤處理和故障排除功能。
  • Redgate SQL Data Recovery — Redgate 提供一系列 SQL Server 工具,包括數據恢復功能。
  • SysTools SQL Recovery Tool — 以恢復損壞或損壞的 SQL 數據庫文件(.MDF 和 .NDF)而聞名,並將其恢復到可用狀態。
  • Kernel for SQL Database Recovery — 此工具可以從損壞和意外關機中恢復和修復 SQL Server 數據庫。
  • Aryson SQL Database Recovery — 另一款可以修復和恢復 SQL Server 中的 MDF 和 NDF 文件的工具。

結論

在本文中,我們介紹了當SQL數據庫被卡在“正在恢復”模式時意味著什麼,恢復的三個關鍵階段(分析、重做和撤消),以及您可以採取的措施將數據庫恢復為在線狀態。我們還討論了可能的原因,從大型事務日誌到太多虛擬日誌文件(VLF)。

如果您的SQL數據庫仍然卡在恢復模式中,請記住耐心是關鍵。避免運行RESTORE命令,因為這將重新啟動恢復過程。對於嚴重的問題,如果手動干預失敗,可以考慮使用專業的SQL數據庫修復工具來恢復數據。

如果您覺得這個指南有幫助,請與您的團隊分享,或留下一個帶有您的SQL恢復經驗的評論。

Source:
https://dzone.com/articles/resolving-sql-database-stuck-in-recovery-mode