2016-12-05 1 views
1

한 인스턴스에 약 40 개의 다른 SQL Server 작업이 있습니다. 그들은 모두 서로 다른 스케줄을 가지고 있습니다. 일부는 하루에 한 번, 매 2 분마다 5 분마다 실행됩니다. SQL Server 에이전트를 중지해야하는 경우 작업이 실행되지 않을 때 가장 좋은 시간을 찾아 내 작업을 방해하지 않으려면 어떻게해야합니까?작업이 실행되고 있지 않을 때 SQL Server 에이전트를 자동으로 중지하는 방법?

+0

** 일부 매 2 분 **, 그래서 당신은 ** 그것을 중단하고 ** 다시 시작해야합니다 ** 2 분마다? – Sami

답변

1

작업을 사용하지 못하게하는 스크립트를 만드는 것이 좋습니다. 비활성화 된 작업은 여전히 ​​존재하지만 일정에 따라 자동으로 실행되지 않습니다. 작업을 사용하지 않도록 설정하고 현재 실행중인 작업이 실행을 완료 할 때까지 기다린 다음 SQL 에이전트를 중지하려면이 스크립트 (msdb 데이터베이스의 sp_update_job 프로 시저를 기반으로 함)를 실행하십시오. 비활성화 된 작업을 다시 활성화하는 유사한 스크립트가 유용합니다. 장애인으로 남아 있어야하는 일을 계획해야 할 수도 있습니다.

완전한 "SQL 에이전트 종료"프로세스를 완전히 스크립팅 할 수는 있지만 그렇게하는 것이 좋습니다. 약간의 연구는 주어진 작업이 실행 중인지 아닌지를 프로그래밍 방식으로 알려주는 100 % 신뢰할 수있는 방법이 없다는 것을 의미하며 문서화되지 않은 경우 ("문서화되지 않은"는 "이 문서를 사용하지 않아야 함"을 의미합니다) 시스템 SQL Server 자체를 사용하여 서비스를 중지하고 시작하는 절차는 매우 나쁜 생각처럼 보입니다.

3

질문 제목이 나에게 조금 겁 먹었습니다. 실행중인 작업이 없을 때 프로그래밍 방식으로 SQL Server 에이전트를 종료하려고한다고 생각했습니다. 그 질문에 대한 나의 대답은 "왜?" 필요가 없습니다.

그러나 계획된 재시작 또는 종료를 원할 때 시각적으로 처리 할 Sentry One의 SQL Sentry Event Manager와 같은 타사 도구가 없다면 SQL Server 에이전트 작업 내역 및 Job Activity Monitor 도움말을 참조하십시오. 작업 활동 모니터는 상태 컬럼에서 현재 실행중인 작업을 표시 할 수 있습니다. 또한 마지막 실행 날짜와 다음 실행 날짜 및 시간을 볼 수 있습니다.

SSMS의 개체 브라우저에서 인스턴스에 연결 한 다음 SQL Server 에이전트를 확장하면 작업이 표시되고 그 아래에 "작업 활동 모니터"가 표시됩니다.이보기에는 필요한 항목이 표시됩니다.

또한 작업이 실행되기 전에 종료하는 것에 대해 걱정할 필요가 없습니다. 그렇게하면 일정이 누락 된 작업이 생기고 다음 작업 일 때 (작업 및 목적에 따라 다름) 실행되도록하거나 수동으로 작업을 마우스 오른쪽 단추로 클릭하고 실행할 수 있습니다.

작업에 대한 작업 모니터에 대한 자세한 내용은 제품 설명서에서 Monitor Job Activity을 참조하십시오.

3

일자리가 없을 때 가장 좋은 시간을 찾아 내 작업을 방해하지 않으려면 어떻게해야합니까?

기본적으로 유지 관리를 수행하기위한 좋은 창을 찾고 싶습니다. MSSQLTips.com 기사 Querying SQL Server Agent Job Information에 Dattatrey Sindol 같이 @MaxVernon

