mysql 代理作业_查看SQLServer 代理作业的历史信息
不敢說眾所周知,但是大部分人都應該知道SQLServer的 代理 作業 情況都存儲在SQLServer5大系統數據庫(master/msdb/model/tempdb/resources)中的MSDB中,而由于 代理 作業 的長期運行和種類較多,所以一般可以看到msdb的大小往往比其他庫加起來還大。本文主
不敢說眾所周知,但是大部分人都應該知道SQLServer的代理作業情況都存儲在SQLServer5大系統數據庫(master/msdb/model/tempdb/resources)中的MSDB中,而由于代理作業的長期運行和種類較多,所以一般可以看到msdb的大小往往比其他庫加起來還大。本文主要專注在如何查詢作業的運行時間點及運行持續時間上。
作為DBA,周期性檢查作業情況是一下非常重要的任務。本文不講述太深入。只講述如何查詢作業的歷史運行情況。并加入一下在聯機叢書上沒有提及,也就是所謂的未公開的系統函數。
作業執行的歷史信息存放在msdb.dbo.sysjobhistory中。但是在這個表里面,日期和時間列的顯式方式會有點不常規,這就引出了本文的意圖。首先我們來看看表里的數據,這里需要關聯一下sysjobs表:
SELECT j.name AS 'JobName' ,
run_date ,
run_time
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.enabled = 1 --Only Enabled Jobs
ORDER BY JobName ,
run_date ,
run_time DESC
運行上面的代碼,得到以下的結果:
可以看到run_date這列,雖然能看得懂,但是是YYYYMMDD這樣的格式,用起來可能有點不方便。而run_time就更加難用了。Run_time中的180002意味著:18:00:02執行。這些不直觀的數據對時常需要使用的DBA來說是一種痛苦,當然,可以通過字符串函數來轉換成自己喜歡看的格式。但是這里提供一個微軟未公開的函數:
MSDB.dbo.agent_datetime(run_date,run_time)
它會返回一個比較常規的日期格式,使得使用和查看的時候都很方便,作為一個未公開的函數,對其的了解不多只需要會用就可以了??梢允褂孟旅娴睦?#xff1a;
SELECT j.name AS 'JobName' ,
run_date ,
run_time ,
msdb.dbo.agent_datetime(run_date, run_time) AS 'RunDateTime'
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.enabled = 1 --Only Enabled Jobs
ORDER BY JobName ,
RunDateTime DESC
結果轉換后,得到下面的結果:
可以看到經過函數格式化之后,數據已經很直觀了。特別注意,這個未公開函數是從2005以后才引入,2000是沒有的。只能通過字符串處理來獲得同樣的效果。
現在再來看看另外一列,run_duration,運行持續時間,同樣,這列是int類型,也和run_time一樣,不直觀。
SELECT j.name AS 'JobName' ,
run_date ,
run_time ,
msdb.dbo.agent_datetime(run_date, run_time) AS 'RunDateTime' ,
run_duration
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.enabled = 1 --Only Enabled Jobs
ORDER BY JobName ,
RunDateTime DESC
結果如下:
這列兩位數代表僅僅是秒,3位數代表秒和分。單純從這里比較難看出作業的運行時間。對分析不利。比較遺憾的是沒有另外的存儲過程來轉換這列,所以需要自己編寫代碼,可以用下面的代碼來轉換:
SELECT j.name AS 'JobName' ,
run_date ,
run_time ,
msdb.dbo.agent_datetime(run_date, run_time) AS 'RunDateTime' ,
run_duration ,
( ( run_duration / 10000 * 3600 + ( run_duration / 100 ) % 100 * 60
+ run_duration % 100 + 31 ) / 60 ) AS 'RunDurationMinutes'
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.enabled = 1 --Only Enabled Jobs
ORDER BY JobName ,
RunDateTime DESC為了方便展示,這里我篩選了持續時間比較長的幾個作業。
對于很多ETL的作業,可能會有很多步驟,下面來把這些步驟也帶出來,這就要關聯另外一個表msdb.dbo.sysjobsteps:
SELECT j.name AS 'JobName' ,
s.step_id AS 'Step' ,
s.step_name AS 'StepName' ,
msdb.dbo.agent_datetime(run_date, run_time) AS 'RunDateTime' ,
( ( run_duration / 10000 * 3600 + ( run_duration / 100 ) % 100 * 60
+ run_duration % 100 + 31 ) / 60 ) AS 'RunDurationMinutes'
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobsteps s ON j.job_id = s.job_id
INNER JOIN msdb.dbo.sysjobhistory h ON s.job_id = h.job_id
AND s.step_id = h.step_id
AND h.step_id <> 0
WHERE j.enabled = 1 --Only Enabled Jobs
ORDER BY JobName ,
RunDateTime DESC
通過這個查詢,可以檢查到具體哪個作業運行時間最長,然后進行檢查和優化。對于SQLServer 代理作業還有很多事情要做,由于主題原因,也不可能一篇就全部說完,將在后續文章中說明。
從代理作業中檢查性能問題只是查詢性能問題及檢查數據庫運行情況的手段之一,很多數據庫管理方面的操作其實往往不是單一的,而是一系列的操作合成的。但是學會一種工具,你就多了一樣利器。
本文原創發布php中文網,轉載請注明出處,感謝您的尊重!
總結
以上是生活随笔為你收集整理的mysql 代理作业_查看SQLServer 代理作业的历史信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建行欧洲旅行信用卡白金卡年费多少
- 下一篇: robotframework安装包_Ro