Error en el trabajo del Agente SQL Server y devuelve el error 258

En este artículo se proporcionan instrucciones de solución de problemas para un problema que provoca un error en los trabajos del Agente SQL Server y genera el código de error 258.

Síntomas

El servicio Agente SQL Server se ejecuta, pero no se ejecutan los trabajos programados del Agente SQL Server. Los registros de SQL Server y del Agente muestran tiempos de espera de red y autenticación, además de los inicios de sesión con errores.

En el ejemplo siguiente se muestra el mensaje de error que se agrega a los registros:

SQLServer Error: 258, TCP Provider: Timeout error [258]
ODBC Error: 0, Login timeout expired [SQLSTATE HYT00]
SQLServer Error: 258, Unable to complete login process due to delay in prelogin response [SQLSTATE 08001]
Logon to server '<ServerName>' failed (ConnLogJobHistory)

Causa

Este problema puede deberse a cualquiera de los siguientes problemas subyacentes:

  • Bloqueo en tablas del sistema msdb que usa el Agente SQL. Este bloqueo impide las operaciones de lectura y escritura de los metadatos del trabajo.
    • Las tablas del sistema de ejemplo incluyen dbo.sysjobs, dbo.sysjobschedulersy dbo.jobsteps.
  • No responde (se bloquea) en subprocesos importantes del Agente SQL Server u otros problemas de nivel de proceso.
  • Agotamiento de hilos de trabajo en SQL Server (sin hilos disponibles). Este agotamiento impide que el agente se conecte o procese programaciones.

