Sql-Server

如何從 SQL Server 日誌文件驅動器崩潰中恢復?

  • May 18, 2022

假設數據文件在 D: 並且日誌文件在 E:

假設 E 驅動器崩潰並且日誌文件 (.ldf) 失去。我將一個新的空磁碟附加到 E: 並啟動 sql server。

啟動時,SQL Server 將意識到 .mdf 文件存在,但日誌文件不存在。由於缺少日誌文件,SQL 伺服器將無法執行任何撤消/重做恢復步驟,並將數據庫視為可疑對象。

注意:我試過這個並註意到數據庫進入了可疑模式。這裡的最佳做法是使用備份(完整 + tlog)來恢復數據庫。在我的情況下,我從上午 12 點開始進行完整備份,但沒有 tlog 備份。如果我從上午 12 點的備份中恢復,那麼我會失去一整天的數據(假設崩潰發生在中午)。我正在嘗試通過利用現有數據文件來考慮如何在這種情況下進行。

  1. 在這種情況下如何恢復數據庫?
  2. 說數據失去只是那些在 tlog 文件中但未寫入磁碟的事務是否正確?

在這種情況下如何恢復數據庫?

從備份中恢復。繼續閱讀,您就會明白為什麼我們推薦還原路線。

說數據失去只是那些在 tlog 文件中但未寫入磁碟的事務是否正確?

我不會那樣說的。正如您所指出的,您的數據庫是可疑的。所以你不能訪問它。無論您採取何種方式“強制”該數據庫可訪問,都會給您一個不一致的數據庫。舉幾個例子:

  1. 物理不一致:例如為修改索引而寫入的頁面,而沒有寫入相應的數據頁面。
  2. 邏輯不一致:例如沒有訂單明細行的訂單。或者反過來。

所有的賭注都取消了。因此,如果您在沒有日誌文件的情況下強制訪問未完全關閉的數據庫,則需要在上面進行整理。

可以使用 DBCC CHECKDB 和 REPAIR_ALLOW_DATA_LOSS 處理物理不一致。它當然會丟棄任何看起來不正確的頁面。你準備好這樣做了嗎?此外,這可能會增加更多邏輯上的不一致(對於您在上面第 2 步中已有的內容)。

邏輯不一致由您處理。數據庫是否足夠小,可以遍歷所有數據以確保其邏輯一致?可能不是。您現在明白了為什麼要進行還原,以及為什麼頻繁的日誌備份如此重要。

至於如何在這種狀態下強制訪問數據庫,有兩種選擇:

  1. 使用 ATTACH_FORCE_REBUILD_LOG 附加它。這沒有記錄,所以我不會走這條路。
  2. 使用 ALTER DATABASE 將其設置為 EMERGENCY 模式。然後使用 REPAIR_ALLOW_DATA_LOSS CHECKDB。此處描述了此過程。

取消附加 mdf 文件後,您可以嘗試使用此未記錄的命令。

USE master;

CREATE DATABASE [Mydb]
   ON  ( FILENAME = N'E:\xxx\Mydb.mdf' )
   FOR ATTACH_FORCE_REBUILD_LOG;
GO

這將重新建構一個新的 ldf 文件。mdf 文件中剩餘的內容留給“盡最大努力”。

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