Агент SQL Server неожиданно завершает работу при попытке запустить его.

В этой статье приводятся рекомендации по устранению неполадок, в которых служба агента SQL Server перестает отвечать или занимает больше времени, чем ожидалось при попытке ее запуска. Многие различные базовые проблемы могут вызвать эту проблему. В этой статье рассматриваются некоторые из наиболее распространенных сценариев.

Исходная версия продукта: SQL Server
Исходный номер базы знаний: 2795690

Симптомы

Агент SQL Server завершает работу с ошибкой, когда вы пытаетесь его запустить, или он запускается дольше, чем ожидалось. Кроме того, вы можете столкнуться с одним или несколькими из следующих сценариев:

  • Сценарий 1. В журнал событий системы регистрируется следующее сообщение об ошибке:

    Не удалось запустить службу агента SQL Server (MSSQLSERVER) из-за следующей ошибки:
    Служба не ответила на запрос на запуск или контроль своевременно.

  • Сценарий 2. Состояние агента отображается как "Запуск" на панели управления, а следующее сообщение об ошибке регистрируется в файле SQLAgent.log :

    Условие простоя ЦП не определено. Расписания заданий 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: Движок СУБД отображает session_id из службы SQLAgent - Generic Refresher, а следующее задание отображается как запрос, выполняемый в этом сеансе: EXECUTE msdb.dbo.sp_sqlagent_refresh_job

Причина 1. Несколько записей задания

Эта проблема может возникнуть, если настроить большое количество заданий в агенте SQL Server с большим количеством расписаний. Эта конфигурация может непрерывно активировать задачу универсального обновления, сохраняя ее в состоянии занятости.

Например, проблема может возникнуть, если вы непреднамеренно настроили несколько подписок для отчетов в диспетчере конфигурации служб SQL Server Reporting Services.

Обходное решение

Чтобы обойти эту проблему, удалите задания, которые вам не нужны.

Если есть много записей заданий, так как вы непреднамеренно настроили много подписок, удалите ненужные подписки с помощью Диспетчера конфигурации служб Reporting Services.

Причина 2. Отсутствует или не работает драйвер ODBC

Эта проблема может возникнуть, если драйвер SQL Server Open Database Connectivity (ODBC) удален или не работает (часто после обновления системы). Агент SQL Server использует драйвер ODBC SQL Server для подключения к SQL Server. Если драйвер отсутствует или не работает, агент SQL Server не запускается.

Сведения о требованиях драйвера ODBC для различных версий SQL Server см. в разделе "Требования к оборудованию и программному обеспечению" для SQL Server.

Solution

  1. Чтобы проверить, отсутствует ли драйвер ODBC SQL Server, выполните одну из следующих команд в окне командной строки с повышенными привилегиями или PowerShell:

    1. Командная строка:

      odbcad32.exe
      

      Эта команда открывает администратора источника данных ODBC.

    2. PowerShell.

      Get-OdbcDriver
      

      Эта команда выводит список установленных драйверов ODBC.

  2. Проверьте, присутствует ли необходимый драйвер ODBC SQL Server, сравнивая его с таблицей, найденной в версиях SQL Server и драйверах ODBC и OLE DB. В таблице перечислены версии драйвера ODBC SQL Server, поставляемого с каждым ядром SQL Server и используемым агентом SQL Server для подключения к подсистеме SQL Server.

    1. Если установлена требуемая версия драйвера ODBC, восстановите его, следуя шагам, описанным в ODBC Driver is present.
    2. Если драйвер ODBC отсутствует, установите его, следуя инструкциям в разделе ODBC driver is missing.

Драйвер ODBC присутствует

  1. Откройте Добавление или удаление программ и выберите Microsoft ODBC Driver <Driver_Version> для SQL Server.
  2. Выберите три точки (...) и нажмите кнопку "Изменить".
  3. В открываемом мастере выберите параметр " Восстановить " и выполните действия по восстановлению драйвера.
  4. После выполнения действий по восстановлению можно проверить подключение к SQL Server, настроив тестовую dsN с восстановленным драйвером SQL Server. Дополнительные сведения см. в разделе «Параметры DSN в Администраторе источников данных ODBC».

Драйвер ODBC отсутствует

  1. Скачайте драйвер ODBC для SQL Server.

  2. Установите драйвер с помощью графического интерфейса или автоматической установки.

    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 - Generic Refresher

При запуске агента 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:

  • Убедитесь, что контроллеры домена доступны и реагируют.
  • Избегайте использования высоко вложенных или очень больших групп Active Directory для владения заданиями агента SQL или учетными записями прокси-сервера.
  • Перезапустите агент SQL Server после значительных изменений членства в группах Active Directory, чтобы обновить маркер доступа учетной записи службы.
  • Рекомендуется рассматривать использование логинов SQL вместо групп AD для владения заданиями, когда это уместно.
  • Просмотрите задания и прокси агента SQL, чтобы определить учетные записи Windows, которые могут способствовать дорогостоящим проверкам безопасности Windows.

Дополнительная информация