Frage

Ich mag einen SQL Server 2008 Benachrichtigungs mich zu benachrichtigen, einzurichten, wenn eine Prozedur für 1 Sekunde ausführt oder mehr (nur ein Beispiel).

Irgendwelche Ideen?

EDIT:

Okay, es scheint dies nicht möglich ist. Aber, nur um dich stupsen in eine andere Richtung, ich weiß, dass es Statistiktabellen in der Master-Datenbank sind die Zusammenstellung zählt, die Anzahl der Anrufe und andere verschiedene Statistiken halten. Kann ich sie vielleicht in regelmäßigen Abständen abgefragt und dann darüber berichten, irgendwie?

War es hilfreich?

Lösung

nein es gibt keine Benachrichtigungen für diese. Sie werden eine Spur einzurichten und es hin und wieder abgefragt werden.

Andere Tipps

Ich möchte Mladen Prajdic die richtige Antwort hinzufügen und auf kevchadders' Antwort von SQL Server Zentrale zu verbessern. Die Lösung, die ich unten schlagen verwendet DBMail statt SQLMail (die durch SQLServerCentral-Lösung durch den Xp_sendmail Anruf verwendet wird). Im Wesentlichen verwendet SQLMail MAPI und ist schwieriger zu installieren und DBMail verwendet SMTP und ist einfacher zu installieren. Hier Weitere Informationen über den Unterschied zwischen den beiden.

Ich konnte nicht SQL Server Central Lösung erhalten in SQL 2005 zu arbeiten und die Lösung unter hat nur auf meine Installation von SQL 2005 getestet -. YMMV basiert auf der Version

Zunächst müssen Sie eine neue UDF, die die Job-ID in die Prozess-ID für einen JOIN werden übersetzen:

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

Und dann der 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

Dieses sproc kann leicht als SQL Server-Agent-Auftrag oder jede andere Methode erforderlich geplant werden. Es dauert keine Aktion, wenn der Auftrag nicht ausgeführt wird oder es innerhalb bestimmter Parameter ausgeführt wird. Es sendet die E-Mail, wenn der Auftrag ausgeführt wird länger als angegeben.

z.

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

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

Wenn dies auf sqlservercentral gefunden (es wahrscheinlich für eine ältere Version von SQL Server, aber immer noch könnte bis 2008 relevant sein)

Alert-Verfahren für den Langlauf Job http://www.sqlservercentral.com/scripts/Lock+and + Anschluss + Management / 30144 /

Text unten, wenn Sie kann nicht darauf zugreifen.

Für Aufträge, die in regelmäßigen Abständen ausgeführt werden und sollte nur kurze Zeit zu laufen nehmen, kann ein DBA wollen wissen, wann der Job für eine übermäßige Zeit ausgeführt wurde. In diesem Fall überprüft, um zu sehen, ob der Job nicht ausgeführt werden tun; die Fähigkeit, um sicherzustellen, dass es nicht für eine lange Zeit hat laufen benötigt. Die Anpassung der Job-ID zu einer Prozess-ID in sysprocesses erfordert einige Neuanordnung der Job-ID, das Spiel zu tun. Dieses Skript erstellt eine gespeicherte Prozedur, die einen Jobnamen, maximale Laufzeit erlaubt, und E-Mail-Adresse mitzuteilen akzeptieren. Es wird dann die Auftragsnamen zu verwenden, die Auftragsnummer und die Prüfung sysprocesses (bezogen auf dem Prozess-ID Teil des Programmnamen ist) erneut Zeichenfolge, die die Menge an Zeit, um zu bestimmen, die Arbeit runing wurde, dann Alarm, wenn die Zeit über die ist Parameter „Zeit erlaubt“.

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'

Sie könnten eine Monitoring-Software verwenden, wie Nagios regelmäßig die Anzahl der langsamen Abfragen in Ihrer Datenbank zu zählen.

Ich persönlich benutze die folgende Abfrage mit der ausgezeichneten PRTG . Ich stellte es mir jedes Mal eine E-Mail senden ich mehr als 5 Abfragen mit einer Ausführungszeit habe mehr als 3 Sekunden je, oder wenn die langsamste Abfrage dauert länger als 10 Sekunden:

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;

Disclaimer: Diese Abfrage basiert auf https://stackoverflow.com/a/820252/638040

Nun, wenn Sie Ihre Stored Procedures überwachen möchten, dann benutzen Sie einfach sys.dm_exec_procedure_stats statt sys.dm_exec_sql_text (auch das Feld creation_time aus der Auswahl entfernen und die SUBSTRING auf st.text zwicken)

Sie können melden Sie sich langsam laufenden Abfragen SQL Profiler verwenden, aber das wird Sie nicht mit einer Warnung helfen, speziell. (Ich nehme an, Sie zu einer Datei oder zu einer Datenbanktabelle einloggen konnten, und habe etwas anderes „hören“ und heben Sie eine Benachrichtigung).

Falls Sie nicht vertraut mit SQL Profiler hier sind die Schritte:

Sie sollten SQL Profiler auf etwas laufen anders als der Server selbst.

Beginnen Sie mit dem SQLProfilerTSQL_Duration template

Stellen Sie die Filter: Dauer: "Größer als" bis 1000 (milliseonds)

In den Filtern können Sie die Datenbank beschränken, Login, oder ähnlich, wenn nötig.

In den Veranstaltungen können Sie beschränken, nur sprocs (Standard enthält auch SQL-Anweisungen)

Wenn Sie nicht für eine kostenlose Lösung suchen, könnten Sie einen Blick auf SQL Sentry . Es tut, was man sich wünschen und mehr.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top