SQL Server 에이전트 작업이 실패하고 오류 258을 반환합니다.

이 문서에서는 Microsoft SQL Server 에이전트 작업이 실패하고 오류 코드 258을 생성하는 문제에 대한 문제 해결 지침을 제공합니다.

증상

SQL Server 에이전트 서비스가 실행되지만 예약된 SQL Server 에이전트 작업은 실행되지 않습니다. SQL Server 및 에이전트 로그는 실패한 로그인 외에도 네트워크 및 인증 시간 제한을 표시합니다.

다음 예제에서는 로그에 추가된 오류 메시지를 보여 줍니다.

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)

원인

이 문제는 다음과 같은 기본 문제로 인해 발생할 수 있습니다.

  • SQL 에이전트에서 사용하는 msdb 시스템 테이블 차단 이 차단은 작업 메타데이터 읽기 및 쓰기 작업을 차단합니다.
    • 시스템 테이블의 예는 다음과 dbo.sysjobsdbo.sysjobschedulers같습니다dbo.jobsteps.
  • 중요한 SQL Server 에이전트 스레드 또는 기타 프로세스 수준 문제에서 응답하지 않음(작동 중지)이 발생할 수 있습니다.
  • SQL Server의 작업자 스레드 고갈(사용 가능한 작업자 없음) 이 고갈로 인해 에이전트가 일정을 연결하거나 처리할 수 없습니다.

해결 방법

  1. SQL Server 에이전트 서비스가 실행 중인지 확인합니다. 다음 PowerShell 명령 중 하나를 사용합니다.

    • 기본 SQL 인스턴스의 경우:

      Get-Service -Name "SQLSERVERAGENT"
      
    • 명명된 SQL 인스턴스의 경우:

      Get-Service -Name "SQLSERVERAGENT$<InstanceName>"
      
  2. SQL Server 에이전트 서비스가 실행되고 있지 않으면 다음 명령 중 하나를 사용하여 시작합니다.

    • 기본 SQL 인스턴스의 경우:

      Start-Service -Name "SQLSERVERAGENT"
      
    • 명명된 SQL 인스턴스의 경우:

      Start-Service -Name "SQLSERVERAGENT$<InstanceName>"
      
  3. SQL Server 에이전트 서비스를 시작한 후에도 작업이 계속 실패하는 경우 다음 단계로 이동합니다. 작업이 성공적으로 완료되면 문제가 해결되고 추가 작업이 필요하지 않습니다.

  4. 에서 작업 및 일정을 확인합니다 msdb. SSMS(SQL Server Management Studio)를 시작하고 다음 쿼리를 실행합니다.

    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
    

    사용하도록 설정되었지만 실패한 모든 작업에 대한 쿼리 출력을 분석합니다. 문제가 있는 작업의 작업 기록 및 작업 단계 출력을 조사하여 기본 문제를 식별하고 해결합니다.

  5. SSMS에서 msdb 다음 쿼리를 실행하여 에이전트 시스템 테이블에서 차단 세션을 검색합니다.

    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 
    
    • 차단 세션과 연결된 쿼리를 식별하려면 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. 이전 단계에서 식별한 차단 세션을 해결하거나 종료합니다. 세션을 종료하려면 SSMS에서 다음 쿼리를 실행합니다.

    Kill <Blocking_Session_ID>
    

    모든 차단 세션이 확인되거나 종료된 후 다음 단계로 이동합니다.

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

    지정된 증상에 의해 결정된 다음 문제 중 하나로 상태 검사 쿼리의 출력을 조사합니다.

    • 작업자 스레드 압력:
      • 작업자 고갈(예 Workers: 512/512: .)
      • WorkQueue 가 0보다 큽니다. 이 값은 태스크가 대기 중이며 시스템이 오버로드됨을 나타냅니다.
    • CPU 압력:
      • RunnableTasks 가 0보다 큽니다. 이 값은 CPU 병목 상태가 있음을 나타냅니다. 0이 아닌 값은 SQL Server 스케줄러가 스레드(비수익 스케줄러)에 의해 독점되고 있음을 나타낼 수도 있습니다.
    • 메모리 압력:
      • Memory stateLOW입니다. 이 값은 전체 시스템이 메모리 부족임을 나타냅니다.
      • AvailableMB에 대한 낮은 값입니다. 이 값은 SQL Server의 높은 메모리 사용량을 나타냅니다.
      • PLE 300 미만의 값입니다. 이 값은 높은 메모리 변동을 나타냅니다.
  8. 이전 단계에서 작업자, CPU 또는 메모리 문제를 식별한 경우 현재 워크로드를 줄여 문제를 해결합니다. 문제를 식별하지 못한 경우 다음 단계로 이동합니다.

  9. 다음 PowerShell 명령 중 하나를 실행하여 SQL Server 에이전트를 다시 시작합니다.

    중요합니다

    SQL Server 에이전트를 다시 시작하면 현재 실행 중인 작업이 중단됩니다.

    • 기본 SQL Server 인스턴스의 경우:

      Restart-Service -Name "SQLSERVERAGENT"
      
    • 명명된 SQL Server 인스턴스의 경우:

      Restart-Service -Name "SQLAgent$<InstanceName>"
      
  10. SQL Server 에이전트가 다시 시작되면 작업이 실행 중인지 확인합니다. 작업 활동 모니터를 사용합니다.