一、问题现象
某台服务器的 SQL Server 实例突然无法启动,具体表现为:
- 在「服务」管理器中点击 "启动",几秒后报错:"服务没有响应控制功能"(错误代码1053)。
- 查看 SQL Server 错误日志,出现经典的两条报错:
- 错误 5120:
Unable to open the physical file "...mdf". Operating system error 5: "5(Access is denied)." - 错误 17204:
FCB::Open failed: Could not open file ... Operating system error 5(Access is denied).
- 错误 5120:
- 事件查看器 → 应用程序日志中,SQL Server 记录启动即失败、无法打开数据库文件。
出现error 5(Access is denied,访问被拒绝),基本可以锁定方向:不是文件损坏,而是权限问题。
二、根本原因
SQL Server 的数据库文件(.mdf/.ldf)存放在数据目录...\MSSQL\DATA下,服务进程必须对这个目录拥有读取 + 写入权限才能打开数据库。
三、操作步骤
REM 以管理员身份运行以下所有命令
REM 1. 停止 SQL Server
net stop MSSQL$SQL2016
REM 2. 如果上面的命令失败,使用 sc
sc stop MSSQL$SQL2016
REM 3. 等待几秒
timeout /t 5
REM 4. 授权 DATA 文件夹
icacls "C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA" /grant "NT Service\MSSQL$SQL2016":F /T
REM 5. 启动 SQL Server
net start MSSQL$SQL2016
REM 6. 验证
icacls "C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA"
四、一键批处理脚本
把下面内容保存为fix_sql_permission.bat,右键 → 以管理员身份运行:
@echo off REM ============================================ REM SQL Server 服务无法启动 - DATA 目录权限修复 REM 必须以管理员身份运行! REM ============================================ set "DATA_DIR=C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA" set "SVC=MSSQL$SQL2016" set "SVC_ACCOUNT=NT Service\MSSQL$SQL2016" echo [1/4] 停止服务 %SVC% ... net stop %SVC% if errorlevel 1 ( echo net stop 失败,改用 sc stop ... sc stop %SVC% ) echo [2/4] 等待服务完全停止 ... timeout /t 5 /nobreak >nul echo [3/4] 授予 DATA 目录权限给 %SVC_ACCOUNT% ... icacls "%DATA_DIR%" /grant "%SVC_ACCOUNT%":F /T echo [4/4] 启动服务 %SVC% ... net start %SVC% echo. echo ====== 权限验证 ====== icacls "%DATA_DIR%" echo ====================== echo 修复完成!可用 sc query %SVC% 确认状态。 pause