ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SQL Server 2008 R2服务无法启动?三步排查RPC、VIA与服务账户冲突

SQL Server 2008 R2服务无法启动?三步排查RPC、VIA与服务账户冲突 简介这是一份关于SQL Server 2008 R2数据库服务无法启动问题的故障排查资料适合数据库维护人员与开发者在遇到同类错误时查阅。资源以PDF文档形式呈现单文件约117KB内容围绕三种常见场景展开远程过程调用失败、VIA协议配置异常导致服务无法启动以及登录账户更改后无法正常拉起服务。每种情况均结合具体日志与配置管理器操作说明并给出临时启动与永久修复两种思路便于按错误现象快速定位处理。文档还提醒通过备份数据库、创建系统还原点、升级SP补丁等方式预防问题复发。该资源已有1630人学习下载对正在维护SQL Server 2008 R2实例或准备排查启动故障的读者具有实用参考价值。1. SQL Server 2008 R2 服务无法启动别急着重装先定位这三类故障接手过 SQL Server 2008 R2 的人基本都撞过“服务无法启动”这堵墙。很多人第一反应是重装实例但实例里十几套业务库哪能说卸就卸。这套资料里整理的故障案例我逐一拆过核心结论是绝大多数启动失败不是数据损坏而是“服务起不来”的假象。远程过程调用RPC失败、VIA 协议残留、服务账户变更这三个原因占了九成场景。如果你正对着“SQL Server (MSSQLSERVER) 服务无法启动”的错误框发愁先别动数据库文件按本文的排查顺序走一遍大概率能把服务拉回来实例和库都原封不动。2. RPC 失败查清是谁抢了 SQL Server 2008 R2 的启动权2.1 故障现象与根因定位远程过程调用失败在 SQL Server 2008 R2 上最常见的表现是服务列表里 SQL Server (MSSQLSERVER) 显示“已停止”右击启动立刻弹“Windows 不能在本地计算机启动 SQL Server (MSSQLSERVER)”。翻系统事件日志能看到来自 Service Control Manager 的报错指向 RPC 服务不可用。这个问题的根子十有八九是机器上装了另一个 SQL Server 实例最常见的“肇事者”是 Visual Studio 2012 自动安装的 Microsoft SQL Server 2012 Express LocalDB。我当时接手的一个环境就是先装 SQL Server 2008 R2后装 VS2012某天开机后 2008 R2 就再也启动不起来了。两个实例的共享组件在注册表里对服务账户和协议配置做了覆盖2008 R2 在启动时找不到正确的执行上下文于是报 RPC 失败。判断是不是 LocalDB 在捣乱可以打开控制面板的“程序和功能”按安装日期排序看有没有“Microsoft SQL Server 2012 Express LocalDB”或“Microsoft SQL Server 2012 Express”相关组件。如果装 VS2012、VS2013 的机器上出现这类问题基本可以实锤。2.2 方案一卸载冲突的 LocalDB 实例这是最快见效的做法。操作顺序如下# 1. 以管理员身份打开命令提示符 # 2. 先停掉可能引用该组件的 VS 进程 taskkill /f /im devenv.exe 2nul # 3. 打开控制面板 - 卸载程序 - 找到 “Microsoft SQL Server 2012 Express LocalDB” # 4. 右键卸载选择“删除”提示卸载前最好记住该 LocalDB 实例里是否存有自己的开发库。如果只是 VS 自动装的空实例卸载没有副作用如果里面有你手动建的 LocalDB 库先用sqllocaldb.exe info查看实例名再决定要不要备份。卸载完成后打开“SQL Server 配置管理器”看 SQL Server (MSSQLSERVER) 服务状态。如果显示“已停止”右击选择“启动”。配置管理器恢复正常服务能跑起来就说明冲突解除。2.3 方案二升级 SP 补丁解决兼容性问题如果不想动 LocalDB比如 VS 项目里还在用第二条路是给 SQL Server 2008 R2 打上 SP1 或 SP2 补丁。这个方案的原理是微软在新补丁里修复了与后装组件在注册表键值、服务依赖关系上的兼容性问题。2008 R2 的 SP2 补丁包我能确认的是微软官方下载中心至今仍保留着分发渠道但我手头没有现成的版本号清单可列——下载前一定核对系统位数和既有补丁级别这步不能跳过。操作顺序# 1. 先查当前版本确认补丁级别 SELECT SERVERPROPERTY(ProductVersion), SERVERPROPERTY(ProductLevel); # 2. 如果服务还能临时启动就执行查询如果服务是完全停的用安装目录下的 sqlservr.exe 手动拉起 # 3. 下载对应 x86/x64 的 SP2 安装包双击升级期间保持电源稳定不要中断升级完成后配置管理器里服务会自动重启一次。这个方法适合“急用实例、不想折腾卸载”的人但升级耗时较长需要预留 2030 分钟。2.4 临时救急手动从服务管理器启动当上述方案一时来不及、实例又急着要连时还有个临时办法打开“计算机”右键 -“管理”-“服务和应用程序”-“服务”找到 SQL Server (MSSQLSERVER)右击“启动”。我当时很多次靠这个先把库从程序里拉起来抓紧做备份。注意这个方法只解决眼前。重启系统后故障依旧因为根因注册表冲突没处理。别把临时救急当永久方案救起来之后必须回头做卸载或升级。3. VIA 协议问题服务日志里最容易被无视的启动阻碍3.1 协议残留为什么能拦住整个服务第二个经典坑是 VIAVirtual Interface Architecture协议。SQL Server 2008 R2 默认启用的网络协议里包含 Shared Memory、Named Pipes、TCP/IPVIA 默认是禁用状态。但有些环境下 VIA 会被意外启用或者注册表里残留了 VIA 的配置键。一旦 VIA 处于启用状态且网卡绑定异常服务启动时会因协议初始化失败而终止。判断依据很明确系统日志里能看到 SQL Server 服务启动失败的记录再用 SQL Server 自带的日志文件查看器打开错误日志里面会有一行类似“Error: 17182, Severity: 16”和 VIA 相关的描述。我拆这个故障时第一次就没注意到 VIA 两个字白白折腾了半天。3.2 禁用 VIA 协议的操作步骤# 1. 打开 SQL Server 配置管理器 # 2. 左侧展开 “SQL Server 网络配置”不是 “SQL Native Client 配置” # 3. 找到你的实例协议项比如 “MSSQLSERVER 的协议” # 4. 右侧找到 “VIA”右键 -“禁用” # 5. 回到 “SQL Server 服务”右键实例名选择“重启”关键点一定要在“SQL Server 网络配置”下面的实例协议里找如果误跑到“SQL Native Client 配置”那是客户端配置改了没用。禁用 VIA 后服务重启会重新初始化网络库跳过有问题的协议栈。3.3 验证服务是否真正恢复服务重启成功后别急着关窗口做两步验证# 1. 确认服务状态 sc query MSSQLSERVER # 2. 用 sqlcmd 本地登录确认库能正常响应 sqlcmd -S localhost -E -Q SELECT SERVERNAME, VERSION如果 sqlcmd 能返回服务器名和版本号说明网络库工作正常。如果这里卡住再检查一下 TCP/IP 是否启用了以及监听端口是不是 1433。VIA 禁用后理论上 TCP/IP 接管连接但如果 TCP/IP 本身也停着服务能起来却连不上那是另一层问题。4. 用户名变更导致服务无法登录藏在服务属性里的坑4.1 服务账户权限验证为什么会挡住启动第三种高频故障是 SQL Server 服务账户的问题。Windows 服务都有一个“登录身份”设置SQL Server 服务默认是 NT Service\MSSQLSERVER 或 NETWORK SERVICE。如果之前有运维人员改过服务属性里的登录账户后来这个账户被改名、删除或被移出本地管理员组服务启动时会因为拿不到执行权限而失败。打开服务管理器找到 SQL Server (MSSQLSERVER)右击“属性”-“登录”选项卡能看到当前配置的账户名。如果这里填的是一个已经不存在的用户名或者密码是错的服务会直接拒绝启动。还有一种隐蔽情况账户还在但“作为批处理作业登录”的权限被组策略改没了服务同样起不来。4.2 恢复本地系统账户登录遇到这类问题常见做法是先把服务登录身份改回内置账户让服务先跑起来# 1. 打开服务管理器services.msc # 2. 找到 SQL Server (MSSQLSERVER)右键 -“属性” # 3. 切到 “登录” 选项卡 # 4. 选择 “本地系统账户(Local System Account)”或者选择 “此账户”输入 NT Service\MSSQLSERVER # 5. 确认密码栏留空点“应用”-“确定” # 6. 右键服务选择“启动”提示SQL Server 2008 R2 的服务账户比较特殊。如果服务是 SQL Server 和 SQL Server Agent 一起装的记得把 Agent 服务的账户也检查一遍两个服务经常是同一个账户配置出错。改为本地系统账户后SQL Server 能以高权限方式运行。这种配置在生产环境不是最安全的做法但用来紧急恢复服务是合规的应急手段。服务正常之后再考虑建独立服务账户并分配最小权限那是另一个优化话题。4.3 修改服务账户后必做的检查清单改完登录身份不能只看服务是否启动还要确认文件系统权限。SQL Server 的数据目录、备份目录、错误日志目录都需要新账户具备读取和写入权限。具体操作# 1. 找到数据文件目录默认路径类似 C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA # 2. 右键目录 -“属性”-“安全”确认新账户有“完全控制”权限 # 3. 如果权限缺失添加账户并勾选完全控制再重启服务我在处理一个迁移案例时服务账户从域账号改成本地系统后服务能启动了但数据库一直处于“可疑”状态。排查到最后就是数据目录缺少本地系统账户的 ACL 权限。这个坑很容易被忽略因为服务启动成功和数据库文件访问成功是两回事。5. SQL Server 2008 R2 启动失败常见问题排查五个真实场景的记录5.1 服务手动启动后重启又失效现象按照第 2 章的方法从服务管理器手动启动 SQL Server当时能连上但重启操作系统后服务又变回“已停止”。原因根因未清除。要么是冲突组件没卸载要么是注册表键值损坏手动启动只是直接调用了服务进程绕开了注册表校验流程。解决不要每次都在服务管理器里点“启动”必须按第 2 章的方案一或方案二处理完底层问题。处理完后再重启机器验证一次确认服务能自动启动才算闭环。5.2 错误 1067进程意外终止现象服务启动时直接弹“错误 1067进程意外终止”服务进程没起来也没有 RPC 报错。原因1067 是个笼统代号SQL Server 里常见原因是 master 数据库损坏、或服务账户没有写权限、或 Dll 加载失败。如果系统日志里紧接着有 17204、17207 这类 SQL Server 错误号多半是数据库文件访问权限。解决先看 Windows 事件查看器里 Application 日志按时间点找 Source 为 MSSQLSERVER 的事件。如果是 17207去校验数据目录的 ACL 权限。如果 master 库损坏可能需要用 -m 单用户模式启动做修复但这属于高难度操作有数据风险建议动手前全量备份。5.3 改完 VIA 协议服务还是启动失败现象按第 3 章禁用 VIA 协议后重启服务依然报错日志里还能看到 VIA 相关记录。原因改协议时改错了对象。有人会误把“SQL Native Client 配置”里的 VIA 点成禁用服务端完全没动。另外如果实例不是默认实例而是命名实例要在“SQL Server 网络配置”里选对应实例名而不是 MSSQLSERVER。解决回到配置管理器确认左侧展开的是“SQL Server 网络配置”核对实例名是否一致。命名实例的协议项名称跟默认实例不同比如“SQL2008R2 的协议”操作路径要跟着实例名走。5.4 配置管理器里看不到实例现象打开 SQL Server 配置管理器左侧树形菜单里根本没有实例的协议和服务项整个管理器看着像半空状态。原因配置管理器读的是注册表里的服务信息。如果注册表键值损坏或者有安全软件拦截了 SQL Server 配置管理器的权限就会出现“实例消失了”的假象。解决检查注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQLServer\SuperSocketNetLib是否存在如果缺失试试用安装光盘的安装中心做“修复”功能。但注册表操作有风险改之前一定要先导出备份。5.5 临时启动后数据库显示“正在恢复”或“可疑”现象服务拉起来后对象资源管理器里某些数据库显示“正在恢复”一直不变或者直接显示“可疑”无法访问业务表。原因服务异常终止时数据库的持久化页面没有完全落盘SQL Server 启动时会走崩溃恢复流程。如果重启服务后还是恢复不了常见原因是日志文件被截断或磁盘空间不足。解决先检查磁盘剩余空间确保数据库所在盘有足够空间完成恢复。如果显示“可疑”不要直接删除数据库文件先尝试ALTER DATABASE [库名] SET EMERGENCY; ALTER DATABASE [库名] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;做紧急模式修复但这一步必须在确认有备份的前提下进行。6. 一套可复用的故障启动验证流程从日志到自动化自查6.1 事后的固定动作把排查变成肌肉记忆经历了前面这些故障后我的习惯是把“启动失败”当成一个系统性排查任务来看而不是单点问题。现在的固定流程是三步走先读 Windows 系统日志定位服务级别错误再读 SQL Server 错误日志定位数据库级别错误最后核对配置管理器里的服务账户和协议状态。这套流程走一遍绝大多数启动失败能在 15 分钟内锁定方向。实践中我常用的验证工具是sqlcmd和SC命令的组合# 1. 用 SC 查服务状态和配置 sc qc MSSQLSERVER sc query MSSQLSERVER # 2. 如果服务是停止的尝试启动并捕获返回码 net start MSSQLSERVER # 3. 服务起来后用 sqlcmd 验证数据库是否能回应 sqlcmd -S localhost -E -Q SELECT name, state_desc FROM sys.databases6.2 一份自查清单照着走不遗漏下面这份清单来自我实际处理过的几类故障适合在不确定原因时兜底检查项操作方法正常状态服务账户服务属性 - 登录本地系统或有效账户数据目录权限右键数据目录 - 安全服务账户有完全控制VIA 协议配置管理器 - 网络配置禁用LocalDB 冲突控制面板 - 程序和功能无 SQL Server 2012 Express服务依赖项服务属性 - 依赖依赖服务均已启动端口监听命令行netstat -ano找 1433LISTENING 状态错误日志位置C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\ERRORLOG有近期启动记录6.3 应急场景里的后悔药一条自动备份命令每次故障解决后我都会立刻做一个全库备份防止服务再次挂掉时没有退路。这个习惯治好了我早期吃了大亏的毛病——当时服务账户出错我花了四个小时去修最后发现能启动但某个业务库在故障期间已经有事务损坏而备份还是两周前的。从那以后每次 SQL Server 服务出现异常并成功恢复后我都强制自己走一遍完整备份流程# 备份所有非系统数据库到 D 盘备份目录 sqlcmd -S localhost -E -Q EXEC sp_msforeachdb IF DB_ID(?) 4 BEGIN BACKUP DATABASE [?] TO DISK D:\backup\?_\ REPLACE(CONVERT(VARCHAR(19), GETDATE(), 120), :, -) .bak END提示这条命令遍历除系统库外的所有数据库按时间戳生成备份文件名避免覆盖历史备份。如果机器上库不多也可以手写几条BACKUP DATABASE [库名] TO DISK N路径单独执行系统库不需要备份实例信息通过维护计划重建即可。做完备份再按 6.2 的清单逐项拍照存档。下次再遇到类似问题对比历史记录就能快速判断哪些配置被改动过。这套流程帮我处理过至少四次现场问题每一次都稳住了。希望这套方法对你也有用遇到 SQL Server 2008 R2 起不来的日子不用慌按顺序查总能把它拽回来说话。本文还有配套的精品资源点击获取
返回列表