--附加數據庫失敗
1.產生失敗的原因
比如有個數據庫,名叫HIMS,它的數據文件HIMS_Data.mdf和日志文件HIMS_Log.ldf,都放在路徑'c:/Program Files/Microsoft SQL Server/MSSQL/data/'下。
但是這個數據庫天天跑日志,會產生上G的日志,現在通過企業管理器把數據庫分離后,在企業管理器直接附加數據文件HIMS_Data.mdf,會產生如下錯誤:
----------------------------------------------------------------------------------------------------------------------------------------
錯誤 1813: 未能打開新數據庫 'HIMS'。CREATE DATABASE 將終止。
設備激活錯誤。物理文件名 'C:/Program Files/Microsoft SQL Server/MSSQL/data/HIMS_Log.ldf' 可能有誤。
----------------------------------------------------------------------------------------------------------------------------------------
從而無法將數據庫正常附加到SQL Server 2000,正常情況下這樣操作是沒有問題的,SQL Server會重新生成日志文件,但是因為之前出現了磁盤空間不足,日志文件不完整,從而造成了無法正常附加。
2.解決辦法
(1)通過企業管理器和SQL語句來解決
<1>在企業管理器建立數據庫HIMS,這時在路徑下C:/Program Files/Microsoft SQL Server/MSSQL/data/ 會產生兩個文件:HIMS_Data.mdf和HIMS_Log.ldf
<2>停止SQL服務(即將電腦右下角SQLSERVER服務管理器停止)
<3>在路徑C:/Program Files/Microsoft SQL Server/MSSQL/data/下刪除日志文件HIMS_Log.ldf,將先前要附加的數據文件HIMS_Data.mdf替代現在的HIMS_Data.mdf
<4>重新啟動SQL服務,在企業管理器中刷新,發現HIMS數據庫是'置疑'
<5>在含有該HIMS數據庫的SQLServer注冊里(比如:(LOCAL)(Windows NT)),右鍵,查看'屬性',點擊'服務器設置',將 '服務器行為'的第一項'允許對系統目錄直接進行修改?? (M)'的框打上勾
<6>設置數據庫未緊急修復模式
?? 打開查詢分析器,在master數據庫下執行語句:update sysdatabases set status = -32768 where dbid = DB_ID('HIMS')
<7>重建數據庫日志文件
?? 還在master數據庫下執行語句:dbcc rebuild_log('HIMS','C:/Program Files/Microsoft SQL Server/MSSQL/data/HIMS_Log.ldf')
?? 這時會出現兩種執行結果:
?? A.如果出現下列描述,則繼續執行<8>以后的語句
???? 警告: 數據庫 'HIMS' 的日志已重建。已失去事務的一致性。應運行 DBCC CHECKDB 以驗證物理一致性。將必須重置數據庫選項,并且可能需要刪除多余的日志文件。
?????????? DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。
?? B.如果出現下列描述,則重新從<1>執行
???? 服務器: 消息 5030,級別 16,狀態 1,行 1
???????????? 未能排它地鎖定數據庫以執行該操作。
???????????? DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。
<8>驗證數據庫一致性(該步驟可省略)
?? 在master數據庫下執行語句:dbcc checkdb('HIMS')
<9>設置數據庫為正常狀態
?? 在master數據庫下執行語句:sp_dboption 'HIMS' ,'dbo use only','false'
<10>將步驟<5>中的勾去掉
(2)通過SQL語句來解決
?? 前4步同方法(1)一樣,然后在查詢分析器master數據庫下執行下列語句:
?use master???
?go???
?sp_configure 'allow updates',1 reconfigure with override???
?go???
?update sysdatabases set status =32768 where name='置疑的數據庫名'??
?go???
?sp_dboption '置疑的數據庫名', 'single user', 'true'??
?go???
?dbcc checkdb('置疑的數據庫名')????
?go???
?update sysdatabases set status =28 where name='置疑的數據庫名'??
?go???
?sp_configure 'allow updates', 0 reconfigure with override???
?go????
?sp_dboption '置疑的數據庫名', 'single user', 'false'??
?go
?? 完成后一般就可以訪問數據庫中的數據了。這時,數據庫本身一般還有問題,解決辦法是:利用數據庫的腳本創建一個新的數據庫,然后通過DTS將數據導進去就行了.