首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 彈性排程備份:從每日固定時間到秒級精準觸發的多種實作

     編輯:關於SqlServer

需求場景

使用者在前台輸入指定時間 (精確到秒),資料庫自動於該時間啟動備份。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 Service / 排程工作 (正解)

寫一個 Windows 服務或排程工作 (Task Scheduler),時間一到直接執行 BACKUP DATABASE 指令碼。完全脫離 SQL Agent,精準、輕量、可控。

方案四:折衷方案 - 10/30 分鐘輪詢區間

-- 作業排程: 每 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 系列)

實務建議總結

  1. 業務上極少需要「精確到秒」觸發備份,備份本身耗時較長,分鐘級已足夠
  2. 若真有秒級需求 (如資料同步) → 寫 Windows Service
  3. 一般備份 → 方案一 (天級) 或方案四 (區間輪詢) 最划算
  4. 維護計劃精靈建立的作業可直接修改步驟指令碼植入判斷邏輯
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved