尝试启动 SQL Server 代理时,它会非预期关闭。

本文提供有关 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 的硬件和软件要求

解决方案

  1. 若要检查 SQL Server ODBC 驱动程序是否缺失,请在提升的命令提示符窗口中或 PowerShell 中运行以下命令之一:

    1. 命令提示符:

      odbcad32.exe
      

      此命令将打开 ODBC 数据源管理员

    2. PowerShell:

      Get-OdbcDriver
      

      此命令输出已安装的 ODBC 驱动程序的列表。

  2. 通过将所需的 SQL Server ODBC 驱动程序与 SQL Server 版本和 ODBC 和 OLE DB 驱动程序中找到的表进行比较,检查是否存在所需的 SQL Server ODBC 驱动程序。 下表列出了随每个 SQL Server 引擎一起提供的 SQL Server ODBC 驱动程序的版本,以及 SQL Server 代理用于连接到 SQL Server 引擎的版本。

    1. 如果存在所需的 ODBC 驱动程序版本,请按照 ODBC 驱动程序中的步骤进行修复。
    2. 如果缺少 ODBC 驱动程序,请按照 ODBC driver is missing 中的步骤安装该驱动程序。

ODBC 驱动程序存在

  1. 打开“添加或删除程序”,然后选择MICROSOFT SQL Server 的 ODBC 驱动程序<Driver_Version>
  2. 选择三个点(...),然后选择 “修改”。
  3. 在打开的向导中,选择 “修复 ”选项并按照步骤修复驱动程序。
  4. 完成修复步骤后,可以使用修复的 SQL Server 驱动程序配置测试 DSN 与 SQL Server 的连接。 有关详细信息,请参阅 ODBC 数据源管理员 DSN 选项

缺少 ODBC 驱动程序

  1. 下载 ODBC Driver for SQL Server

  2. 使用 GUI 或无提示模式来安装驱动程序。

    1. 若要执行无提示安装,请运行以下命令:

      msiexec /i <ODBC_Driver_MSI> /qn
      
  3. 驱动程序安装完成后,重启 SQL Server 代理。

  4. 验证 SQL SERVER 代理 服务是否正在运行。

    1. 对于未命名的 SQL Server 实例,请运行以下 PowerShell 命令:

      Get-Service -Name SQLSERVERAGENT
      
    2. 对于命名的 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_LOOKUPACCOUNTSID
  • PREEMPTIVE_OS_AUTHORIZATIONOPS
  • ASYNC_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 主体。

详细信息