web-dev-qa-db-ja.com

別のジョブを呼び出すジョブを見つける

実行する予定はないが、別のジョブであると思われるジョブによって開始されたジョブがあります。ジョブ履歴はありませんが、エラーログには表示されます。これが別のジョブによって呼び出されているかどうかをどのように確認できますか? 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'
5
Marvel

これが別のジョブによって呼び出されているかどうかをどのように確認できますか?

すべてのジョブステップで、他のジョブによって実行されたジョブ名の文字列を検索します(少なくともそれが疑わしいものです)。このクエリは 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

実行したジョブに履歴がないのはなぜですか?

ジョブ履歴の設定方法によって異なります。私の ブログ投稿 をご覧ください。別の良い参考資料 ここ

3
SqlWorldWide

基本的な質問に答えるだけで、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%'

残念ながら、ジョブが実際にどこから呼び出されているかを教えてくれる履歴は知りません。

1
Kenneth Fisher

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]
0
hkravitz

ジョブに関連付けられた特別なログではなく、SQL Serverエラーログでエラーを確認しましたね。次に、このストアドプロシージャ(おそらくジョブで使用します)が手動で(SSMSなどから)実行された可能性があります。その場合、ジョブの履歴は含まれません(ジョブが実行されなかったため)。

IndexOptimizeがジョブではなく手動で実行された場合、あらゆる種類の情報がメタデータにある可能性があります(たとえば、そのストアドプロシージャを含むプランキャッシュでプランを見つけることができる場合があります。何かを教えてください)、またはIndexOptimize自体のロギングオプションで。このOla Hallengrenインデックスメンテナンスプロシージャには、コマンドをテーブルに記録するオプション(CommandLog)が含まれています。そのテーブルをチェックして、今日ログに記録されたコマンドがあるかどうかを確認できます。

0
RDFozz