程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 只有mdf文件的數據庫附加失敗的修復

只有mdf文件的數據庫附加失敗的修復

編輯:關於SqlServer

今天修復了一個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中設置的“允許對系統目錄直接修改”一項恢復。怎麼做當然不用再多說啦。也可以執行語句:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved