今天修復了一個SQL數據庫, 感覺不錯,記下過程以備參考。
因數據庫日志太大,管理員將數據庫分離,刪除日志文件.ldf文件後再附加mdf文件,卻報錯,通常情況下是能夠順利附加的,可能mdf文件有問題導致附加失敗,由於管理員在操作前未將數據庫備份,最新的備份也是前一天晚上的,當天白天的數據沒有備份,現在數據無法恢復,很是著急。
附加時報如下錯誤:
服務器: 消息 1813,級別 16,狀態 2,行 1
未能打開新數據庫 'test'。CREATE DATABASE 將終止。
設備激活錯誤。物理文件名 "d:\data\test_log.LDF' 可能有誤。
現在只有手動一步一步修復了,在網上搜到一種解決辦法,試了以後成功了,現在記下步驟,路徑和文件名大家依自己實際情況而定。
步驟:
A、用“企業管理器”新建一個同名的數據。可以修改默認路徑,為表述方便,我使用D:\data\,數據文件名test.mdf,日志文件名test_log.ldf
B、停止SQL服務
C、刪除test_log.ldf文件,將新建的test.mdf文件用舊的test.mdf文件替換。
D、啟動SQL服務。進入企業管理器後發現test數據顯示為“置疑”,此後保證無人連接上此數據庫,並不做任何操作。
E、設置test數據庫允許直接操作系統表。此操作可以在SQL Server Enterprise Manager裡面選擇數據庫服務器,按右鍵,選擇“屬性”,在“服務器設置”頁面中將“允許對系統目錄直接修改”一項選中。也可以使用如下語句來實現。我在實際操作的時候沒有使用命令,命令方式大家可以自己測試 ^_^
use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go
F、設置test數據庫為緊急修復模式。在查詢分析器中執行如下語句:
update sysdatabases set status=-32768 where dbid=DB_ID('test')
執行後在企業管理器中刷新後會發現ttdb數據庫顯示為“只讀\置疑\脫機\緊急模式”。可以看到數據庫裡面的表,但是僅僅有系統表。
G、重建數據庫日志文件。在查詢分析器中執行如下語句:
dbcc rebuild_log('test','d:\Data\test_log.ldf')
執行之前必須退出企業管理器,並且沒有人連接些數據庫。否則會報如下錯誤:
服務器: 消息 5030,級別 16,狀態 1,行 1
未能排它地鎖定數據庫以執行該操作。
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。
正常的消息:
警告: 數據庫 'test' 的日志已重建。已失去事務的一致性。應運行 DBCC CHECKDB 以驗證物理一致性。將必須重置數據庫選項,並且可能需要刪除多余的日志文件。
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。
此時打開在SQL Server Enterprise Manager裡面會看到數據庫的狀態為“只供DBO使用”。可以訪問數據庫裡面的用戶表了。
H、驗證數據庫一致性(可省略,不過我忠實地執行了^_^),查詢分析器中執行:
dbcc checkdb('test')
報出了每個表的執行情況後,最後報:
CHECKDB 發現了 0 個分配錯誤和 0 個一致性錯誤(在數據庫 'test' 中)。
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。
I、設置數據庫為正常狀態。執行語句:
sp_dboption 'test','dbo use only','false'
走到這一步,如果沒有報錯,已經可以長長舒一口氣了,去喝口水吧。:P
J、最後一步,我們要將步驟E中設置的“允許對系統目錄直接修改”一項恢復。怎麼做當然不用再多說啦。也可以執行語句: