MSSQLSERVER_17204

適用於:SQL Server

詳細資料

屬性
產品名稱 SQL Server
事件識別碼 17204
事件來源 MSSQLSERVER
元件 SQLEngine
符號名稱 DBLKIO_DEVOPENFAILED
訊息文字 %ls:檔案編號 %d 無法開啟檔案 %ls。 作業系統錯誤: %ls。

說明

由於指定的 OS 錯誤,SQL Server 無法開啟指定的檔案。

當 SQL Server 無法開啟資料庫和/或交易記錄檔時,您可能會在 Windows 應用程式事件或 SQL Server 錯誤記錄檔中看到錯誤 17204。 以下是錯誤可能看起來如下的範例:

Error: 17204, Severity: 16, State: 1.
FCB::Open failed: Could not open file c:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\data\MyDB_Prm.mdf for file number 1.  OS error: 5(Access is denied.).

您可能會在 SQL Server 實例啟動程式期間看到這些錯誤,或嘗試啟動資料庫的任何資料庫作業(例如 ALTER DATABASE)。 在某些情況下,您可能會看到 17204 和 17207 錯誤,在其他情況下,您可能會只看到其中一個錯誤。

如果使用者資料庫發生這些錯誤,該資料庫將會處於RECOVERY_PENDING狀態,而且應用程式無法存取資料庫。 如果系統資料庫遇到這些錯誤,SQL Server 實例將不會啟動,而且您無法連線到這個 SQL Server 實例。 系統資料庫的失敗也可能導致 SQL Server 容錯移轉叢集資源離線。

原因

在使用任何 SQL Server 資料庫之前,必須先啟動資料庫。 資料庫啟動程式牽涉到:

  1. 初始化代表資料庫和資料庫檔案的各種資料結構
  2. 開啟屬於資料庫的所有檔案
  3. 在資料庫上執行復原

SQL Server 會使用 CreateFile Windows API 函式來開啟屬於資料庫的檔案。

訊息 17204 (和 17207) 表示 SQL Server 嘗試在啟動程式期間開啟資料庫檔案時發生錯誤。

這些錯誤訊息包含下列資訊:

  1. 嘗試開啟檔案的 SQL Server 函式名稱。 您通常在這些錯誤訊息中觀察到的函式名稱如下:

    • FCB::Open - SQL Server 嘗試開啟檔案時發生錯誤
    • FileMgr::StartPrimaryDataFiles - 屬於主要檔案群組的主要資料檔案或檔案
    • FileMgr::StartSecondaryDataFiles - 屬於次要檔案群組的檔案
    • FileMgr::StartLogFiles - 交易記錄檔
    • STREAMFCB::Startup - SQL FileStream 容器
    • FCB::RemoveAlternateStreams
  2. 狀態資訊會區分函式內可產生此錯誤訊息的多個位置

  3. 檔案的完整實體路徑

  4. 對應至檔案的檔案識別碼

  5. 作業系統錯誤碼和錯誤描述。 在某些情況下,您只會看到錯誤碼。

這些錯誤訊息中列印的作業系統錯誤資訊是導致錯誤 17204 的根本原因。 這些錯誤訊息的常見原因是許可權問題或檔案的路徑不正確。

