2011年8月11日 星期四

檔案無法存取、記憶體或磁碟空間不足,因此無法開啟資料庫'ooxx'。詳細資訊請參閱SQL Server 錯誤記錄檔。(Microsoft SQL Server, 錯誤: 945)

今天早上同事跟我講資料庫"挫屎"了,一大早就被嚇到,看看了SQL SERVER的ErrorLog發現錯誤訊息如下:
檔案無法存取、記憶體或磁碟空間不足,因此無法開啟資料庫'ooxx'。詳細資訊請參閱SQL Server 錯誤記錄檔。(Microsoft SQL Server, 錯誤: 945)
我看了一下記憶體與磁碟空間都是ok的,但是資料庫少了ldf檔。
於是我想重建LDF檔,參考了derrickBLOG上的方法
結果出現以下的錯誤訊息:
無法開啟新資料庫'ooxx'CREATE DATABASE 已經中止。檔案啟動錯誤。實體檔案名稱"C:\Microsoft SQL Server\MSSQL.1\MSSQL\Data\ooxx_log.LDF" 可能不正確。資料庫並未徹底關機,因此無法重建記錄。(Microsoft SQL Server, 錯誤: 1813)
有夠給他ORZ的。
之前也有遇過類似的問題但是它的錯誤訊息是:
無法重建記錄,因為關閉資料庫時仍有開啟的交易/使用者、資料庫未發生檢查點,或資料庫是唯讀的。如果手動刪除交易記錄檔,或因硬體或環境失敗而遺失交易記錄檔,就可能發生這種錯誤。訊息 1813,層級 16,狀態 2,行 1
之前遇過的這個錯誤訊息是參考derrick的BLOG方法解決的。
它的錯誤訊息也是屬於Microsoft SQL Server, 錯誤: 1813,所以我推想用他的方法或許也能解。

於是我做了以下的步驟:
0.假設原來的資料庫叫Test
1.停止SQL SERVER,把原來的資料庫的Test.MDF檔搬到其他位置
2.開啟SQL SERVER,刪掉舊有的資料庫Test
3.建立一個新的資料庫,DB名稱和MDFLDF名稱都跟之前就資料庫一樣。
4.再次停止SQL SERVER,把舊有資料庫的MDF檔覆蓋到新的資料庫的MDF
5.再次開啟SQL SERVER,設定Test資料庫狀態為EMERGENCY
語法為:ALTER DATABASE Test SET EMERGENCY
6.設定Test資料庫模式為SINGLE_USER。
語法為:ALTER DATABASE Test SET SINGLE_USER
7.執行 DBCC CHECKDB 搭配使用 REPAIR_ALLOW_DATA_LOSS 參數修復資料庫。
語法為:DBCC CHECKDB (Test, REPAIR_ALLOW_DATA_LOSS)
REPAIR_ALLOW_DATA_LOSS 參數
指定的資料庫必須為單一使用者模式,才能使用。
嘗試修復所有報告的錯誤。這些修復可能會造成某些資料的遺失。
8.使用 DBCC CHECKDB (Test) 檢查資料庫中所有物件的邏輯完整性和實體完整性
9.設定Test資料庫模式為MULTI_USER
語法為:ALTER DATABASE Test SET MULTI_USER;
10.搞定收工。

3 則留言:

  1. 用你的方法解決了,非常感謝!

    回覆刪除
  2. 感謝你的分享,不過我還是沒有成功!但我用了一個更瞎的方式才成功,就是到某台正常的電腦上,先建好資料庫,再扣到有問題的電腦,用資料庫附加上去的方式,才能正常使用資料庫。

    回覆刪除
  3. Now users can fix SQL error 945 and repair the damaged database of SQL Server with the help of SQL database recovery software. Get more information: http://www.sqlrecoverysoftware.net/blog/sql-error-926-and-945.html

    回覆刪除