Partilhar via


O SQL Server Agent é desligado inesperadamente quando você tenta iniciá-lo

Este artigo fornece diretrizes de solução de problemas para um problema no qual o serviço SQL Server Agent para de responder ou leva mais tempo do que você espera quando você tenta iniciá-lo. Muitos problemas subjacentes diferentes podem causar esse problema. Este artigo aborda alguns dos cenários mais comuns.

Versão original do produto: SQL Server
Número original do KB: 2795690

Sintomas

Um SQL Server Agent falha quando você tenta iniciá-lo ou leva mais tempo do que você espera iniciar. Além disso, você pode experimentar um ou mais dos seguintes cenários:

  • Cenário 1: A seguinte mensagem de erro é registrada no log de eventos do sistema:

    O serviço MSSQLSERVER (SQL Server Agent) não foi iniciado devido ao seguinte erro:
    O serviço não respondeu à solicitação de início ou controle em tempo hábil.

  • Cenário 2: o status do agente aparece como "Iniciando" no Painel de Controle e a seguinte mensagem de erro é registrada no arquivo SQLAgent.log :

    Uma condição de CPU ociosa não foi definida - os agendamentos de trabalho OnIdle não terão efeito.

    Além disso, as seguintes entradas podem ser registradas no arquivo 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
    
  • Cenário 3: O mecanismo de banco de dados exibe um session_id do serviço SQLAgent – Generic Refresher e a seguinte tarefa é exibida como texto de consulta em execução nessa sessão: EXECUTE msdb.dbo.sp_sqlagent_refresh_job

Causa 1: múltiplas tarefas

Esse problema poderá ocorrer se você configurar um grande número de trabalhos no SQL Server Agent com muitos agendamentos. Essa configuração pode ativar continuamente a tarefa de atualização genérica, mantendo-a em estado ocupado.

Por exemplo, o problema poderá ocorrer se você configurar involuntariamente várias assinaturas para seus relatórios no SQL Server Reporting Services Configuration Manager.

Solução alternativa

Para contornar esse problema, exclua os trabalhos que você não precisa.

Se houver muitas entradas de trabalho porque você configurou sem querer muitas assinaturas, exclua as assinaturas desnecessárias usando o Gerenciador de Configurações do Reporting Services.

Causa 2: Driver ODBC ausente ou não funcionando

Esse problema pode ocorrer se o driver ODBC (Open Database Connectivity) do SQL Server for removido ou não estiver funcionando (geralmente após as atualizações do sistema). O SQL Server Agent usa o driver ODBC do SQL Server para se conectar ao SQL Server. Se o driver estiver ausente ou não estiver funcionando, um SQL Server Agent não será iniciado.

Para obter informações sobre os requisitos de driver ODBC para versões diferentes do SQL Server, consulte os requisitos de hardware e software para o SQL Server.

Solução

  1. Para verificar se o driver ODBC do SQL Server está ausente, execute um dos seguintes comandos em uma janela do Prompt de Comando com privilégios elevados ou no PowerShell:

    1. Prompt de Comando:

      odbcad32.exe
      

      Esse comando abre o Administrador da Fonte de Dados ODBC.

    2. PowerShell:

      Get-OdbcDriver
      

      Esse comando gera uma lista dos drivers ODBC instalados.

  2. Verifique se o driver ODBC do SQL Server necessário está presente comparando-o com a tabela encontrada em versões do SQL Server e drivers ODBC e OLE DB. A tabela lista a versão do driver ODBC do SQL Server fornecido com cada mecanismo do SQL Server e usado pelo SQL Server Agent para se conectar ao mecanismo do SQL Server.

    1. Se a versão necessária do driver ODBC estiver presente, repare-a seguindo as etapas em ODBC Driver is present.
    2. Se o driver ODBC estiver ausente, instale-o seguindo as etapas em Driver ODBC está ausente.

O driver ODBC está presente

  1. Abra Adicionar ou Remover Programas e selecione o Microsoft ODBC Driver <Driver_Version> para SQL Server.
  2. Selecione os três pontos (...) e escolha Modificar.
  3. No assistente aberto, escolha a opção Reparar e siga as etapas para reparar o driver.
  4. Depois de concluir as etapas de reparo, você pode testar a conexão com o SQL Server configurando um DSN de teste com o driver do SQL Server reparado. Para obter mais informações, consulte as opções de DSN do Administrador da Fonte de Dados ODBC.

O driver ODBC está ausente

  1. Baixe o Driver ODBC para SQL Server.

  2. Instale o driver usando a GUI ou uma instalação silenciosa.

    1. Para executar uma instalação silenciosa, execute o seguinte comando:

      msiexec /i <ODBC_Driver_MSI> /qn
      
  3. Após a conclusão da instalação do driver, reinicie o SQL Server Agent.

  4. Verifique se o serviço SQL SERVER AGENT está em execução.

    1. Para uma instância do SQL Server sem nome, execute o seguinte comando do PowerShell:

      Get-Service -Name SQLSERVERAGENT
      
    2. Para uma instância nomeada do SQL Server, execute o seguinte comando do PowerShell:

      Get-Service -Name SQLAgent$<InstanceName>
      

Causa 3: Aguardando o serviço SQLAgent - Atualizador Genérico

Quando o SQL Server Agent é iniciado, o componente SQLAgent – Generic Refresher executa o msdb.dbo.sp_sqlagent_refresh_job procedimento para atualizar metadados de trabalho. Durante essa operação, o SQL Server pode verificar repetidamente a associação de grupos do Windows para proprietários de trabalho ou contas proxy. Essas verificações usam chamadas à API do Windows , o que pode fazer com que a sessão insira um ou mais dos seguintes tipos de espera:

  • PREEMPTIVE_OS_LOOKUPACCOUNTSID
  • PREEMPTIVE_OS_AUTHORIZATIONOPS
  • ASYNC_NETWORK_IO

Use a consulta a seguir para identificar a sessão e o texto do comando associado:

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';

Quando esse problema ocorre, a sessão está em um estado RUNNABLE e espera regularmente pelo tipo de espera PREEMPTIVE_OS_LOOKUPACCOUNTSID. Ou, a sessão está em um estado de espera para o ASYNC_NETWORK_IO tipo de espera.

Solução alternativa

Para reduzir os atrasos relacionados às pesquisas de autorização do Windows:

  • Verifique se os controladores de domínio são acessíveis e responsivos.
  • Evite usar grupos do Active Directory altamente aninhados ou muito grandes para a propriedade de trabalho do SQL Agent ou contas proxy.
  • Reinicie o SQL Server Agent após alterações significativas na associação de grupo do Active Directory para atualizar o token de acesso da conta de serviço.
  • Considere usar logins do SQL em vez de grupos do AD para responsabilidade pela execução de tarefas quando apropriado.
  • Revisar os trabalhos e proxies do SQL Agent para identificar principais do Windows que podem contribuir para consultas de segurança custosas no Windows.

Mais informações