Solución

  1. Compruebe que el servicio agente SQL Server se está ejecutando. Use uno de los siguientes comandos de PowerShell:

    • Para las instancias de SQL predeterminadas:

      Get-Service -Name "SQLSERVERAGENT"
      
    • Para instancias de SQL nombradas:

      Get-Service -Name "SQLSERVERAGENT$<InstanceName>"
      
  2. Si el servicio agente SQL Server no se está ejecutando, inícielo mediante uno de los siguientes comandos:

    • Para las instancias de SQL predeterminadas:

      Start-Service -Name "SQLSERVERAGENT"
      
    • Para las instancias de SQL nombradas:

      Start-Service -Name "SQLSERVERAGENT$<InstanceName>"
      
  3. Si los trabajos continúan fallando después de iniciar el servicio SQL Server Agent, vaya al paso siguiente. Si los trabajos finalizan correctamente, el problema se resuelve y no se requiere ninguna acción adicional.

  4. Compruebe los trabajos y programaciones en msdb. Inicie SQL Server Management Studio (SSMS) y ejecute la consulta siguiente:

    USE msdb;
    GO
    -- List enabled jobs
    SELECT name, enabled, description 
    FROM msdb.dbo.sysjobs 
    WHERE enabled = 1;
    GO
    -- List schedules and next run information
    SELECT 
        s.name AS ScheduleName,
        j.name AS JobName,
        s.enabled AS ScheduleEnabled,
        s.active_start_date,
        s.active_end_time
    FROM msdb.dbo.sysjobs j
    JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id
    JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id
    WHERE j.enabled = 1;
    GO
    

    Analice la salida de la consulta para los trabajos habilitados pero que han fallado. Investigue el historial y los resultados de las etapas de trabajos problemáticos para identificar y corregir problemas subyacentes.

  5. Detecte sesiones de bloqueo en msdb tablas del sistema del Agente ejecutando la siguiente consulta en SSMS.

    USE msdb;
    GO
    SELECT 
        session_id, 
        blocking_session_id, 
        wait_type, 
        wait_duration_ms, 
        resource_description
    FROM sys.dm_os_waiting_tasks
    WHERE resource_description LIKE '%sysjobs%'
       OR resource_description LIKE '%sysjobschedulers%'
       OR resource_description LIKE '%jobsteps%';
    GO 
    
    • Para identificar la consulta asociada a una sesión de bloqueo, ejecute la siguiente consulta en SSMS:

      SELECT 
          wt.session_id,
          wt.blocking_session_id,
          wt.wait_type,
          wt.wait_duration_ms,
          wt.resource_description,
          er.status,
          er.command,
          er.cpu_time,
          er.total_elapsed_time,
          txt.text AS sql_text
      FROM sys.dm_os_waiting_tasks wt
      LEFT JOIN sys.dm_exec_requests er 
             ON wt.session_id = er.session_id
      CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS txt
      WHERE wt.resource_description LIKE '%sysjobs%'
         OR wt.resource_description LIKE '%sysjobschedulers%'
         OR wt.resource_description LIKE '%jobsteps%';
      
  6. Resuelva o finalice las sesiones de bloqueo que identificó en el paso anterior. Para finalizar una sesión, ejecute la siguiente consulta en SSMS:

    Kill <Blocking_Session_ID>
    

    Una vez resueltas o finalizadas todas las sesiones de bloqueo, vaya al paso siguiente.

  7. Compruebe si hay problemas de trabajo, subproceso o estado de los recursos mediante la ejecución de la siguiente consulta en SSMS:

    /* ============================================================
       HEALTH CHECK (Worker, CPU, Memory)
       ============================================================ */
    
    SELECT 
        Section,
        Metric,
        Value,
        ExtraInfo
    FROM (
    
        /* ===============================
           WORKER THREAD STATUS
           =============================== */
        SELECT 
            CAST('WORKER THREAD STATUS' AS VARCHAR(MAX)) AS Section,
            CAST(CONCAT('Scheduler ', scheduler_id) AS VARCHAR(MAX)) AS Metric,
            CAST(CONCAT('Workers: ', active_workers_count, '/', current_workers_count) AS VARCHAR(MAX)) AS Value,
            CAST(CONCAT('WorkQueue=', work_queue_count, ', Idle=', is_idle) AS VARCHAR(MAX)) AS ExtraInfo
        FROM sys.dm_os_schedulers
        WHERE scheduler_id < 255
    
        UNION ALL
    
        /* ===============================
           CPU PRESSURE
           =============================== */
        SELECT
            CAST('CPU PRESSURE' AS VARCHAR(MAX)) AS Section,
            CAST(CONCAT('Scheduler ', scheduler_id) AS VARCHAR(MAX)) AS Metric,
            CAST(CONCAT('RunnableTasks=', runnable_tasks_count) AS VARCHAR(MAX)) AS Value,
            CAST(CONCAT('PendingIO=', pending_disk_io_count) AS VARCHAR(MAX)) AS ExtraInfo
        FROM sys.dm_os_schedulers
        WHERE scheduler_id < 255
    
        UNION ALL
    
        /* ===============================
           MEMORY STATUS (System)
           =============================== */
        SELECT
            CAST('MEMORY STATUS' AS VARCHAR(MAX)) AS Section,
            CAST('SystemMemoryState' AS VARCHAR(MAX)) AS Metric,
            CAST(system_memory_state_desc AS VARCHAR(MAX)) AS Value,
            CAST(CONCAT('TotalMB=', total_physical_memory_kb/1024, 
                        ', AvailableMB=', available_physical_memory_kb/1024) AS VARCHAR(MAX)) AS ExtraInfo
        FROM sys.dm_os_sys_memory
    
        UNION ALL
    
        /* ===============================
           PAGE LIFE EXPECTANCY
           =============================== */
        SELECT
            CAST('PAGE LIFE EXPECTANCY' AS VARCHAR(MAX)) AS Section,
            CAST('PLE' AS VARCHAR(MAX)) AS Metric,
            CAST(cntr_value AS VARCHAR(MAX)) AS Value,
            CAST(NULL AS VARCHAR(MAX)) AS ExtraInfo
        FROM sys.dm_os_performance_counters
        WHERE counter_name = 'Page life expectancy'
          AND object_name LIKE '%Buffer Manager%'
    
    ) AS x
    ORDER BY Section, Metric;
    

    Investigue la salida de la consulta de comprobación de estado si hay alguno de los siguientes problemas determinados por los síntomas especificados.

    • Presión del hilo de trabajador:
      • Agotamiento del trabajo, por ejemplo Workers: 512/512.
      • WorkQueue es mayor que cero. Este valor indica que las tareas están esperando y que el sistema está sobrecargado.
    • Presión de CPU:
      • RunnableTasks es mayor que cero. Este valor indica que existe un cuello de botella en la CPU. Un valor distinto de cero también puede indicar que el programador de SQL Server está siendo monopolizado por un subproceso (un programador que no produce rendimiento).
    • Presión de memoria:
      • Memory state es LOW. Este valor indica que el sistema general tiene poca memoria.
      • Valor bajo para AvailableMB. Este valor indica un uso elevado de memoria para SQL Server.
      • Valor PLE inferior a 300. Este valor indica una agitación de memoria elevada.
  8. Si identificó algún problema de trabajo, CPU o memoria en el paso anterior, reduzca la carga de trabajo actual para resolver los problemas. Si no ha identificado ningún problema, vaya al paso siguiente.

  9. Reinicie el Agente SQL Server mediante la ejecución de uno de los siguientes comandos de PowerShell:

    Importante

    Al reiniciar el Agente SQL Server, se interrumpen los trabajos que se están ejecutando actualmente.

    • Para las instancias predeterminadas de SQL Server:

      Restart-Service -Name "SQLSERVERAGENT"
      
    • Para las instancias de SQL Server con nombre:

      Restart-Service -Name "SQLAgent$<InstanceName>"
      
  10. Después de reiniciar el Agente SQL Server, compruebe que los trabajos se están ejecutando ahora. Use el Monitor de actividad del trabajo.