使用者在前台輸入指定時間 (精確到秒),資料庫自動於該時間啟動備份。Agent 作業最小排程粒度為分鐘,若每秒輪詢極其浪費資源。
-- 1. 建立控制表 (單列單行)
CREATE TABLE jobTime (d DATETIME)
INSERT jobTime VALUES (GETDATE())
-- 2. 使用者輸入時只 UPDATE
UPDATE jobTime SET d = '2007-12-01 10:08:57'
-- 3. 作業步驟邏輯 (排程: 每天凌晨 2 點)
IF EXISTS (SELECT 1 FROM jobTime WHERE DATEDIFF(dd, GETDATE(), d) = 0)
BEGIN
-- 執行備份邏輯 (如 xp_sqlmaint 或 BACKUP DATABASE)
END
原理:Windows 服務充當定時器,到點觸發作業,作業內判斷「今天是否為指定日期」,符合則備份。資源消耗極低。
若作業排程設為每秒執行,Agent 每秒喚醒、判斷 IF 不符合、結束,下一秒重複。極大浪費 CPU/記憶體,且備份本身耗時可能超過 1 秒,導致重疊衝突。
寫一個 Windows 服務或排程工作 (Task Scheduler),時間一到直接執行 BACKUP DATABASE 指令碼。完全脫離 SQL Agent,精準、輕量、可控。
-- 作業排程: 每 10 分鐘執行一次
IF EXISTS (
SELECT 1 FROM jobTime
WHERE DATEDIFF(mi, d, GETDATE()) BETWEEN 0 AND 10
)
BEGIN
-- 執行備份
END
指定時間後 10 分鐘內必會觸發一次,精度在 ±10 分鐘,資源消耗可接受。
將備份邏輯封裝為預存程序 sp_BackUp,前台修改時間時動態更新作業步驟的 T-SQL 指令碼:
-- 透過 sp_update_jobstep 更新 @command 參數
-- 或重建整個作業 (msdb.dbo.sp_add_job 系列)