문제

절차가 1 초 이상 실행될 때 (예제) SQL Server 2008 경고를 설정하고 싶습니다 (예제).

어떤 아이디어?

편집하다:

좋아, 이것은 불가능한 것 같다. 그러나 다른 방향으로 당신을 모으기 위해, 나는 컴파일 카운트, 통화 수 및 기타 다양한 통계를 보유하는 마스터 데이터베이스에 통계 테이블이 있다는 것을 알고 있습니다. 정기적으로 쿼리 한 다음 어떻게 든보고 할 수 있습니까?

도움이 되었습니까?

해결책

이에 대한 알림은 없습니다. 당신은 추적을 설정하고 때때로 그것을 폴링해야합니다.

다른 팁

Mladen Prajdic의 정답에 추가하고 SQL Server Central의 Kevchadders의 답변을 개선하고 싶습니다. 아래에 제안한 솔루션은 SQLMAIL 대신 DBMAIL (XP_SENDMAIL CALL을 통해 SQLSERVERCENTRAL의 솔루션에서 사용) 대신 DBMAIL을 사용합니다. 기본적으로 SQLMAIL은 MAPI를 사용하며 설정하기가 더 어렵고 DBMAIL은 SMTP를 사용하며 설정하기가 더 쉽습니다. 여기에 있습니다 추가 정보 둘 사이의 차이에 대해.

SQL Server Central의 솔루션을 SQL 2005에서 작동시킬 수 없었으며 아래 솔루션은 버전을 기반으로 SQL 2005 -YMMV 설치에서만 테스트되었습니다.

먼저 새로운 UDF가 필요합니다. 이는 작업 ID를 프로세스 ID로 변환 할 수 있습니다.

CREATE FUNCTION dbo.udf_SysJobs_GetProcessid(@job_id uniqueidentifier)
RETURNS VARCHAR(8)
AS
BEGIN
    RETURN (substring(left(@job_id,8),7,2) +
    substring(left(@job_id,8),5,2) +
    substring(left(@job_id,8),3,2) +
    substring(left(@job_id,8),1,2))
END

그리고 Sproc :

CREATE PROC sp_check_job_running 
    @job_name char(50),
    @minutes_allowed int, 
    @person_to_notify varchar(50) 

AS 

DECLARE @minutes_running int, 
    @message_text varchar(255)

SELECT @minutes_running = isnull(DATEDIFF(mi, p.last_batch, getdate()), 0)
FROM master..sysprocesses p
JOIN msdb..sysjobs j ON dbo.udf_sysjobs_getprocessid(j.job_id) = substring(p.program_name,32,8)
WHERE j.name = @job_name

IF @minutes_running > @minutes_allowed 
    BEGIN
      SELECT @message_text = ('Job ' + UPPER(SUBSTRING(@job_name,1,LEN(@job_name))) + ' has been running for ' + SUBSTRING(CAST(@minutes_running AS char(5)),1,LEN(CAST(@minutes_running AS char(5)))) + ' minutes, which is over the allowed run time of ' + SUBSTRING(CAST(@minutes_allowed AS char(5)),1,LEN(CAST(@minutes_allowed AS char(5)))) + ' minutes.') 
      EXEC msdb.dbo.sp_send_dbmail
        @recipients = @person_to_notify,
        @body = @message_text,
        @subject = 'Long-Running Job to Check' 
    END

이 SPROC은 SQL Server 에이전트 작업 또는 필요한 다른 방법으로 쉽게 예약 할 수 있습니다. 작업이 실행되지 않거나 지정된 매개 변수 내에서 실행되는 경우 조치가 취하지 않습니다. 작업이 지정된 것보다 더 오래 실행되면 이메일을 보냅니다.

예를 들어

EXEC sp_check_job_running 'JobNameGoesHere', 5, 'admin@mycompany.com'

HT : http://www.sqlserverspecialists.co.uk/blog/_archives/2008/11/26/3996346.html

이것을 sqlservercentral에서 발견했다면 (아마도 SQL Server의 이전 버전의 경우에도 여전히 2008 년과 관련이있을 수 있습니다)

장기 실행에 대한 경고 절차http://www.sqlservercentral.com/scripts/lock+and+connection+management/30144/

액세스 할 수없는 경우 아래 텍스트.