/* 
     Shows gaps between agent jobs 
-- http://www.sqlserver.science/tools/gaps-between-sql-server-agent-jobs/ 
-- requires SQL Server 2012+ since it uses the LAG aggregate. 
Note: On SQL Server 2005, SQL Server 2008, and SQL Server 2008 R2, you could replace the LastEndDateTime column definition with: 

     LastEndDateTime = (SELECT TOP(1) s1a.EndDateTime FROM s1 s1a WHERE s1a.rn = s1.rn - 1) 
*/ 
DECLARE @EarliestStartDate DATETIME; 
DECLARE @LatestStopDate DATETIME; 
SET @EarliestStartDate = DATEADD(DAY, -1, GETDATE()); 
SET @LatestStopDate = GETDATE(); 
;WITH s AS 
(
    SELECT StartDateTime = msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time) 
      , MaxDuration = MAX(sjh.run_duration) 
    FROM msdb.dbo.sysjobs sj 
      INNER JOIN msdb.dbo.sysjobhistory sjh ON sj.job_id = sjh.job_id 
    WHERE sjh.step_id = 0 
     AND msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time) >= @EarliestStartDate 
     AND msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time) < = @LatestStopDate 
    GROUP BY msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time) 
    UNION ALL 
    SELECT StartDate = DATEADD(SECOND, -1, @EarliestStartDate) 
     , MaxDuration = 1 
    UNION ALL 
    SELECT StartDate = @LatestStopDate 
     , MaxDuration = 1 
) 
, s1 AS 
(
SELECT s.StartDateTime 
    , EndDateTime = DATEADD(SECOND, s.MaxDuration - ((s.MaxDuration/100) * 100) 
     + (((s.MaxDuration - ((s.MaxDuration/10000) * 10000)) 
        - (s.MaxDuration - ((s.MaxDuration/100) * 100)))/100) * 60 
     + (((s.MaxDuration - ((s.MaxDuration/1000000) * 1000000)) 
        - (s.MaxDuration - ((s.MaxDuration/10000) * 10000)))/10000) * 3600, s.StartDateTime) 
FROM s 
) 
, s2 AS 
(
    SELECT s1.StartDateTime 
     , s1.EndDateTime 
     , LastEndDateTime = LAG(s1.EndDateTime) OVER (ORDER BY s1.StartDateTime) 
    FROM s1 
) 
SELECT GapStart = CONVERT(DATETIME2(0), s2.LastEndDateTime) 
    , GapEnd = CONVERT(DATETIME2(0), s2.StartDateTime) 
    , GapLength = CONVERT(TIME(0), DATEADD(SECOND, DATEDIFF(SECOND, s2.LastEndDateTime, s2.StartDateTime), 0)) 
FROM s2 
WHERE s2.StartDateTime > s2.LastEndDateTime 
    ORDER BY s2.StartDateTime; 
1

당신은 시스템 테이블을 조회 할 수있는 편리한 스크립트로 here에 대해 블로그했습니다

SELECT 
    [sJOB].[job_id] AS [JobID] 
    , [sJOB].[name] AS [JobName] 
    , [sDBP].[name] AS [JobOwner] 
    , [sCAT].[name] AS [JobCategory] 
    , [sJOB].[description] AS [JobDescription] 
    , CASE [sJOB].[enabled] 
     WHEN 1 THEN 'Yes' 
     WHEN 0 THEN 'No' 
     END AS [IsEnabled] 
    , [sJOB].[date_created] AS [JobCreatedOn] 
    , [sJOB].[date_modified] AS [JobLastModifiedOn] 
    , [sSVR].[name] AS [OriginatingServerName] 
    , [sJSTP].[step_id] AS [JobStartStepNo] 
    , [sJSTP].[step_name] AS [JobStartStepName] 
    , CASE 
     WHEN [sSCH].[schedule_uid] IS NULL THEN 'No' 
     ELSE 'Yes' 
     END AS [IsScheduled] 
    , [sSCH].[schedule_uid] AS [JobScheduleID] 
    , [sSCH].[name] AS [JobScheduleName] 
    , CASE [sJOB].[delete_level] 
     WHEN 0 THEN 'Never' 
     WHEN 1 THEN 'On Success' 
     WHEN 2 THEN 'On Failure' 
     WHEN 3 THEN 'On Completion' 
     END AS [JobDeletionCriterion] 
FROM 
    [msdb].[dbo].[sysjobs] AS [sJOB] 
    LEFT JOIN [msdb].[sys].[servers] AS [sSVR] 
     ON [sJOB].[originating_server_id] = [sSVR].[server_id] 
    LEFT JOIN [msdb].[dbo].[syscategories] AS [sCAT] 
     ON [sJOB].[category_id] = [sCAT].[category_id] 
    LEFT JOIN [msdb].[dbo].[sysjobsteps] AS [sJSTP] 
     ON [sJOB].[job_id] = [sJSTP].[job_id] 
     AND [sJOB].[start_step_id] = [sJSTP].[step_id] 
    LEFT JOIN [msdb].[sys].[database_principals] AS [sDBP] 
     ON [sJOB].[owner_sid] = [sDBP].[sid] 
    LEFT JOIN [msdb].[dbo].[sysjobschedules] AS [sJOBSCH] 
     ON [sJOB].[job_id] = [sJOBSCH].[job_id] 
    LEFT JOIN [msdb].[dbo].[sysschedules] AS [sSCH] 
     ON [sJOBSCH].[schedule_id] = [sSCH].[schedule_id] 
ORDER BY [JobName] 
+0

SQL Server에서 실행중인 작업을보고 싶습니다. 실행중인 작업이 없으면 에이전트를 중지하십시오. – Sami

관련 문제