본문 바로가기

MSSQL

SQL Agent Job에서 작업수를 제한하기

반응형

동일한 작업

대상이 다른 동일한 작업을 동시에 내가 원하는 만큼만 관리해서 수행하고자 하는 경우에 해당됩니다. 서비스와 서버 부하를 고려하여 한번에 수행하지 않고 나눠서 수행해야 하는 경우 아래 방법을 사용하면 좋습니다. 아래 예는 robocopy를 이용하여 파일을 copy하는 작업을 나눠서 하는 경우를 보여주고 있습니다.

수행방법

아래 스크립트를 새로운 Job에 등록하고 5분 또는 자신이 원하는 주기로 모니터링처럼 스케쥴을 설정해 주면 됩니다.

Agent Job의 갯수를 6개가 넘지 않도록 확인하면서 AgetJob을 실행시켜주는 스크립트입니다.

declare @max_run_count int
declare @run_count int

--Max 실행 값을 6으로 설정
set @max_run_count =6

DECLARE  @RunningJobs TABLE(  
Job_ID UNIQUEIDENTIFIER,  
Last_Run_Date INT,  
Last_Run_Time INT,  
Next_Run_Date INT,  
Next_Run_Time INT,  
Next_Run_Schedule_ID INT,  
Requested_To_Run INT,  
Request_Source INT,  
Request_Source_ID VARCHAR(100),  
Running INT,  
Current_Step INT,  
Current_Retry_Attempt INT,  
State INT )    
     
INSERT INTO @RunningJobs EXEC master.dbo.xp_sqlagent_enum_jobs 1,garbage  

--현재 실행 중인 Job 파악
SELECT    
  @run_count=COUNT(JSR.Job_ID)
FROM     @RunningJobs JSR 
JOIN     msdb.dbo.sysjobs 
ON       JSR.Job_ID=sysjobs.job_id 
WHERE    Running=1

PRINT @run_count

--현재 실행 중인 Job과 Max 실행 값을 비교
if (@run_count<@max_run_count)
begin
	declare @job_name varchar(100)
	declare srvcur cursor local fast_forward
	for
		--현재 실행 중인 작업 외에 Max 여유분까지의 수량만큼 Job 추출
		SELECT top (@max_run_count-@run_count) j.name
		FROM msdb.dbo.sysjobs AS j
		WHERE name LIKE '(ROBOCOPY)%'
			AND NOT EXISTS (
				SELECT *
				FROM msdb.dbo.sysjobhistory AS jh
				WHERE jh.job_id=j.job_id
					AND jh.run_status=1 
					AND CONVERT(VARCHAR,jh.run_date,112)=CONVERT(VARCHAR,GETDATE(),112)
					--오늘 수행한 작업이고 성공했으면 제외
			) 
			AND NOT EXISTS (SELECT    
					JSR.Job_ID 
				FROM     @RunningJobs JSR 
				WHERE    Job_ID=j.job_id AND Running=1 
				--현재 실행 중인 작업 제외
			) ORDER BY j.name desc
	open srvcur

	declare @srvname varchar(100)
	fetch from srvcur into @job_name

	while @@fetch_status = 0
	begin
		--대상 Job Start
		exec msdb.dbo.sp_start_job @job_name
		fetch from srvcur into @job_name
	end

	close srvcur
	deallocate srvcur
end
 

 

 

반응형