Attribute | 值 |
---|---|
产品名称 | SQL Server |
事件 ID | 17204 |
事件源 | MSSQLSERVER |
组件 | SQLEngine |
符号名称 | DBLKIO_DEVOPENFAILED |
消息正文 | %ls:无法打开文件号 %d 的文件 %ls。 操作系统错误: %ls。 |
SQL Server 由于指定的 OS 错误而无法打开指定的文件。
当 SQL Server 无法打开数据库和/或事务日志文件时,Windows 应用程序事件或 SQL Server 错误日志中可能会出现错误 17204。 此错误如以下示例所示:
Error: 17204, Severity: 16, State: 1.
FCB::Open failed: Could not open file c:Program FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLdataMyDB_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 数据库之前,必须启动数据库。 数据库启动过程涉及以下几个步骤:
SQL Server 使用 CreateFile Windows API 函数打开属于数据库的文件。
消息 17204(和 17207)指示 SQL Server 尝试在启动过程中打开数据库文件时遇到错误。
这些错误消息包含下列信息:
尝试打开文件的 SQL Server 函数的名称。 通常在这些错误消息中看到如下函数名称:
状态信息,用于区分可生成此错误消息的函数中的多个位置
文件的完整物理路径
对应于文件的文件 ID
操作系统错误代码和错误说明。 在某些情况下,只会看到错误代码。
在这些错误消息中输出的操作系统错误信息是导致错误 17204 的根本原因。 这些错误消息的常见原因是权限问题或文件路径不正确。
要解决错误 17204,需要了解关联的操作系统错误代码并诊断该错误。 解决了操作系统错误后,可以尝试重新启动数据库(例如,使用 ALTER DATABASE SET ONLINE)或 SQL Server 实例,使受影响的数据库处于联机状态。 在某些情况下,可能无法解决操作系统错误。 如果是这样,就必须采取具体纠正措施。 本节将介绍这些操作。
如果 17204 错误消息仅包含错误代码,而不包含错误说明,则可以尝试使用操作系统 shell 中的 命令解决错误代码:net helpmsg <错误代码> 。 如果收到的错误代码是一个 8 位数状态代码,可以参考如何将 HRESULT 转换为 Win32 错误代码?之类的信息源解码这些状态代码,了解它们在操作系统中都代表什么错误。
如果收到 Access is Denied
操作系统错误 = 5,请考虑使用以下方法:
通过在 Windows 资源管理器中查看文件的属性,检查文件的权限设置。 SQL Server 使用 Windows 组对各种文件资源预配访问控制。 确保相应的组[名称类似于 SQLServerMSSQLUser$ComputerName$MSSQLSERVER 或 SQLServerMSSQLUser$ComputerName$InstanceName]具有对错误消息中提及的数据库文件的必要权限。 有关更多详细信息,请参阅配置数据库引擎访问的文件系统权限。 确保 Windows 组实际包含 SQL Server 服务启动帐户或服务 SID。
查看当前正在运行 SQL Server 服务的用户帐户。 可以使用 Windows 任务管理器来获取此信息。 查找可执行文件“sqlservr.exe”的“用户名”值。 另外,如果你最近更改了 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 FilesMicrosoft SQL ServerMSSQL10.SQL2008MSSQLDATAattach_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: DomainNameUserName
如果遇到 The system cannot find the file specified
OS 错误 = 3:
如果遇到 The process cannot access the file because it is being used by another process
操作系统错误 = 32: