Question

Je voudrais créer un SQL Server 2008 Alert pour me prévenir lorsque toute procédure exécute pendant 1 seconde ou plus (juste un exemple).

Toutes les idées?

EDIT:

D'accord, il semble que ce n'est pas possible. Mais, juste pour vous pousser dans une autre direction, je sais qu'il ya des tables de statistiques dans la base de données principale qui conservent des comptes de compilation, le nombre d'appels et d'autres diverses statistiques. Pourrais-je peut-être les interroger périodiquement puis faire rapport à ce sujet, en quelque sorte?

Était-ce utile?

La solution

pas il n'y a pas de notifications pour cela. vous devrez mettre en place une trace et chaque sondage maintenant et puis.

Autres conseils

Je voudrais ajouter à la réponse correcte de Mladen Prajdic et d'améliorer la réponse de kevchadders de SQL Server Central. La solution que je propose ci-dessous utilise dbmail au lieu de SQLMail (qui est utilisé par la solution de SQLServerCentral par le biais de l'appel xp_sendmail). Essentiellement, SQLMail utilise MAPI et est plus difficile à configurer et à dbmail utilise le protocole SMTP et est plus facile à installer. Voici plus d'informations la différence entre les deux.

Je ne pouvais pas obtenir la solution de Central SQL Server pour travailler dans SQL 2005 et la solution ci-dessous a été testé sur mon installation de SQL 2005 -. YMMV basé sur la version

D'abord, vous aurez besoin d'une nouvelle UDF, qui se traduira par l'identification du travail dans l'ID de processus pour une jointure:

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

Et puis le 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

Cette sproc peut facilement être programmé comme un travail SQL Server Agent ou toute autre méthode nécessaire. Il ne prend aucune mesure si le travail ne fonctionne pas ou est en cours d'exécution dans les paramètres spécifiés. Il envoie l'e-mail si le travail est plus long terme que spécifié.

par exemple.

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

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

Si trouvé sur sqlservercentral (il probablement une ancienne version de SQL Server, mais pourrait être pertinent à 2008)

Procédure d'alerte pour l'emploi de longue durée http://www.sqlservercentral.com/scripts/Lock+and + Connexion + Management / 30144 /

Texte ci-dessous si vous ne peux pas accès il.

Pour les travaux exécutés périodiquement et ne devrait prendre que peu de temps pour courir, un DBA peut vouloir savoir quand le travail a été en cours d'exécution pour un temps excessif. Dans ce cas, il suffit de vérifier si le travail est en cours ne fera pas; la capacité de vous assurer qu'il n'a pas été en cours d'exécution pendant une longue période est nécessaire. Correspondant à l'ID du travail à un ID de processus sysprocesses nécessite quelques réorganisant de l'identifiant de travail à faire le match. Ce script crée une procédure stockée qui accepte un nom de travail, temps de fonctionnement maximum autorisé, et l'adresse e-mail de notification. Il utilisera alors le nom du travail de re-chaîne le nombre d'emplois et contrôle sysprocesses (basé sur l'ID de processus faisant partie du nom du programme) afin de déterminer la durée pendant laquelle le travail a été runing, puis alerte si ce temps est révolu le paramètre « temps alloué ».

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'

Vous pouvez utiliser un logiciel de surveillance comme Nagios compter périodiquement le nombre de requêtes lentes dans votre base de données.

j'utilise la requête suivante avec l'excellent PRTG . Je l'ai mis à me envoyer un e-mail chaque fois que j'ai plus de 5 requêtes avec un temps d'exécution supérieure à 3 secondes chacun, ou lorsque la plus lente requête prend plus de 10 secondes:

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;

Avertissement: cette requête est basée sur https://stackoverflow.com/a/820252/638040

Maintenant, si vous voulez surveiller vos procédures stockées, puis il suffit d'utiliser sys.dm_exec_procedure_stats au lieu de sys.dm_exec_sql_text (également supprimer le creation_time sur le terrain de la sélection et de modifier la sous-chaîne sur st.text)

Vous pouvez enregistrer les requêtes en cours d'exécution lente utilisent SQL Profiler, mais qui ne vous aidera pas à une alerte, en particulier. (Je suppose que vous pouvez vous connecter à un fichier ou à une table de base de données, et d'avoir quelque chose d'autre « écouter » et lever une alerte).

Dans le cas où vous n'êtes pas familier avec SQL Profiler voici les étapes:

Vous devez exécuter SQL Profiler sur autre chose que le serveur lui-même.

Commencez par le modèle de SQLProfilerTSQL_Duration

Réglez le filtre: Durée: "Plus de" 1000 (milliseonds)

Dans les filtres, vous pouvez limiter la base de données, Connexion ou similaire si nécessaire.

Dans les événements que vous pouvez limiter uniquement Sprocs (par défaut inclut également des instructions SQL)

Si vous n'êtes pas à la recherche d'une solution gratuite, vous pouvez jeter un oeil à SQL Sentry . Il fait ce que vous demandez et plus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top