주기적으로 실행되고 달리는 데 짧은 시간이 걸리는 작업의 경우 DBA는 작업이 과도한 시간 동안 언제 실행되었는지 알고 싶어 할 수 있습니다. 이 경우, 작업이 실행 중인지 확인하는 것만 확인하십시오. 오랫동안 실행되지 않았는지 확인하는 능력이 필요합니다. Sysprocesses의 작업 ID를 프로세스 ID와 일치 시키려면 일치를 수행하려면 작업 ID를 다시 조절해야합니다. 이 스크립트는 작업 이름, 최대 실행 시간 허용 및 알림 주소를 수락하는 저장 프로 시저를 만듭니다. 그런 다음 작업 이름을 사용하여 작업 번호를 다시 스트리트하고 SysProcesses (프로그램 이름의 일부인 프로세스 ID를 기준으로) 작업의 시간을 결정한 다음 해당 시간이 끝나는 경우 경고합니다. "시간 허용"매개 변수.

CREATE proc sp_check_job_running
    @job_name       char(50),
    @minutes_allowed    int,
    @person_to_notify   varchar(50)
AS  

DECLARE @var1           char(1),
    @process_id     char(8),
    @job_id_char        char(8),
    @minutes_running    int,
    @message_text       varchar(255)

select @job_id_char = substring(CAST(job_id AS char(50)),1,8) 
from  msdb..sysjobs
where name = @job_name

select @process_id =    substring(@job_id_char,7,2) + 
            substring(@job_id_char,5,2) +
            substring(@job_id_char,3,2) +
            substring(@job_id_char,1,2)


select @minutes_running = DATEDIFF(minute,last_batch, getdate())
from master..sysprocesses
where program_name LIKE ('%0x' + @process_id +'%')

if @minutes_running > @minutes_allowed
  BEGIN
    select @message_text = ('Job ' 
    + UPPER(SUBSTRING(@job_name,1,LEN(@job_name)))
    + ' has been running for '
    + SUBSTRING(CAST(@minutes_running AS char(5)),1,LEN(CAST(@minutes_running AS char(5))))
    + ' minutes, which is over the allowed run time of '
    + SUBSTRING(CAST(@minutes_allowed AS char(5)),1,LEN(CAST(@minutes_allowed AS char(5)))) 
    + ' minutes.')
    EXEC master..xp_sendmail 
    @recipients = @person_to_notify, 
    @message = @message_text,
        @subject = 'Long-Running Job to Check'
  END

--  Typical job step syntax for job to do the checking

execute sp_check_job_running
      'JobThatSHouldBeDoneIn5Minutes', 
       5, 
       'DBAdmin@mycompany.com'

모니터링 소프트웨어와 같은 모니터링 소프트웨어를 사용할 수 있습니다 나기오스 데이터베이스의 느린 쿼리 수를 정기적으로 계산합니다.

나는 개인적으로 우수한 다음 쿼리를 사용합니다 prtg. 실행 시간이 3 초 이상인 5 개 이상의 쿼리가 있거나 가장 느린 쿼리가 10 초 이상 걸릴 때마다 이메일을 보내도록 설정했습니다.

SELECT total_elapsed_time / execution_count / 1000000 avg_elapsed_time, execution_count, creation_time, last_execution_time, 
SUBSTRING(st.text, (qs.statement_start_offset/2) + 1, ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
WHERE total_elapsed_time / execution_count / 1000000 >= 3  -- filter queries that takes > 3 seconds
AND CHARINDEX('dm_exec_query_stats', st.text) = 0   -- In case this query is slow, we don't want it in the result set!
ORDER BY total_elapsed_time / execution_count DESC;

면책 조항 :이 쿼리는 기반입니다 https://stackoverflow.com/a/820252/638040

이제 저장된 절차를 모니터링하려면 sys.dm_exec_procedure_stats 대신에 sys.dm_exec_sql_text (또한 필드를 제거하십시오 creation_time 선택에서 서브 스트링을 조정합니다 st.text)

SQL Profiler를 사용하는 느린 실행 쿼리를 기록 할 수 있지만 특히 경고에 도움이되지는 않습니다. (파일이나 데이터베이스 테이블에 로그인하고 다른 "듣기"에 경고를 올릴 수 있다고 생각합니다).

SQL 프로파일 러에 익숙하지 않은 경우 여기에 다음 단계가 있습니다.

서버 자체가 아닌 다른에서 SQL 프로파일러를 실행해야합니다.

sqlprofilertsql_duration 템플릿으로 시작하십시오

필터 설정 : 지속 시간 : "보다 큰"~ 1000 (Milliseonds)

필터에서 필요한 경우 데이터베이스, 로그인 또는 이와 유사한 것을 제한 할 수 있습니다.

이벤트에서는 Sprocs로 제한 할 수 있습니다 (기본값도 SQL 문도 포함).

무료 솔루션을 찾고 있지 않다면 살펴볼 수 있습니다. SQL 센트리. 그것은 당신이 요구하는 것 이상을합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top