本文提供有关 SQL Server 代理服务停止响应或尝试启动 SQL Server 代理服务所花费的时间超过预期的问题的故障排除指南。 许多不同的根本问题可能会导致此问题。 本文介绍一些最常见的方案。
原始产品版本: SQL Server
原始 KB 数: 2795690
现象
尝试启动 SQL Server 代理时失败,或者启动所需的时间比预期要长。 此外,可能会遇到以下一个或多个方案:
方案 1:系统 事件日志中记录了以下错误消息:
由于以下错误,SQL Server 代理 (MSSQLSERVER) 服务无法启动:
该服务没有及时响应启动或控制请求。方案 2:代理的状态在控制面板中显示为“正在启动”, SQLAgent.log文件中记录 了以下错误消息:
尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起作用。
此外,可能会在 SQLAgent.log 文件中记录以下条目:
<Time Stamp> - ? [431] Populating subsystems cache... <Time Stamp> - ? [432] There are 7 subsystems in the subsystems cache <Time Stamp> - ? [124] Subsystem 'ActiveScripting' successfully loaded (maximum concurrency: 40) <Time Stamp> - ? [124] Subsystem 'ANALYSISCOMMAND' successfully loaded (maximum concurrency: 400) <Time Stamp> - ? [124] Subsystem 'ANALYSISQUERY' successfully loaded (maximum concurrency: 400) <Time Stamp> - ? [124] Subsystem 'CmdExec' successfully loaded (maximum concurrency: 40) <Time Stamp> - ? [124] Subsystem 'PowerShell' successfully loaded (maximum concurrency: 2) <Time Stamp> - ? [124] Subsystem 'SSIS' successfully loaded (maximum concurrency: 400) <Time Stamp> - ? [124] Subsystem 'TSQL' successfully loaded (maximum concurrency: 80) <Time Stamp> - ! [364] The Messenger service has not been started - NetSend notifications will not be sent <Time Stamp> - ? [129] SQLSERVERAGENT starting under Windows NT service control <Time Stamp> - + [396] An idle CPU condition has not been defined - OnIdle job schedules will have no effect <Time Stamp> - ? [110] Starting SQLServerAgent Monitor using '' as the notification recipient... <Time Stamp> - ? [146] Request servicer engine started <Time Stamp> - ? [133] Support engine started <Time Stamp> - ? [167] Populating job cache... <Time Stamp> - ? [131] SQLSERVER service stopping due to a stop request from a user, process, or the OS... <Time Stamp> - ? [134] Support engine stopped <Time Stamp> - ? [197] Alert engine stopped <Time Stamp> - ? [168] There are 4731 job(s) [0 disabled] in the job cache <Time Stamp> - ? [170] Populating alert cache... <Time Stamp> - ? [171] There are 0 alert(s) in the alert cache <Time Stamp> - ? [149] Request servicer engine stopped <Time Stamp> - ? [248] Saving NextRunDate/Times for all updated job schedules... <Time Stamp> - ? [249] 0 job schedule(s) saved <Time Stamp> - ? [127] Waiting for subsystems to finish... <Time Stamp> - ? [128] Subsystem 'ActiveScripting' stopped (exit code 1) <Time Stamp> - ? [128] Subsystem 'ANALYSISCOMMAND' stopped (exit code 1) <Time Stamp> - ? [128] Subsystem 'ANALYSISQUERY' stopped (exit code 1) <Time Stamp> - ? [128] Subsystem 'CmdExec' stopped (exit code 1) <Time Stamp> - ? [128] Subsystem 'PowerShell' stopped (exit code 1) <Time Stamp> - ? [128] Subsystem 'SSIS' stopped (exit code 1) <Time Stamp> - ? [175] Job scheduler engine stopped方案 3:数据库引擎显示SQLAgent - 泛型刷新器
session_id服务的信息,以下作业显示为在该会话中运行的查询文本:EXECUTE msdb.dbo.sp_sqlagent_refresh_job
原因 1:多个作业条目
如果在具有许多计划的 SQL Server 代理中配置大量作业,则可能会出现此问题。 此配置可以持续激活通用刷新器任务,使其保持忙碌状态。
例如,如果在 SQL Server Reporting Services Configuration Manager 中无意中为报表设置多个订阅,则可能会出现此问题。
解决方法
若要解决此问题,请删除不需要的作业。
如果由于无意中设置了许多订阅而存在许多作业条目,请使用 Reporting Services Configuration Manager 删除不必要的订阅。
原因 2:ODBC 驱动程序丢失或无法正常工作
如果 SQL Server Open Database Connectivity (ODBC) 驱动程序被删除或运行不正常(通常在系统更新后),则可能会出现此问题。 SQL Server 代理使用 SQL Server ODBC 驱动程序连接到 SQL Server。 如果驱动程序缺失或无法运行,则 SQL Server 代理无法启动。
有关不同版本的 SQL Server 的 ODBC 驱动程序要求的信息,请参阅 SQL Server 的硬件和软件要求。
解决方案
若要检查 SQL Server ODBC 驱动程序是否缺失,请在提升的命令提示符窗口中或 PowerShell 中运行以下命令之一:
命令提示符:
odbcad32.exe此命令将打开 ODBC 数据源管理员。
PowerShell:
Get-OdbcDriver此命令输出已安装的 ODBC 驱动程序的列表。
通过将所需的 SQL Server ODBC 驱动程序与 SQL Server 版本和 ODBC 和 OLE DB 驱动程序中找到的表进行比较,检查是否存在所需的 SQL Server ODBC 驱动程序。 下表列出了随每个 SQL Server 引擎一起提供的 SQL Server ODBC 驱动程序的版本,以及 SQL Server 代理用于连接到 SQL Server 引擎的版本。
- 如果存在所需的 ODBC 驱动程序版本,请按照 ODBC 驱动程序中的步骤进行修复。
- 如果缺少 ODBC 驱动程序,请按照 ODBC driver is missing 中的步骤安装该驱动程序。
ODBC 驱动程序存在
- 打开“添加或删除程序”,然后选择MICROSOFT SQL Server 的 ODBC 驱动程序<Driver_Version>。
- 选择三个点(...),然后选择 “修改”。
- 在打开的向导中,选择 “修复 ”选项并按照步骤修复驱动程序。
- 完成修复步骤后,可以使用修复的 SQL Server 驱动程序配置测试 DSN 与 SQL Server 的连接。 有关详细信息,请参阅 ODBC 数据源管理员 DSN 选项。
缺少 ODBC 驱动程序
使用 GUI 或无提示模式来安装驱动程序。
若要执行无提示安装,请运行以下命令:
msiexec /i <ODBC_Driver_MSI> /qn
驱动程序安装完成后,重启 SQL Server 代理。
验证 SQL SERVER 代理 服务是否正在运行。
对于未命名的 SQL Server 实例,请运行以下 PowerShell 命令:
Get-Service -Name SQLSERVERAGENT对于命名的 SQL Server 实例,请运行以下 PowerShell 命令:
Get-Service -Name SQLAgent$<InstanceName>
原因 3:等待 SQLAgent - 通用刷新服务
当 SQL Server 代理启动时, SQLAgent – 泛型刷新器 组件运行 msdb.dbo.sp_sqlagent_refresh_job 刷新作业元数据的过程。 在此作期间,SQL Server 可能会反复检查作业所有者或代理帐户的 Windows 组成员身份。 这些检查使用 Windows API 调用,这可能导致会话输入以下一个或多个等待类型:
PREEMPTIVE_OS_LOOKUPACCOUNTSIDPREEMPTIVE_OS_AUTHORIZATIONOPSASYNC_NETWORK_IO
使用以下查询标识会话和关联的命令文本:
SELECT
s.session_id,
r.status,
r.wait_type,
r.wait_time,
s.program_name,
t.text
FROM sys.dm_exec_requests AS r
RIGHT JOIN sys.dm_exec_sessions AS s
ON r.session_id = s.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
WHERE s.program_name = 'SQLAgent - Generic Refresher';
出现此问题时,会话处于 RUNNABLE 状态,并定期等待 PREEMPTIVE_OS_LOOKUPACCOUNTSID 等待类型。 或者,会话正处于ASYNC_NETWORK_IO等待类型的等待状态。
解决方法
若要减少与 Windows 授权查找相关的延迟,请:
- 确保域控制器可访问且响应迅速。
- 避免对 SQL 代理作业所有权或代理帐户使用高度嵌套或非常大的 Active Directory 组。
- 在重大 Active Directory 组成员身份更改后重启 SQL Server 代理,以刷新服务帐户的访问令牌。
- 在适当情况下,请考虑使用 SQL 登录名而不是 AD 组来实现作业所有权。
- 查看 SQL 代理作业和代理,以确定可能导致成本高昂的 Windows 安全查找的 Windows 主体。
详细信息
- 有关如何删除作业的详细信息,请参阅 “删除一个或多个作业”。
- 关于如何管理报表服务订阅的详细信息,请参阅 为本机模式报表服务器创建和管理订阅。
- 有关各种等待类型的详细信息,请参阅 SQL Server 等待类型。