Sql-Server

數據庫無法升級,因為它是只讀的或具有隻讀文件。使數據庫或文件可寫,然後重新執行恢復

  • November 23, 2020

我收到了一個數據庫文件,載入它的說明是安裝 SQL Server 2005,然後使用 SQL Server Management Studio 附加它。

安裝完所有東西後,我嘗試附加 MDF 文件,但它告訴我:

文件“D:{folderName}{filename}.LDF”的目錄查找失敗,出現作業系統錯誤 21(未找到錯誤)

LDF 文件沒有隨數據庫一起提供,所以大概應該是自動生成的。

現在,D 驅動器是我的 CD 驅動器所在的位置,所以它不會在那裡找到任何東西。嘗試在那裡創造任何東西也不會有任何運氣。

  1. 為什麼它試圖在特定路徑中查找日誌文件?為什麼不在數據庫文件的位置?
  2. 我怎樣才能附加這個數據庫?

我意識到,當我選擇要附加的數據庫時,“數據庫詳細資訊”下會出現三個條目。MDF、NDF 和 LDF。LDF的“目前文件路徑”指向上面的D盤路徑,所以我把它去掉了。

這一次,當我點擊“OK”時,我收到了不同的錯誤資訊:

數據庫無法升級,因為它是只讀的或具有隻讀文件。

使數據庫或文件可寫,然後重新執行恢復。

文件啟動失敗。物理名稱 D:{folder}{file}.LDF 可能不正確。

新的日誌文件“…”已創建。(Microsoft SQL Server,錯誤:3415)

所以現在它在與數據庫文件相同的文件夾中創建了一個新的日誌文件,這很好,但似乎存在安全問題。

附加資訊:

  • 說明要求我使用登錄名“sa”,這似乎是 sysadmin 帳戶。我使用該登錄名連接到我的 SQL Server 實例。
  • 我檢查了文件屬性,它不是只讀的。該目錄也不是只讀的。允許所有 ACL。
  • 我無法附加數據庫。當我嘗試附加它時,它會拋出一條帶有“附加數據庫失敗”的錯誤消息。
  • 關閉 SSMS 並以管理員身份重新打開它沒有任何區別。
  • select SERVERPROPERTY('ProductVersion')返回 9.00.4035.00。數據庫附帶的另一個文件名為“dbdata.ini”,上面寫著“IsSql2000 = 1”,因此大概是要在 SQL Server 2000 中載入它。我看看能否讓它在 2000 上執行。

這不是訪問問題。問題是您將數據庫附加到比.mdf最初附加到的實例更高版本的 SQL Server 上,並且它是只讀的。SQL Server 正在嘗試將數據庫升級為附加的一部分,但由於數據庫處於只讀模式而無法升級。

如果您的數據庫在READ_ONLY其中(根據您的錯誤消息聽起來就是這種情況),那麼您需要所有文件(日誌和數據)按照 Technet 文件附加它。如果您查看該FOR ATTACH子句,它會明確描述:

…對於只讀數據庫,無法重建日誌,因為無法更新主文件。因此,當您附加一個日誌不可用的只讀數據庫時,您必須在FOR ATTACH子句中提供日誌文件或文件。

您需要數據庫的附件.ldf。我會聯繫提供數據庫的人並要求他們提供.mdf.ldf文件。然後,您可以使用以下語法附加它:

CREATE DATABASE [foo]
ON (FILENAME='<<path to mdf>>')
LOG ON (FILENAME='<<path to ldf>>')
FOR ATTACH;

READ_ONLY不附加狀態就無法從數據庫中刪除狀態,因為它儲存在數據庫的元數據中。要更改它,數據庫需要線上並附加。

另一種選擇是要求備份數據庫。如果您正在執行數據庫還原而不是附加,則可以更輕鬆地解決其中一些問題。

引用自:https://dba.stackexchange.com/questions/63255