使用者動作

  1. 解決錯誤 17204 牽涉到了解相關聯的作業系統錯誤碼,並診斷該錯誤。 一旦解決作業系統錯誤狀況,您就可以嘗試重新開機資料庫(例如使用 ALTER DATABASE SET ONLINE)或 SQL Server 實例,讓受影響的資料庫上線。 在某些情況下,您可能無法解決作業系統錯誤。 然後,您必須採取特定的更正動作。 我們將在本節中討論這些動作。

  2. 如果 17204 錯誤訊息只包含錯誤碼,而不是錯誤描述,則可以嘗試使用作業系統殼層中的 命令來解決錯誤碼:net helpmsg < 錯誤碼 > 。 如果您收到 8 位數的狀態碼作為錯誤碼,則可以參考資訊來源,例如 如何將 HRESULT 轉換成 Win32 錯誤碼? ,將這些狀態碼解碼解碼為 OS 錯誤。

  3. 如果您收到 Access is Denied 作業系統錯誤 = 5,請考慮下列方法:

    • 查看 Windows 檔案總管中的檔案屬性,以檢查檔案集的許可權。 SQL Server 會使用 Windows 群組在各種檔案資源上布建存取控制。 請確定適當的群組 [名稱如 SQLServerMSSQLUser$ComputerName$MSSQLSERVER 或 SQLServerMSSQLUser$ComputerName$InstanceName] 具有錯誤訊息中所提及之資料庫檔案的必要許可權。 如需詳細資訊,請參閱 設定 Database Engine 存取 的檔案系統許可權。 確定 Windows 群組實際上包含 SQL Server 服務啟動帳戶或服務 SID。

    • 檢閱目前執行 SQL Server 服務的使用者帳戶。 您可以使用 Windows 工作管理員來取得此資訊。 尋找可執行檔 「sqlservr.exe」 的 「User Name」 值。 此外,如果您最近變更 SQL Server 服務帳戶,請知道執行這項作業的支援方式是透過 SQL Server 組態管理員公用程式。 如需詳細資訊,請于 SQL Server 組態管理員 取得。

    • 根據作業類型 - 在伺服器啟動期間開啟資料庫、附加資料庫、資料庫還原等 - 用於模擬和存取資料庫檔案的帳戶可能會有所不同。 檢閱保護資料和記錄檔 主題 ,以瞭解哪些作業會設定哪些許可權和哪些帳戶。 使用 Windows SysInternals 進程監視器 之類的工具,瞭解檔案存取是否發生在 SQL Server 實例服務啟動帳戶 [或服務 SID] 或模擬帳戶的安全性內容之下。

      如果 SQL Server 模擬執行 ALTER DATABASE 或 CREATE DATABASE 作業之使用者的認證,您會在進程監視器工具中注意到下列資訊(例如):

      Date & Time:      3/27/2010 8:26:08 PM
      Event Class:        File System
      Operation:          CreateFile
      Result:                ACCESS DENIED
      Path:                  C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\attach_test.mdf
      TID:                   4288
      Duration:             0.0000366
      Desired Access:Generic Read/Write
      Disposition:        Open
      Options:            Synchronous IO Non-Alert, Non-Directory File, Open No Recall
      Attributes:          N
      ShareMode:       Read
      AllocationSize:   n/a
      Impersonating: DomainName\UserName
      
  4. 如果您收到 The system cannot find the file specified OS 錯誤 = 3:

    • 從錯誤訊息檢閱完整路徑
    • 確定磁片磁碟機和資料夾路徑可從 Windows 檔案總管看見且可存取
    • 檢閱 Windows 事件記錄檔,找出此磁片磁碟機是否有任何問題
    • 如果路徑不正確,而且此資料庫已存在於系統中,您可以使用移動資料庫檔案 主題 中所述的方法來變更資料庫檔案路徑。 您可能必須使用此程式,特別是針對遇到 17204 或 17207 的系統資料庫檔案,而且您正經歷災害復原案例,其中指定的磁片磁碟機無法使用。 本主題也會說明如何識別各種系統資料庫的目前位置 [master、model、tempdb、msdb 和 mssqlsystemresource]。
    • 如果您因為資料庫檔案遺失而看到此錯誤,您必須從有效的備份還原資料庫。
      • 如果與錯誤相關聯的資料庫檔案屬於次要檔案群組,則您可以選擇性地將該檔案群組標示為離線,讓資料庫上線,然後單獨執行該檔案群組的還原。 如需詳細資訊,請參閱 ALTER DATABASE 檔案和檔案群組選項 (Transact-SQL) 主題 的 OFFLINE 一節。
      • 如果產生錯誤的檔案是交易記錄檔,請檢閱 CREATE DATABASE (Transact-SQL) 主題 一節下的資訊,以瞭解如何重新建立遺失的交易記錄檔。
    • 請確定 SQL Server 嘗試存取這些位置上的資料庫檔案之前,可以使用任何磁片或網路位置 [例如 iSCSI 磁片磁碟機]。 如有需要,請在叢集管理員或服務控制管理員中建立必要的相依性。
  5. 如果您收到 The process cannot access the file because it is being used by another process 作業系統錯誤 = 32:

    • 使用來自 Windows Sysinternals 的進程總 管或 控制碼 之類的 工具,找出另一個進程或服務是否已取得此資料庫檔案的獨佔鎖定
    • 停止該程式存取 SQL Server 資料庫檔案。 常見範例包括防毒程式(請參閱下列 知識庫文章 中的檔案排除指引)
    • 在叢集環境中,請確定先前擁有節點的 sqlservr.exe 進程實際上已將控制碼釋放至資料庫檔案。 這通常不會發生,但叢集或 I/O 路徑的設定錯誤可能會導致這類問題。