mysql 代理作业_查看SQLServer 代理作业的历史信息
不敢說眾所周知,但是大部分人都應(yīng)該知道SQLServer的 代理 作業(yè) 情況都存儲(chǔ)在SQLServer5大系統(tǒng)數(shù)據(jù)庫(kù)(master/msdb/model/tempdb/resources)中的MSDB中,而由于 代理 作業(yè) 的長(zhǎng)期運(yùn)行和種類較多,所以一般可以看到msdb的大小往往比其他庫(kù)加起來還大。本文主
不敢說眾所周知,但是大部分人都應(yīng)該知道SQLServer的代理作業(yè)情況都存儲(chǔ)在SQLServer5大系統(tǒng)數(shù)據(jù)庫(kù)(master/msdb/model/tempdb/resources)中的MSDB中,而由于代理作業(yè)的長(zhǎng)期運(yùn)行和種類較多,所以一般可以看到msdb的大小往往比其他庫(kù)加起來還大。本文主要專注在如何查詢作業(yè)的運(yùn)行時(shí)間點(diǎn)及運(yùn)行持續(xù)時(shí)間上。
作為DBA,周期性檢查作業(yè)情況是一下非常重要的任務(wù)。本文不講述太深入。只講述如何查詢作業(yè)的歷史運(yùn)行情況。并加入一下在聯(lián)機(jī)叢書上沒有提及,也就是所謂的未公開的系統(tǒng)函數(shù)。
作業(yè)執(zhí)行的歷史信息存放在msdb.dbo.sysjobhistory中。但是在這個(gè)表里面,日期和時(shí)間列的顯式方式會(huì)有點(diǎn)不常規(guī),這就引出了本文的意圖。首先我們來看看表里的數(shù)據(jù),這里需要關(guān)聯(lián)一下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
運(yùn)行上面的代碼,得到以下的結(jié)果:
可以看到run_date這列,雖然能看得懂,但是是YYYYMMDD這樣的格式,用起來可能有點(diǎn)不方便。而run_time就更加難用了。Run_time中的180002意味著:18:00:02執(zhí)行。這些不直觀的數(shù)據(jù)對(duì)時(shí)常需要使用的DBA來說是一種痛苦,當(dāng)然,可以通過字符串函數(shù)來轉(zhuǎn)換成自己喜歡看的格式。但是這里提供一個(gè)微軟未公開的函數(shù):
MSDB.dbo.agent_datetime(run_date,run_time)
它會(huì)返回一個(gè)比較常規(guī)的日期格式,使得使用和查看的時(shí)候都很方便,作為一個(gè)未公開的函數(shù),對(duì)其的了解不多只需要會(huì)用就可以了??梢允褂孟旅娴睦?#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
結(jié)果轉(zhuǎn)換后,得到下面的結(jié)果:
可以看到經(jīng)過函數(shù)格式化之后,數(shù)據(jù)已經(jīng)很直觀了。特別注意,這個(gè)未公開函數(shù)是從2005以后才引入,2000是沒有的。只能通過字符串處理來獲得同樣的效果。
現(xiàn)在再來看看另外一列,run_duration,運(yùn)行持續(xù)時(shí)間,同樣,這列是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
結(jié)果如下:
這列兩位數(shù)代表僅僅是秒,3位數(shù)代表秒和分。單純從這里比較難看出作業(yè)的運(yùn)行時(shí)間。對(duì)分析不利。比較遺憾的是沒有另外的存儲(chǔ)過程來轉(zhuǎn)換這列,所以需要自己編寫代碼,可以用下面的代碼來轉(zhuǎn)換:
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為了方便展示,這里我篩選了持續(xù)時(shí)間比較長(zhǎng)的幾個(gè)作業(yè)。
對(duì)于很多ETL的作業(yè),可能會(huì)有很多步驟,下面來把這些步驟也帶出來,這就要關(guān)聯(lián)另外一個(gè)表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
通過這個(gè)查詢,可以檢查到具體哪個(gè)作業(yè)運(yùn)行時(shí)間最長(zhǎng),然后進(jìn)行檢查和優(yōu)化。對(duì)于SQLServer 代理作業(yè)還有很多事情要做,由于主題原因,也不可能一篇就全部說完,將在后續(xù)文章中說明。
從代理作業(yè)中檢查性能問題只是查詢性能問題及檢查數(shù)據(jù)庫(kù)運(yùn)行情況的手段之一,很多數(shù)據(jù)庫(kù)管理方面的操作其實(shí)往往不是單一的,而是一系列的操作合成的。但是學(xué)會(huì)一種工具,你就多了一樣利器。
本文原創(chuàng)發(fā)布php中文網(wǎng),轉(zhuǎn)載請(qǐng)注明出處,感謝您的尊重!
總結(jié)
以上是生活随笔為你收集整理的mysql 代理作业_查看SQLServer 代理作业的历史信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建行欧洲旅行信用卡白金卡年费多少
- 下一篇: robotframework安装包_Ro