SQL Server 恢復(fù)掛起解決方案
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
在數(shù)據(jù)庫的日常管理中,我們不可避免的會遇到,服務(wù)器突然斷電(沒有進行電源冗余),服務(wù)器崩潰或者 SQL Server 服務(wù)突然停掉,悲催的是日志文件也損毀了,SQL Server服務(wù)器起來之后,發(fā)現(xiàn)數(shù)據(jù)庫處于“恢復(fù)掛起”模式;更悲哀的是該數(shù)據(jù)庫沒有備份或者備份已經(jīng)比較久遠;最最可悲的是,已經(jīng)做好了丟失部分數(shù)據(jù)的準備,使用 DBCC CEHECKDB 的 REPAIR_ALLOW_DATA_LOSS 選項修復(fù)數(shù)據(jù)庫后,數(shù)據(jù)庫還是無法上線: 文件激活失敗。物理文件名稱'D:\data\archlog1.ldf'可能不正確。 無法重新生成日志,原因是數(shù)據(jù)庫關(guān)閉時存在打開的事務(wù)/用戶,該數(shù)據(jù)庫沒有檢查點或者該數(shù)據(jù)庫是只讀的。如果事務(wù)日志文件被手動刪除或者由于硬件或環(huán)境問題而丟失,則可能出現(xiàn)此錯誤。 消息 1813,級別 16,狀態(tài) 2,第 18 行 無法打開新數(shù)據(jù)庫 'PerfStats'。CREATE DATABASE 中止。 本文將分享兩種處理這種問題的方式,幫助您成功恢復(fù)數(shù)據(jù)庫。 模擬環(huán)境
首先,在數(shù)據(jù)庫 PerfStats 中創(chuàng)建 testObject 表,并插入所有對象數(shù)據(jù)。接下來我們運行插入腳本,使用多次 CROSS JOIN,以獲得足夠多的數(shù)據(jù),贏得時間,讓我們在關(guān)閉測試實例時,插入事務(wù)仍然在運行。這將使得數(shù)據(jù)庫處于不一致狀態(tài),需要在數(shù)據(jù)庫啟動時,執(zhí)行恢復(fù)。在另外一個 SSMS 窗口執(zhí)行如下關(guān)閉 SQL Server 實例的腳本:
停服后,將PerfStats 的日志文件改名或者移到其他路徑,重新啟動SQL Server 服務(wù),可以看到,PerfStats 數(shù)據(jù)庫處于“恢復(fù)掛起”狀態(tài): 此時,我們僅有一個孤立的,不一致的數(shù)據(jù)庫文件。 首先,讓我們通過刪除數(shù)據(jù)庫來清除系統(tǒng)分類。此時,我們必須先離線數(shù)據(jù)庫:
copy或者重命名數(shù)據(jù)文件,以備我們測試使用。然后通過刪除數(shù)據(jù)庫,來清除系統(tǒng)分類: DROP DATABASE PerfStats 使用 ATTACH_REBUILD_LOG 來重建日志文件:
文件激活失敗。物理文件名稱'D:\DB\PerfStats_log.ldf'可能不正確。 無法重新生成日志,原因是數(shù)據(jù)庫關(guān)閉時存在打開的事務(wù)/用戶,該數(shù)據(jù)庫沒有檢查點或者該數(shù)據(jù)庫是只讀的。如果事務(wù)日志文件被手動刪除或者由于硬件或環(huán)境問題而丟失,則可能出現(xiàn)此錯誤。 消息 1813,級別 16,狀態(tài) 2,第 7 行 無法打開新數(shù)據(jù)庫 'PerfStats'。CREATE DATABASE 中止。 到此為止,我們很可能只有去找備份文件還原了(如果有的話),否則可能就是一場大災(zāi)難了。 本文接下來將介紹兩種可以用來恢復(fù)數(shù)據(jù)庫的方式,以幫助您度過劫難。第一種方式是使用 CREATE DATABASE 語句中非歸檔的的命令。如你所知,微軟是不支持使用非歸檔的語句,因為使用這個語句一旦出了問題,他們是概不負責(zé)的。另一種方法更機智,不需要使用非歸檔功能。 方案一、未歸檔的ATTACH_FORCE_REBUILD_LOG命令 到目前為止,因為沒有日志文件,我們使用 CREATE DATABASE…FOR ATTACH 語句恢復(fù)數(shù)據(jù)庫會失敗。同時,因為數(shù)據(jù)庫中有打開的事務(wù),我們也不能使用 ATTACH_REBUILD_LOG 命令。有一個未歸檔的命令 ATTACH_FORCE_REBUILD_LOG 命令,正如其名稱所顯示,強制 CREATE DATABASE…FOR ATTACH 語句恢復(fù)數(shù)據(jù)庫,盡管其是孤立的、有打開事務(wù)的數(shù)據(jù)庫。當(dāng)然,也會創(chuàng)建一個新日志文件。
數(shù)據(jù)庫雖然恢復(fù)正常,但數(shù)據(jù)表對象仍然無效: 使用最小數(shù)據(jù)丟失的方式,修復(fù)數(shù)據(jù)庫:
看到,有380個一致性錯誤,僅僅修復(fù)兩個。
最后雖然修復(fù)好了數(shù)據(jù)庫,但數(shù)據(jù)庫最后一次checkpoint點之后的所有數(shù)據(jù)將會丟失。 方案二、不使用未歸檔的功能附加損毀的SQL Server數(shù)據(jù)庫 步驟一、創(chuàng)建新數(shù)據(jù)庫
步驟二、離線新數(shù)據(jù)庫
步驟三、將新數(shù)據(jù)庫的文件路徑指向我們的孤立的?mdf?文件,并且將日志文件指向一個不存在的文件
測試上線情況:
消息 5120,級別 16,狀態(tài) 101,第 39 行 無法打開物理文件“D:\DB\PerfStats.mdf”。操作系統(tǒng)錯誤 5:“5(拒絕訪問。)”。 文件激活失敗。物理文件名稱'D:\DB\PerfStats_log.ldf'可能不正確。 消息 5181,級別 16,狀態(tài) 5,第 39 行 無法重新啟動數(shù)據(jù)庫“PerfStats_Repair”。將恢復(fù)到以前的狀態(tài)。 消息 5069,級別 16,狀態(tài) 1,第 39 行 ALTER DATABASE 語句失敗。 無法打開物理文件“D:\DB\PerfStats.mdf”。操作系統(tǒng)錯誤 5:“5(拒絕訪問。)”。這是因為在移動MDF 文件時,Authenticated Users 的權(quán)限改變了,需要為其添加“完全控制”權(quán)限,右擊文件→屬性→點選 Authenticated Users 用戶→編輯→點選Authenticated Users→勾選下方“完全控制”右側(cè)“允許”下的多選框→確定即可 重新運行ONLINE 腳本。即使您不是 SQL Server 專家,也能夠猜測到,運行那個腳本會報錯。但是,如果您看一看下圖捕獲到的錯誤信息,您將會發(fā)現(xiàn),當(dāng)SQL Server 無法找到事務(wù)日志文件時(我們之前的操作是改變系統(tǒng)目錄,將其指向一個不存在的文件),會對日志文件進行重建。當(dāng)然,重建日志文件失敗,其錯誤信息和我們附加孤立的 *.mdf 文件相同,此時,和之前附件情況唯一不同的是,*.mdf 文件附加成功了,這離我們成功又進了一步。 文件激活失敗。物理文件名稱'D:\DB\PerfStats_log.ldf'可能不正確。 無法重新生成日志,原因是數(shù)據(jù)庫關(guān)閉時存在打開的事務(wù)/用戶,該數(shù)據(jù)庫沒有檢查點或者該數(shù)據(jù)庫是只讀的。如果事務(wù)日志文件被手動刪除或者由于硬件或環(huán)境問題而丟失,則可能出現(xiàn)此錯誤。 消息 5181,級別 16,狀態(tài) 5,第 39 行 無法重新啟動數(shù)據(jù)庫“PerfStats_Repair”。將恢復(fù)到以前的狀態(tài)。 消息 5069,級別 16,狀態(tài) 1,第 39 行 ALTER DATABASE 語句失敗。 此時數(shù)據(jù)庫 PerfStats_repair 數(shù)據(jù)庫處于“恢復(fù)還原”狀態(tài)。 步驟四、重建SQL Server 事務(wù)日志文件 現(xiàn)在,您會看到,重建 SQL Server 事務(wù)日志并不是非常復(fù)雜,但是,您必須接受將要丟失數(shù)據(jù)這一事實。事實上,只有在從備份恢復(fù)損壞的數(shù)據(jù)庫這條路被斷掉之后,您才能選擇使用這種方式。例如,如果一個事務(wù)在更新索引,并且更新操作執(zhí)行了一個頁拆分,你可能丟失之前提交的事務(wù),因為頁拆分是要進行日志記錄的,而這一記錄會因為日志文件的丟失而消失。 下面是恢復(fù)數(shù)據(jù)庫的腳本:
第一個DBCC 命令是將所有的輸出展示在查詢結(jié)果中,而不是記錄在錯誤日志中。接下來兩個腳本將數(shù)據(jù)庫分別置于緊急模式和單用戶模式,這是我們執(zhí)行 DBCC CHECKDB 的 REPAIR_ALLOW_DATA_LOSS 選項的前提。最后一句腳本是將數(shù)據(jù)庫恢復(fù)多用戶模式。 下圖框起來的部分說明錯誤日志已經(jīng)重建了: 文件激活失敗。物理文件名稱'D:\DB\PerfStats_log.ldf'可能不正確。 無法重新生成日志,原因是數(shù)據(jù)庫關(guān)閉時存在打開的事務(wù)/用戶,該數(shù)據(jù)庫沒有檢查點或者該數(shù)據(jù)庫是只讀的。如果事務(wù)日志文件被手動刪除或者由于硬件或環(huán)境問題而丟失,則可能出現(xiàn)此錯誤。 將禁用數(shù)據(jù)庫 "PerfStats_Repair" 中的 Service Broker,因為數(shù)據(jù)庫(316755B8-71DB-41B0-A4C5-1D076DB9EA0E)中的 Service Broker GUID 與 sys.databases (52C1EA48-8B63-446C-95AA-76D65C6DE5C5)中的不匹配。 警告: 數(shù)據(jù)庫 'PerfStats_Repair' 的日志已重新生成。已失去事務(wù)的一致性。RESTORE 鏈已斷開,服務(wù)器不再有以前的日志文件的上下文,因此您需要了解它們的內(nèi)容。應(yīng)運行 DBCC CHECKDB 驗證物理一致性。數(shù)據(jù)庫已置于 dbo-only 模式。在準備使數(shù)據(jù)庫可用時,需要重置數(shù)據(jù)庫選項,并刪除所有多余的日志文件。 至此,數(shù)據(jù)庫已經(jīng)恢復(fù)完成。 寫在最后,完成數(shù)據(jù)庫備份策略必不可少,備份、備份,還是備份?。。?/p> 該文章在 2024/8/24 12:09:05 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |