実行する予定はないが、別のジョブであると思われるジョブによって開始されたジョブがあります。ジョブ履歴はありませんが、エラーログには表示されます。これが別のジョブによって呼び出されているかどうかをどのように確認できますか? sp_start_jobを使用してジョブステップ内のジョブをすぐに呼び出すことができることは知っていますが、その場合はどうすれば見つけられますか?
そして、なぜ実行されたジョブの履歴がないのでしょうか?
Error log entry:
2017-05-01 10:01:50.40 spid6s SPID: 131 ECID: 0 Statement Type: ALTER INDEX Line #: 1
2017-05-01 10:01:50.40 spid6s Input Buf: Language Event: EXECUTE [msdb]. dbo.IndexOptimize @Databases = 'Database1,Database2'
これが別のジョブによって呼び出されているかどうかをどのように確認できますか?
すべてのジョブステップで、他のジョブによって実行されたジョブ名の文字列を検索します(少なくともそれが疑わしいものです)。このクエリは this Webサイトからのものです。
USE [msdb]
GO
SELECT j.job_id,
s.srvname,
j.name,
js.step_id,
js.command,
j.enabled
FROM dbo.sysjobs j
JOIN dbo.sysjobsteps js
ON js.job_id = j.job_id
JOIN master.dbo.sysservers s
ON s.srvid = j.originating_server_id
WHERE js.command LIKE N'%KEYWORD_SEARCH%'
GO
実行したジョブに履歴がないのはなぜですか?
基本的な質問に答えるだけで、sp_start_job
を実行しているジョブがある場合は、msdb.dbo.sysjobsteps
システムテーブルを調べることで見つけることができます。このようなものは、sp_start_job
SPおよびそれを含むコマンドを実行するすべてのジョブのリストを提供します。
SELECT sysjobs.name, sysjobsteps.*
FROM msdb.dbo.sysjobsteps
JOIN msdb.dbo.sysjobs
ON sysjobsteps.job_id = sysjobs.job_id
WHERE sysjobsteps.command like '%sp_start_job%'
残念ながら、ジョブが実際にどこから呼び出されているかを教えてくれる履歴は知りません。
Michael Goldshteyn によって提供されるスクリプト here を追加のデータクレンジングとともに使用できます。また、次のスクリプトでは、「sp_start_job」を使用するために Kenneth Fisher によって提供されるフィルターを使用しています。
SELECT
[sJOB].[job_id] AS [JobID]
, [sJOB].[name] AS [JobName]
, [sJSTP].[step_uid] AS [StepID]
, [sJSTP].[step_id] AS [StepNo]
, [sJSTP].[step_name] AS [StepName]
, z.Call_To_Job
, CASE [sJSTP].[subsystem]
WHEN 'ActiveScripting' THEN 'ActiveX Script'
WHEN 'CmdExec' THEN 'Operating system (CmdExec)'
WHEN 'PowerShell' THEN 'PowerShell'
WHEN 'Distribution' THEN 'Replication Distributor'
WHEN 'Merge' THEN 'Replication Merge'
WHEN 'QueueReader' THEN 'Replication Queue Reader'
WHEN 'Snapshot' THEN 'Replication Snapshot'
WHEN 'LogReader' THEN 'Replication Transaction-Log Reader'
WHEN 'ANALYSISCOMMAND' THEN 'SQL Server Analysis Services Command'
WHEN 'ANALYSISQUERY' THEN 'SQL Server Analysis Services Query'
WHEN 'SSIS' THEN 'SQL Server Integration Services Package'
WHEN 'TSQL' THEN 'Transact-SQL script (T-SQL)'
ELSE sJSTP.subsystem
END AS [StepType]
, [sPROX].[name] AS [RunAs]
, [sJSTP].[database_name] AS [Database]
, [sJSTP].[command] AS [ExecutableCommand]
, CASE [sJSTP].[on_success_action]
WHEN 1 THEN 'Quit the job reporting success'
WHEN 2 THEN 'Quit the job reporting failure'
WHEN 3 THEN 'Go to the next step'
WHEN 4 THEN 'Go to Step: '
+ QUOTENAME(CAST([sJSTP].[on_success_step_id] AS VARCHAR(3)))
+ ' '
+ [sOSSTP].[step_name]
END AS [OnSuccessAction]
, [sJSTP].[retry_attempts] AS [RetryAttempts]
, [sJSTP].[retry_interval] AS [RetryInterval (Minutes)]
, CASE [sJSTP].[on_fail_action]
WHEN 1 THEN 'Quit the job reporting success'
WHEN 2 THEN 'Quit the job reporting failure'
WHEN 3 THEN 'Go to the next step'
WHEN 4 THEN 'Go to Step: '
+ QUOTENAME(CAST([sJSTP].[on_fail_step_id] AS VARCHAR(3)))
+ ' '
+ [sOFSTP].[step_name]
END AS [OnFailureAction]
FROM [msdb].[dbo].[sysjobsteps] AS [sJSTP]
INNER JOIN [msdb].[dbo].[sysjobs] AS [sJOB]
ON [sJSTP].[job_id] = [sJOB].[job_id]
LEFT JOIN [msdb].[dbo].[sysjobsteps] AS [sOSSTP]
ON [sJSTP].[job_id] = [sOSSTP].[job_id]
AND [sJSTP].[on_success_step_id] = [sOSSTP].[step_id]
LEFT JOIN [msdb].[dbo].[sysjobsteps] AS [sOFSTP]
ON [sJSTP].[job_id] = [sOFSTP].[job_id]
AND [sJSTP].[on_fail_step_id] = [sOFSTP].[step_id]
LEFT JOIN [msdb].[dbo].[sysproxies] AS [sPROX]
ON [sJSTP].[proxy_id] = [sPROX].[proxy_id]
CROSS APPLY
(
VALUES (
SUBSTRING([sJSTP].[command] , PATINDEX ('%sp_start_job%', [sJSTP].[command]), LEN([sJSTP].[command])) /*Strip the sp_start_job phrase*/
)
)X (Job_Search)
CROSS APPLY
(
VALUES (
SUBSTRING(X.Job_Search,PATINDEX('%''%',X.Job_Search) + 1 ,LEN(X.Job_Search)) /*Find the first quote that identifies the job name that is being executed executed*/
)
) Y(ModifiedCommand)
CROSS APPLY
(
VALUES (
SUBSTRING(ModifiedCommand , 1 , PATINDEX('%''%',ModifiedCommand )-1) /*Find the closing quote that identifies the job name that is being executed*/
)
) Z(Call_To_Job)
WHERE 1=1
AND [sJSTP].[command] LIKE '%sp_start_job%'
--AND Call_To_Job like '%Job name%' /*Uncomment to specify the job being called*/
ORDER BY [JobName], [StepNo]
ジョブに関連付けられた特別なログではなく、SQL Serverエラーログでエラーを確認しましたね。次に、このストアドプロシージャ(おそらくジョブで使用します)が手動で(SSMSなどから)実行された可能性があります。その場合、ジョブの履歴は含まれません(ジョブが実行されなかったため)。
IndexOptimize
がジョブではなく手動で実行された場合、あらゆる種類の情報がメタデータにある可能性があります(たとえば、そのストアドプロシージャを含むプランキャッシュでプランを見つけることができる場合があります。何かを教えてください)、またはIndexOptimize
自体のロギングオプションで。このOla Hallengrenインデックスメンテナンスプロシージャには、コマンドをテーブルに記録するオプション(CommandLog)が含まれています。そのテーブルをチェックして、今日ログに記録されたコマンドがあるかどうかを確認できます。