SQL Server 2008 R2 服务启动失败排查:错误1069/3417修复与master重建
简介这份PDF文档聚焦SQL Server 2008 R2数据库服务无法启动的典型故障面向数据库运维人员、后端开发者和正在学习SQL Server的学生帮助其快速定位并解决服务启动失败问题。文档围绕三类常见场景展开远程过程调用失败多因Visual Studio 2012自动安装的SQL Server 2012 Express LocalDB引发冲突、VIA协议异常导致服务无法开启以及用户名更改后服务登录失败并给出对应的排查思路与处理办法。资源包内共1个PDF文件大小约117KB内容以故障现象、日志分析和解决步骤为主篇幅精炼、便于随查随用。目前已有1630人学习下载适合遇到SQL Server服务启动报错、需要快速排错参考的读者收藏备用。1. SQL Server 2008 R2 服务起不来先别急着重装九成问题出在这三个地方早上到公司业务系统连不上数据库远程上去一看SQL Server (MSSQLSERVER) 服务是停止状态手动点启动转两圈弹个框“Windows 无法启动 SQL Server (MSSQLSERVER) 服务(位于 本地计算机 上)。错误 1069由于登录失败而无法启动服务。” 或者更干脆错误 3417、错误 1067进程意外终止。这时候很多人第一反应是重装但重装一次两三个小时起步数据还得先备份风险极大。SQL Server 2008 R2 虽然已经是很老的版本但大量制造业、医疗、政企的老系统还在跑数据库服务无法启动是运维里最高频的故障之一。这篇内容就是把这几年我处理过的启动失败案例拆开从日志定位到参数修复给你一套能直接照着做的排查路径。适合正在维护老版本 SQL Server 的运维和开发也适合刚接手一套遗留系统、对着一堆报错不知道从哪下手的同行。2. 先看懂错误码SQL Server 2008 R2 启动失败的四个高频根因2.1 错误日志在哪怎么读才有用SQL Server 启动失败时图形界面弹的框信息量极少真正有用的信息在错误日志里。默认路径是C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\ERRORLOG注意这个文件没有扩展名直接用记事本打开。如果实例是命名实例路径里的MSSQL10_50.MSSQLSERVER会变成MSSQL10_50.实例名。除了 ERRORLOG同目录下还有 ERRORLOG.1、ERRORLOG.2 等历史轮转文件当前这次启动失败看 ERRORLOG 就行。打开之后从下往上读找启动时间点附近的记录。常见的几类关键信息FCB::Open failed: Could not open file ... for file number 1. OS error: 5(拒绝访问。)—— 权限问题SQL Server detected a logical consistency-based I/O error—— 数据文件损坏Could not find the error log file—— 日志目录被删或路径不对Login failed for user NT AUTHORITY\NETWORK SERVICE—— 服务账户权限丢失The SQL Server (MSSQLSERVER) service terminated with service-specific error 3417—— master 数据库损坏或文件丢失提示如果 ERRORLOG 本身都打不开说明 SQL Server 的服务账户连日志目录都没权限直接跳到 2.3 看权限修复。读日志的时候有个血泪经验不要只看最后一行。SQL Server 启动是一个多阶段过程最后一行报错往往是前面某个环节失败的连锁反应。比如 master 数据库文件被误删日志里会先报找不到文件再报无法打开 master最后才是服务终止。找到第一个报错点那才是根因。2.2 用 net start 和 sc query 确认服务状态图形界面有时候会骗人服务显示“正在启动”但实际已经卡死。用命令行确认更准sc query MSSQLSERVER输出里关注STATE字段如果是STOP_PENDING说明服务卡在停止过程中这时候直接再点启动是没用的得先杀掉进程。用tasklist | findstr sqlservr找到 sqlservr.exe 的 PID然后taskkill /PID PID /F杀完之后再尝试启动net start MSSQLSERVER如果 net start 返回“服务正在启动或停止中请稍候片刻再试”说明服务控制管理器还没释放等 30 秒再试。如果返回“发生系统错误 1067。进程意外终止。”说明 sqlservr.exe 启动后立刻崩溃这种情况基本可以锁定是 master 数据库或者服务账户问题。命名实例的服务名不是 MSSQLSERVER而是MSSQL$实例名比如实例叫 SQL2008服务名就是MSSQL$SQL2008。用sc query MSSQL$SQL2008查询注意引号不能省因为$在命令行里有特殊含义。2.3 服务账户权限丢失最常见的“登录失败”根因错误 1069 出现频率极高本质是 SQL Server 的服务启动账户在系统里失去了“作为服务登录”的权限或者账户密码变了但服务配置没更新。先确认当前服务用的是哪个账户sc qc MSSQLSERVER输出里SERVICE_START_NAME就是启动账户。SQL Server 2008 R2 默认用NT Service\MSSQLSERVER虚拟账户或者NT AUTHORITY\NETWORK SERVICE老系统里也常见用本地管理员账户。如果是虚拟账户一般不会出现密码过期问题但可能被组策略改掉了权限。修复方式打开secpol.msc本地安全策略展开“本地策略” → “用户权限分配”找到“作为服务登录”确认NT SERVICE\MSSQLSERVER或NT AUTHORITY\NETWORK SERVICE在列表里如果不在添加进去如果是用本地账户或域账户启动的密码改了之后服务配置不会自动更新需要重新设置sc config MSSQLSERVER obj .\Administrator password 新密码注意obj后面有个空格这是 sc 命令的语法要求少了空格会报参数错误。设置完之后再net start MSSQLSERVER。还有一个容易忽略的点如果 SQL Server 的安装目录或者数据目录的 NTFS 权限被改过即使账户正确服务也起不来。需要确保服务账户对以下目录有完全控制权限SQL Server 安装目录默认C:\Program Files\Microsoft SQL Server数据文件目录默认MSSQL\DATA日志目录默认MSSQL\Log备份目录如果有自定义用 icacls 快速授权icacls C:\Program Files\Microsoft SQL Server /grant NT SERVICE\MSSQLSERVER:(OI)(CI)F /T(OI)(CI)F表示对象继承、容器继承、完全控制/T表示递归所有子目录。这条命令执行时间可能比较长目录大的话等几分钟。2.4 master 数据库损坏或丢失错误 3417 的修复路径错误 3417 是 SQL Server 2008 R2 里最棘手的一类通常伴随“无法打开 master 数据库”或者“master 数据库损坏”。master 数据库记录了整个实例的所有元数据它起不来整个实例就起不来。先确认 master.mdf 和 mastlog.ldf 是否还在dir C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\master.*如果文件还在但服务起不来可能是文件头损坏。这时候需要从备份恢复 master或者用安装盘里的模板重建。重建 master 的步骤找到 SQL Server 2008 R2 安装介质里的setup.exe或者直接找到master.mdf模板文件通常在C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\Templates\目录下停止 SQL Server 服务如果还能停的话把现有的 master.mdf 和 mastlog.ldf 改名备份比如加个.bak后缀用管理员身份打开命令行进入 Binn 目录执行sqlservr.exe -c -m-c表示以控制台模式启动-m表示单用户模式。这时候 SQL Server 会用模板重建 master 数据库。启动成功后会看到命令行窗口里输出日志不要关这个窗口。另开一个命令行窗口用 sqlcmd 连接sqlcmd -S . -E连接成功后执行恢复 master 的命令RESTORE DATABASE master FROM DISK D:\backup\master.bak WITH REPLACE;如果没有 master 备份那就只能重建之后重新附加所有用户数据库并且重建登录名和作业。这就是为什么我一直强调master 数据库必须定期备份而且备份文件要放在另一台机器上。注意sqlservr.exe -c -m启动的实例只允许一个连接而且不支持远程连接。操作完必须关掉这个窗口再用正常方式启动服务。3. 从日志到修复一套可复现的启动失败排查流程3.1 第一步确认服务状态和错误码不要一上来就改配置。先按顺序做三件事sc query MSSQLSERVER tasklist | findstr sqlservr如果 sqlservr.exe 已经在运行但服务状态不对先杀掉。如果服务状态是 STOPPED直接尝试启动并记录错误码net start MSSQLSERVER把错误码记下来1069、1067、3417、1053 这几个最常见对应不同的排查方向。1069 看账户权限1067 看 master 和日志3417 看 master 文件1053 看服务超时。3.2 第二步读 ERRORLOG 定位第一个报错点用记事本打开 ERRORLOG从下往上找。如果文件太大用 PowerShell 快速看最后 50 行Get-Content C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\ERRORLOG -Tail 50找到第一个Error:或者FCB::Open failed或者Login failed的行那就是根因。把那一行前后的 10 行都看一下通常会有更具体的描述。如果 ERRORLOG 里只有一行“SQL Server 正在启动”然后就没有了说明服务在加载阶段就崩了这种情况大概率是 master 文件损坏或者服务账户权限问题。3.3 第三步按错误类型执行修复根据 2.3 和 2.4 的内容对应处理。这里补充一个快速判断方法如果 ERRORLOG 里有Login failed for user优先查服务账户和权限如果 ERRORLOG 里有FCB::Open failed优先查文件权限和文件是否存在如果 ERRORLOG 里有SQL Server detected a logical consistency-based I/O error优先查磁盘和备份如果 ERRORLOG 里什么都没有只有服务启动失败优先查 master 文件修复完之后不要直接启动服务先用sqlservr.exe -c -m单用户模式启动确认能起来再关掉用正常模式启动。这样能避免反复失败导致日志被覆盖。3.4 第四步验证修复结果服务启动成功后用 sqlcmd 或者 SSMS 连上去执行几个验证命令SELECT VERSION; SELECT name, state_desc FROM sys.databases; SELECT SERVERPROPERTY(ProductVersion), SERVERPROPERTY(Edition);第一条确认版本第二条确认所有数据库状态都是 ONLINE第三条确认版本号和版本类型。如果某个用户数据库状态是 RECOVERY_PENDING 或者 SUSPECT那还需要单独修复那个数据库。ALTER DATABASE [数据库名] SET ONLINE;如果这条命令失败说明数据库文件损坏严重需要从备份恢复。4. 避坑指南SQL Server 2008 R2 启动排查的五个常见翻车点4.1 坑一用管理员账户启动服务结果还是 1069现象明明把服务账户改成了本地 Administrator密码也填了启动还是报 1069。原因Windows 的“作为服务登录”权限不是自动授予所有管理员的。Administrator 账户默认有但如果组策略被改过或者用的是域账户这个权限可能被剥离了。解决打开 secpol.msc在“用户权限分配”里找到“作为服务登录”手动把 Administrator 加进去。如果是域环境域控上的组策略可能覆盖本地策略需要在域控上改。4.2 坑二改了服务账户密码忘了同步 SQL Server 配置现象域账户密码到期改了SQL Server 服务起不来报 1069。原因Windows 服务的登录密码是独立存储的改了域账户密码不会自动同步到服务配置。解决用sc config MSSQLSERVER obj 域\账户 password 新密码重新设置。注意obj和password后面都有空格这是 sc 命令的固定格式。4.3 坑三master 数据库文件被误删直接重装现象清理磁盘的时候把 master.mdf 删了服务起不来直接重装 SQL Server。原因重装虽然能解决问题但所有用户数据库的元数据登录名、作业、链接服务器全部丢失恢复起来非常麻烦。解决先尝试用模板重建 master再附加用户数据库。重建方法见 2.4。如果模板文件也找不到可以从另一台同版本同补丁的机器上拷贝 master.mdf 和 mastlog.ldf但要注意排序规则和实例名必须一致。4.4 坑四ERRORLOG 被清空找不到报错信息现象服务起不来但 ERRORLOG 是空的或者只有一行“SQL Server 正在启动”。原因SQL Server 每次启动会轮转日志如果启动失败太快日志还没来得及写入就崩了。或者日志目录权限不对写不进去。解决检查日志目录的 NTFS 权限确保服务账户有写权限。如果日志确实没写进去用sqlservr.exe -c控制台模式启动报错会直接输出到命令行窗口。4.5 坑五单用户模式启动后忘了关窗口就启动服务现象用sqlservr.exe -c -m修复完 master直接去服务管理器点启动报“服务已在运行”或者“端口被占用”。原因-c -m启动的实例还在运行占用了 1433 端口和共享内存。解决在-c -m的命令行窗口里按 CtrlC或者直接关掉窗口等 sqlservr.exe 进程完全退出再启动服务。用tasklist | findstr sqlservr确认没有残留进程。5. 进阶技巧用 3608 跟踪标志和专用管理员连接抢救濒临崩溃的实例5.1 3608 跟踪标志跳过自动恢复快速拉起实例SQL Server 启动时会先对每个数据库执行自动恢复recovery如果某个用户数据库损坏严重恢复过程会卡住导致整个实例起不来。这时候可以用 3608 跟踪标志让 SQL Server 只恢复 master跳过其他数据库net start MSSQLSERVER /T3608注意/T是大写 T3608 是跟踪标志号。启动之后实例只能访问 master用户数据库都是离线状态。这时候可以逐个把数据库设为紧急模式导出数据ALTER DATABASE [问题库] SET EMERGENCY; ALTER DATABASE [问题库] SET SINGLE_USER; DBCC CHECKDB ([问题库], REPAIR_ALLOW_DATA_LOSS);REPAIR_ALLOW_DATA_LOSS是最后的手段会丢失部分数据但能救回大部分。执行之前务必先备份当前的 mdf 和 ldf 文件哪怕它们已经损坏。5.2 专用管理员连接DAC连不上实例时的救命通道如果 SQL Server 服务能启动但普通连接连不上比如 max worker threads 耗尽、或者实例处于挂起状态可以用 DAC 连接。DAC 是 SQL Server 预留的一个专用连接不经过普通的连接调度。先用sqlservr.exe -c -m或者net start MSSQLSERVER /T3608启动实例然后用 sqlcmd 的-A参数连接sqlcmd -S . -E -A-A就是 DAC 连接。连上之后可以执行诊断命令SELECT * FROM sys.dm_exec_requests; SELECT * FROM sys.dm_os_waiting_tasks;找到阻塞的会话用KILL命令杀掉。DAC 连接不受普通连接限制即使实例已经无法响应普通请求DAC 通常还能连上。5.3 一个我常用的启动失败快速检查清单每次遇到启动失败我会按这个顺序过一遍基本 10 分钟内能定位到根因检查项命令/操作预期结果服务状态sc query MSSQLSERVERSTOPPED 或 STOP_PENDING进程残留tasklist | findstr sqlservr无输出或只有一个错误码net start MSSQLSERVER记录 1069/1067/3417日志尾部Get-Content ERRORLOG -Tail 50找到第一个 Error服务账户sc qc MSSQLSERVER确认账户名文件权限icacls DATA目录服务账户有 F 权限master 文件dir master.mdf文件存在且大小正常这张表我贴在工位上处理老实例启动失败的时候照着走比凭感觉试快得多。5.4 最后的习惯master 备份和启动参数固化SQL Server 2008 R2 已经停止主流支持但很多老系统还在跑。我自己的习惯是每台老实例都配一个 master 备份作业每天备份到另一台机器的共享目录。同时把启动参数固化下来比如-T3608只在紧急时用平时不加。服务账户用虚拟账户NT Service\MSSQLSERVER避免密码过期问题。这些习惯看起来简单但真出问题的时候能省下几个小时甚至几天的恢复时间。希望帮到你。本文还有配套的精品资源点击获取