Pregunta

Me gustaría configurar un servidor SQL Server 2008 Alerta a notificarme cuando cualquier procedimiento ejecuta durante 1 segundo o más (es un ejemplo).

¿Alguna idea?

EDIT:

De acuerdo, parece que esto no es posible. Pero, sólo para empujar en otra dirección, sé que hay tablas estadísticas en la base de datos principal, que mantienen recuentos de compilación, número de llamadas y otras diversas estadísticas. Podría tal vez consultar periódicamente y luego informar sobre el mismo, de alguna manera?

¿Fue útil?

Solución

No hay ninguna notificación de este. que tendrá que establecer una traza y sondear que de vez en cuando.

Otros consejos

Me gustaría añadir a la respuesta correcta de Mladen Prajdic y para mejorar la respuesta kevchadders' desde SQL Server central. La solución que propongo a continuación utiliza DBMail en lugar de SQLMail (que es utilizado por la solución de SQLServerCentral por medio de la llamada xp_sendmail). Esencialmente, SQLMail utiliza MAPI y es más difícil de configurar y DBMail utiliza SMTP y es más fácil de instalar. Aquí está más información sobre la diferencia entre los dos.

No pude conseguir la solución de SQL Server central para trabajar en SQL 2005 y la solución a continuación sólo se ha probado en mi instalación de SQL 2005 -. Tu caso es distinto dependiendo de la versión

En primer lugar, se necesita un nuevo UDF, lo que se traducirá el ID de trabajo en el identificador de proceso para una combinación:

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

Y a continuación, el procedimiento almacenado:

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

Este procedimiento almacenado puede ser fácilmente programado como un trabajo del Agente SQL Server o cualquier otro método necesario. Que no realiza ninguna acción si el trabajo no se está ejecutando o se está ejecutando dentro de los parámetros especificados. Se envía el correo electrónico si el trabajo ha funcionado mas tiempo que el especificado.

por ejemplo.

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

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

Si se encuentra presente en sqlservercentral (probablemente de una versión anterior de SQL Server, pero aún podría ser relevante a 2008)

Procedimiento de Alerta de empleo de larga duración http://www.sqlservercentral.com/scripts/Lock+and + + Gestión de conexión / 30144 /

texto de abajo si no puede acceder a él.

Para los trabajos que se ejecutan periódicamente, y debe tener sólo un corto tiempo para correr, un DBA puede querer saber cuando el trabajo ha estado funcionando durante un tiempo excesivo. En este caso, sólo la comprobación para ver si se ejecuta el trabajo no va a hacer; la capacidad para asegurarse de que no ha estado funcionando por que se necesita un largo período. Que coincide con el ID de trabajo a un identificador de proceso en sysprocesses requiere algunas re-organización de la ID de la tarea de hacer el partido. Este script crea un procedimiento almacenado que acepta un nombre de trabajo, tiempo de ejecución máximo permitido, y dirección de correo electrónico para notificar. A continuación, utilice el nombre de trabajo para volver a la cadena el número de trabajos y comprobar sysprocesses (basado en el identificador de proceso de ser parte del nombre del programa) para determinar la cantidad de tiempo que el trabajo se ha runing, luego a la alerta si ese tiempo es el "tiempo permitido" parámetro.

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'

Se puede usar un software de monitoreo como Nagios periódicamente para contar el número de consultas lentas en su base de datos.

Yo personalmente uso la siguiente consulta con el excelente PRTG . Me puse a enviar un correo electrónico cada vez que tengo más de 5 consultas con un plazo de ejecución superior a 3 segundos cada uno, o cuando la consulta más lento tarda más de 10 segundos:

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;

exención de responsabilidad: esta consulta se basa en https://stackoverflow.com/a/820252/638040

Ahora bien, si desea supervisar los procedimientos almacenados, a continuación, sólo tiene que utilizar en lugar de sys.dm_exec_procedure_stats sys.dm_exec_sql_text (también quitar el creation_time campo de la selección y ajustar la subcadena en st.text)

Puede conectarse consultas de ejecución lenta utilizan SQL, pero eso no va a ayudar con una alerta, específicamente. (Supongo que se podría registrar en un archivo o en una tabla de base de datos y tener algo más "escuchar" y generar una alerta).

En caso de que no están familiarizados con el Analizador de SQL aquí están los pasos:

Debe ejecutar SQL en algo más que el propio servidor.

Comience con la plantilla SQLProfilerTSQL_Duration

Ajuste del filtro: Duración: "Mayor que" para 1000 (milliseonds)

En los filtros puede restringir la base de datos, inicio de sesión, o similar si es necesario.

En los eventos se puede restringir a solo sprocs (por defecto también incluye sentencias SQL)

Si usted no está buscando una solución gratuita, se puede echar un vistazo a SQL Sentry . Se hace lo que pide y más.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top