سؤال

أرغب في إعداد تنبيه SQL Server 2008 لإعلامني عندما ينفذ أي إجراء لمدة ثانية واحدة أو أطول (مثال فقط).

أيه أفكار؟

تعديل:

حسنا، يبدو أن هذا غير ممكن. ولكن، فقط لإجازتك في اتجاه آخر، أعرف أن هناك طاولات إحصائية في قاعدة البيانات الرئيسية التي تحظى بتجميع التجميع وعدد المكالمات وغيرها من الإحصاءات المختلفة. هل يمكن أن أسلمها بشكل دوري ثم أبلغ عنها، بطريقة أو بأخرى؟

هل كانت مفيدة؟

المحلول

لا توجد إخطارات لهذا. سيكون عليك إعداد أثر واستطلاع عليه الآن ثم.

نصائح أخرى

أود أن أضيف إلى إجابة mladen prajdic الصحيح وتحسين إجابة Kevchadders من SQL Server Central. يستخدم الحل الذي أقترح أدناه dbmail بدلا من SQLMail (الذي يستخدم بواسطة SQLServerCentral's Solution عن طريق مكالمة XP_SENDMALAAL). أساسا، يستخدم SQLMail MAPI وأصعب الإعداد و DBMail يستخدم SMTP وهو أسهل لإعداده. هنا معلومات اكثر عن الفرق بين الاثنين.

لم أستطع الحصول على حل SQL Server Central للعمل في SQL 2005 وتم اختبار الحل أدناه فقط على تثبيت SQL 2005 - YMMV بناء على الإصدار.

أولا، ستحتاج إلى UDF جديد، وسوف يترجم معرف الوظيفة إلى معرف العملية للانضمام:

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

وبعد ذلك

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

يمكن بسهولة جدولة هذه التناثذ بسهولة كملك عامل خادم SQL أو أي طريقة أخرى ضرورية. لا يستغرق إجراء أي إجراء إذا لم يتم تشغيل المهمة أو قيد التشغيل داخل المعلمات المحددة. يرسل البريد الإلكتروني إذا استمرت المهمة لفترة أطول من المحددة.

على سبيل المثال

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+managements/30144/

النص أدناه إذا كنت غير قادر على الوصول إليه.

بالنسبة للوظائف التي تعمل بشكل دوري ويجب أن تأخذ سوى وقت قصير لتشغيل، قد ترغب DBA في معرفة متى تم تشغيل المهمة لفترة زائدة. في هذه الحالة، فقط تحقق لمعرفة ما إذا كانت المهمة قيد التشغيل لن تفعل؛ هناك حاجة إلى القدرة على التأكد من أنها لم تكن قيد التشغيل لفترة طويلة. يتطلب مطابقة معرف الوظيفة لمعرف العملية في sysprocesses بعض إعادة ترتيب معرف الوظيفة للقيام بالمباراة. ينشئ هذا البرنامج النصي إجراء مخزن سيقبل اسم وظيفة، والحد الأقصى لوقت التشغيل المسموح به، وعنوان البريد الإلكتروني للإخطار. سيتم بعد ذلك استخدام اسم الوظيفة لإعادة ترتيب رقم المهمة وتحقق من sysprocesses (بناء على معرف العملية يجري جزءا من اسم البرنامج) لتحديد مقدار الوقت الذي يعمل فيه المهمة، ثم تنبيه إذا كان ذلك الوقت "الوقت المسموح به" المعلمة.

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.. وبعد قمت بتعيينها لإرسال رسالة بريد إلكتروني إلي في كل مرة لدي أكثر من 5 استفسارات مع وقت التنفيذ أكبر من 3 ثوان، أو عندما يستغرق الاستعلام الأبطأ أطول من 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 Profiler هنا هي الخطوات:

يجب عليك تشغيل ملف تعريف SQL على شيء آخر غير الخادم نفسه.

ابدأ باستخدام قالب SQLProfilertsql_duration

اضبط المرشح: مدة: "أكبر من" إلى 1000 (mlongonds)

في المرشحات، يمكنك تقييد قاعدة البيانات، تسجيل الدخول، أو ما شابه ذلك إذا لزم الأمر.

في الأحداث، يمكنك تقييد Sprocs فقط (يتضمن الافتراضي أيضا بيانات SQL)

إذا كنت لا تبحث عن حل حر، فيمكنك إلقاء نظرة على SQL SENSRY.. وبعد يفعل ما تسأله وأكثر من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top