プロシージャが1秒以上実行されたときに通知するようにSQLServer2008アラートを設定したいと思います(単なる例)。
何か案は?
編集:
さて、これは不可能のようです。ただし、別の方向に移動するために、マスターデータベースには、コンパイルカウント、呼び出し数、およびその他のさまざまな統計を保持する統計テーブルがあることを知っています。定期的にクエリを実行して、それについてレポートすることはできますか?
プロシージャが1秒以上実行されたときに通知するようにSQLServer2008アラートを設定したいと思います(単なる例)。
何か案は?
編集:
さて、これは不可能のようです。ただし、別の方向に移動するために、マスターデータベースには、コンパイルカウント、呼び出し数、およびその他のさまざまな統計を保持する統計テーブルがあることを知っています。定期的にクエリを実行して、それについてレポートすることはできますか?
いいえ、これに関する通知はありません。トレースを設定し、時々ポーリングする必要があります。
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'
Nagiosのような監視ソフトウェアを使用して、データベース内の低速クエリの数を定期的にカウントできます。
私は個人的に、優れた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
、SUBSTRING を微調整しますst.text
)
Mladen Prajdic の正解に追加し、SQL Server Central からの kevchadders の回答を改善したいと思います。以下で提案するソリューションでは、SQLMail の代わりに DBMail を使用します (SQLServerCentral のソリューションで xp_sendmail 呼び出しによって使用されます)。基本的に、SQLMail は MAPI を使用するためセットアップが難しく、DBMail は SMTP を使用するためセットアップが簡単です。ここでは、2 つの違いについて詳しく説明します。
SQL Server Central のソリューションを SQL 2005 で動作させることができませんでした。以下のソリューションは、バージョンに基づいた SQL 2005 - YMMV のインストールでのみテストされています。
まず、ジョブ ID を JOIN のプロセス ID に変換する新しい 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
そして、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
SQLプロファイラーを使用して実行速度の遅いクエリをログに記録できますが、特にアラートには役立ちません。(ファイルまたはデータベーステーブルにログを記録し、他の何かを「リッスン」してアラートを発生させることができると思います)。
SQLプロファイラーに慣れていない場合の手順は次のとおりです。
サーバー自体以外でSQLProfilerを実行する必要があります。
SQLProfilerTSQL_Durationテンプレートから開始します
フィルタを設定します:期間:「より大きい」を1000(ミリ秒)に設定します
フィルタでは、必要に応じてデータベース、ログインなどを制限できます。
イベントでは、SProcsのみに制限できます(デフォルトにはSQLステートメントも含まれます)
無料のソリューションを探していない場合は、SQL Sentryをご覧ください。それはあなたが求めること以上のことをします。