SQL SERVER作业的Schedules浅析
??? SQL SERVER作業(yè)的計(jì)劃(Schedules),如果你沒仔細(xì)研究過或沒有應(yīng)用一些復(fù)雜的計(jì)劃(Schedules),那么你覺得SQL SERVER作業(yè)的計(jì)劃(Schedules)非常好用,也沒啥問題,但是我要告訴你一個(gè)“殘酷”的真相,相比Linux系統(tǒng)的Crontab,SQL SERVER作業(yè)的計(jì)劃其實(shí)是一個(gè)二等殘廢,很多功能要實(shí)行起來真的是讓人頭疼!
如果你自認(rèn)為非常了解作業(yè)的配置(不要想當(dāng)然,實(shí)踐驗(yàn)證保證會(huì)讓你大吃一驚)?那么接下來先看看幾個(gè)問題:
1:如果你要配置作業(yè)在每個(gè)小時(shí)的第20分鐘執(zhí)行,例如1:20、2:20、3:20........執(zhí)行,你怎么配置?
2:在計(jì)劃(Schedules)里面,如果執(zhí)行間隔為“小時(shí)”,那么取值必須為整數(shù)嗎? 可以為2.5個(gè)小時(shí)嗎?
3:在計(jì)劃(Schedules)里面,如果我要設(shè)置執(zhí)行間隔為90分鐘計(jì)劃,這樣能行嗎?
4:如果我想在計(jì)劃(Schedules)外,多執(zhí)行一次作業(yè),如何執(zhí)行? 執(zhí)行了后,是否影響作業(yè)的計(jì)劃Schedules?
5: 修改系統(tǒng)時(shí)間,是否會(huì)影響作業(yè)的Schedule?
?
1:如果你要配置作業(yè)在每個(gè)小時(shí)的第20分鐘執(zhí)行,例如1:20、2:20、3:20........執(zhí)行,你怎么配置?
對于問題1這種類似的問題,如果你遇到過而且解決過這類問題,那么其實(shí)很簡單,你只需要設(shè)置開始時(shí)間為0:20即可,否則無法實(shí)現(xiàn)。至于SQL SERVER為什么要這么蛋疼的設(shè)置,應(yīng)該是執(zhí)行間隔有一個(gè)參照時(shí)間點(diǎn)(第一次執(zhí)行的時(shí)間點(diǎn)),你設(shè)置開始開始時(shí)間為0:20,即表示這個(gè)時(shí)間點(diǎn)作為第一次執(zhí)行的參照點(diǎn)。
?
?
2:在計(jì)劃(Schedules)里面,如果執(zhí)行間隔為“小時(shí)”,那么取值必須為整數(shù)嗎? 可以為2.5個(gè)小時(shí)嗎?
關(guān)于問題2,答案是執(zhí)行間隔是不能設(shè)成小數(shù)的,只能為整數(shù),只能為1,2,3。。。。如果你將其值設(shè)置為一個(gè)小數(shù),則當(dāng)你點(diǎn)擊確定按鈕后,它會(huì)自動(dòng)四舍五入變成一個(gè)整數(shù),例如,你輸入1.3 ,你點(diǎn)擊確定后,再打開,你會(huì)發(fā)現(xiàn)其值變?yōu)?了,如果是1.6,則會(huì)變成2,不信的話,你可以試試。對于秒、分鐘都是如此。為什么如此呢,答案在于系統(tǒng)表msdb.dbo.sysschedules,不明白可以看文章最后。
?
3:在計(jì)劃(Schedules)里面,如果我要設(shè)置執(zhí)行間隔為90分鐘計(jì)劃,這樣能行嗎?
如果沒有實(shí)踐過的人,肯定會(huì)信誓旦旦的說,那肯定可以啊。答案是設(shè)置執(zhí)行間隔不能超過61,否則當(dāng)你點(diǎn)擊確認(rèn)的時(shí)候,系統(tǒng)自動(dòng)會(huì)將其設(shè)為60,至于原因,我暫時(shí)沒有想明白,微軟這個(gè)限定,感覺真蛋疼。如果真有需求需要90分鐘執(zhí)行一次,那怎么辦? 糾結(jié)了把。
方法1: 將作業(yè)J拆分成兩個(gè)一模一樣的作業(yè)J1 和J2,然后設(shè)置其Schedules為3小時(shí)執(zhí)行一次,兩個(gè)作業(yè)錯(cuò)開執(zhí)行,剛好能滿足業(yè)務(wù)需求。不過想想都覺得麻煩!
?
方法2: 作業(yè)Schedule執(zhí)行時(shí)間間隔90分鐘的實(shí)現(xiàn)方式是通過下面方式實(shí)現(xiàn)的:其實(shí)是將Schedule時(shí)間設(shè)為30分鐘執(zhí)行一次,然后再代碼里面按其規(guī)律,達(dá)到90分鐘才真正執(zhí)行業(yè)務(wù)邏輯SQL代碼。
2.1 從0:00(服務(wù)器時(shí)間)開始,作業(yè)Schedule的頻率為30分鐘一次,實(shí)際上只需要執(zhí)行下面時(shí)間點(diǎn)(實(shí)際執(zhí)行時(shí)間90分鐘),按規(guī)律可以分成兩種:
??????????? 整點(diǎn)執(zhí)行的(0:00, 1:00, 2:00, 3:00…..) 只有當(dāng)Hour %3 = 0 時(shí)才執(zhí)行存儲(chǔ)過程。
??????????? 非整點(diǎn)執(zhí)行的(0:30, 1:30, 2:30 ……......) 只有當(dāng)Hour % 3= 1時(shí)才執(zhí)行存儲(chǔ)過程。
2.2 從0:30(服務(wù)器時(shí)間)開始,作業(yè)Schedule的頻率為30分鐘一次,實(shí)際上只需要執(zhí)行下面時(shí)間點(diǎn),按規(guī)律也可以分成兩種。
??????????? 整點(diǎn)執(zhí)行的(0:00, 1:00, 2:00, 3:00…..) 只有當(dāng)Hour %3 = 2 時(shí)才執(zhí)行存儲(chǔ)過程。
??????????? 非整點(diǎn)執(zhí)行的(0:30, 1:30, 2:30 …….......) 只有當(dāng)Hour % 3= 0時(shí)才執(zhí)行存儲(chǔ)過程。
?
DECLARE @Hours INT;DECLARE @Minute INT;SELECT @Hours =CAST(SUBSTRING(CONVERT(VARCHAR(16), GETDATE(), 120),11,3) AS INT);SELECT @Minute=CAST(SUBSTRING(CONVERT(VARCHAR(16), GETDATE(), 120),15,2) AS INT);IF @Minute = 30 AND @Hours%3 = 0BEGIN INSERT INTO BI_JOB_LOG --暫時(shí)記錄執(zhí)行時(shí)間SELECT GETDATE();--執(zhí)行業(yè)務(wù)邏輯代碼 ...........................END;IF @Minute = 0 AND @Hours%3=2BEGININSERT INTO BI_JOB_LOGSELECT GETDATE();--執(zhí)行業(yè)務(wù)邏輯代碼 ...........................END;
?
?
4:如果我想在計(jì)劃(Schedules)外,多執(zhí)行一次作業(yè),如何執(zhí)行? 執(zhí)行了后,是否影響作業(yè)的計(jì)劃Schedules?
如下圖所示,我建立一個(gè)測試作業(yè)test,每隔13分鐘執(zhí)行一次,在21:57, 21:58我分別手動(dòng)執(zhí)行了該作業(yè)兩次,但是絲毫不影響該作業(yè)的調(diào)度計(jì)劃。在22:06分鐘還是準(zhǔn)時(shí)執(zhí)行了。
要查看作業(yè)下次執(zhí)行時(shí)間,可以通過SELECT * FROM msdb.dbo.sysjobschedules 來查看。
?
5: 修改系統(tǒng)時(shí)間,是否會(huì)影響作業(yè)的Schedule?
? 答案是會(huì)影響,一般要么重建該作業(yè)的調(diào)度計(jì)劃或禁用作業(yè)的調(diào)度,再啟用該調(diào)度來解決。有興趣的可以自己試驗(yàn)一下,這里不做過多介紹。
SQL SERVER數(shù)據(jù)庫作業(yè)的 Schedule 信息一般位于表 msdb.dbo.sysschedules,如下所示
包含有關(guān) SQL Server 代理作業(yè)計(jì)劃的信息。此表存儲(chǔ)在 msdb 數(shù)據(jù)庫中。其實(shí)看其參數(shù)的數(shù)據(jù)類型,你就知道第二個(gè)問題的答案了。呵呵
| 列名 | 數(shù)據(jù)類型 | 說明 | ||||||||||||||||
| schedule_id | int | SQL Server 代理作業(yè)計(jì)劃 ID。 | ||||||||||||||||
| schedule_uid | uniqueidentifier | 作業(yè)計(jì)劃的唯一標(biāo)識(shí)符。此值用于標(biāo)識(shí)分布式作業(yè)的計(jì)劃。 | ||||||||||||||||
| originating_server_id | int | 作為作業(yè)計(jì)劃來源的主服務(wù)器 ID。 | ||||||||||||||||
| name | sysname (nvarchar(128)) | 作業(yè)計(jì)劃的用戶定義名稱。該名稱在作業(yè)中必須唯一。 | ||||||||||||||||
| owner_sid | varbinary(85) | 擁有作業(yè)計(jì)劃的用戶或用戶組的 Microsoft Windows security_identifier。 | ||||||||||||||||
| enabled | int | 作業(yè)計(jì)劃的狀態(tài): 0 = 未啟用。 1 = 啟用。 如果未啟用計(jì)劃,則不會(huì)運(yùn)行該計(jì)劃中的任何作業(yè)。 | ||||||||||||||||
| freq_type | int | 此計(jì)劃中作業(yè)運(yùn)行的頻率。 1 = 只運(yùn)行一次 4 = 每天 8 = 每周 16 = 每月 32 = 每月,與 freq_interval 有關(guān) 64 = 在 SQL Server 代理服務(wù)啟動(dòng)時(shí)運(yùn)行 128 = 在計(jì)算機(jī)空閑時(shí)運(yùn)行 | ||||||||||||||||
| freq_interval | int | 執(zhí)行作業(yè)的間隔天數(shù)。該值取決于 freq_type 的值。默認(rèn)值為 0,表示不使用 freq_interval。
| ||||||||||||||||
| freq_subday_type | int | freq_subday_interval 的單位。可以是下列值之一:
| ||||||||||||||||
| freq_subday_interval | int | 在每次執(zhí)行作業(yè)之間發(fā)生的 freq_subday_type 的周期數(shù)。 | ||||||||||||||||
| freq_relative_interval | int | 如果 freq_interval 為 32(與“每月”選項(xiàng)相關(guān)),則為每月中 freq_interval 發(fā)生的時(shí)間。可以是下列值之一: 0 = 不使用 freq_relative_interval 1 = 第一次 2 = 第二次 4 = 第三次 8 = 第四次 16 = 最后一次 | ||||||||||||||||
| freq_recurrence_ factor | int | 已計(jì)劃執(zhí)行的作業(yè)之間的周數(shù)或月數(shù)。僅當(dāng) freq_type 為 8、16 或 32 時(shí),才使用 freq_recurrence_factor。如果此列包含 0,則不使用 freq_recurrence_factor。 | ||||||||||||||||
| active_start_date | int | 可以開始執(zhí)行作業(yè)的日期。日期格式為 YYYYMMDD。NULL 表示當(dāng)天的日期。 | ||||||||||||||||
| active_end_date | int | 可以停止執(zhí)行作業(yè)的日期。日期格式為 YYYYMMDD。 | ||||||||||||||||
| active_start_time | int | 在 active_start_date 和 active_end_date 之間的任意日期開始執(zhí)行作業(yè)的時(shí)間。時(shí)間格式為 HHMMSS,采用 24 小時(shí)制。 | ||||||||||||||||
| active_end_time | int | 在 active_start_date 和 active_end_date 之間的任意日期停止執(zhí)行作業(yè)的時(shí)間。時(shí)間格式為 HHMMSS,采用 24 小時(shí)制。 | ||||||||||||||||
| date_created | datetime | 創(chuàng)建計(jì)劃的日期和時(shí)間。 | ||||||||||||||||
| date_modified | datetime | 上次修改計(jì)劃的日期和時(shí)間。 | ||||||||||||||||
| version_number | int | 計(jì)劃的當(dāng)前版本號。例如,如果計(jì)劃已修改 10 次,則 version_number 為 10。 |
轉(zhuǎn)載于:https://www.cnblogs.com/kerrycode/p/3362415.html
總結(jié)
以上是生活随笔為你收集整理的SQL SERVER作业的Schedules浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多普勒多少钱啊?
- 下一篇: java连接oracle数据库 -- j