SQL Server服务启动失败,如何修改sys.master_files的physical_name?
问题本质
你遇到的是系统级数据库(model、msdb等)的物理文件路径被配置到了不存在的D盘,导致MSSQLSERVER服务启动失败。sys.master_files是系统视图,不能用ALTER TABLE直接修改,必须通过单用户模式启动实例后完成路径修正。
操作步骤
1. 停止SQL Server服务
打开服务管理器(Win+R输入services.msc),找到MSSQLSERVER服务,确保它处于停止状态。
2. 以单用户模式启动SQL Server
打开管理员身份的命令提示符,执行以下命令(默认实例直接用MSSQLSERVER,命名实例替换为你的实例名):
sqlservr.exe -s MSSQLSERVER -m -d "C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\master.mdf" -l "C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\mastlog.ldf"
-m:启用单用户模式,只允许一个连接-d:指定master数据文件的有效路径(你从sysfiles中获取的正确路径)-l:指定master日志文件的有效路径
执行后保持该命令提示符窗口打开,不要关闭。
3. 连接到实例
打开另一个管理员身份的命令提示符,执行:
sqlcmd
默认实例直接用这个命令,命名实例需要加-S <实例名>。
4. 修改系统数据库文件路径
在SQLCMD窗口中,输入以下语句(将<新路径>替换为你实际要使用的磁盘路径,比如上面的DATA目录),每段输入完后敲GO执行:
修正model数据库路径
ALTER DATABASE model MODIFY FILE (NAME = modeldev, FILENAME = '<新路径>\model.mdf'); ALTER DATABASE model MODIFY FILE (NAME = modellog, FILENAME = '<新路径>\modellog.ldf'); GO
修正msdb数据库路径
ALTER DATABASE msdb MODIFY FILE (NAME = MSDBData, FILENAME = '<新路径>\MSDBData.mdf'); ALTER DATABASE msdb MODIFY FILE (NAME = MSDBLog, FILENAME = '<新路径>\MSDBLog.ldf'); GO
修正tempdb数据库路径(建议同步修正)
ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = '<新路径>\tempdb.mdf'); ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = '<新路径>\templog.ldf'); GO
5. 复制物理文件到新路径
找到错误路径中提到的model.mdf、modellog.ldf、MSDBData.mdf、MSDBLog.ldf文件,复制到你指定的<新路径>下。如果找不到这些文件,直接运行SQL Server安装程序,选择修复选项,让安装程序重新生成系统数据库到正确路径。
6. 修改注册表配置
打开注册表编辑器(Win+R输入regedit),定位到对应实例的参数路径(替换<实例ID>,比如MSSQL16.MSSQLSERVER):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<实例ID>\MSSQLServer\Parameters
修改SQLArg0和SQLArg1的数值数据:
SQLArg0对应-d参数,设置为master.mdf的新路径SQLArg1对应-l参数,设置为mastlog.ldf的新路径
同时检查其他SQLArg项,确保没有指向无效的D盘路径。
7. 重启服务
关闭之前的单用户模式命令提示符窗口,回到服务管理器启动MSSQLSERVER服务,此时服务应该能正常启动。
验证
服务启动后,连接实例执行以下语句确认路径已修正:
SELECT name, physical_name FROM sys.master_files;
内容的提问来源于stack exchange,提问作者Hearner

