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

SQL Server Agent 作業排程實戰:建立、監控、歷史記錄管理與故障排除

     編輯:關於SqlServer

SQL Server Agent 是自動化維護、ETL、報表生成的核心引擎。本文詳細說明作業建立步驟、排程類型、通知機制、歷史記錄保留策略、常見錯誤(如 14274)排解,並提供最佳實務範本。

建立作業完整流程

  1. 一般頁籤: 命名、啟用、分類(建議自訂分類如「維護」、「ETL」、「報表」)、擁有者(建議用專用服務帳號)、描述。
  2. 步驟頁籤: 新增步驟 → 類型選 Transact-SQL 指令碼 (TSQL) → 目標資料庫 → 命令區輸入 T-SQL 或 EXEC dbo.usp_Proc @Param=1。多步驟可設定「成功/失敗時轉往步驟 N」,實現流程控制。
  3. 排程頁籤: 新增排程 → 類型:週期性(每日/週/月)、啟動 SQL Server Agent 時、CPU 閒置時、單次。進階可設定「重複間隔」(如每 15 分鐘執行一次,持續 24 小時)。
  4. 通知頁籤: 完成/失敗/成功時 → 寫入應用程式事件日誌、傳送電子郵件(需設定 Database Mail)、呼叫寻呼機(已淘汰)。
  5. 目標頁籤: 多伺服器管理 (MSX/TSX) 環境下指定執行目標伺服器。

關鍵先決條件

  • SQL Server Agent 服務必須啟動,且啟動帳號與 SQL Server 引擎服務帳號一致(或具備同等網路權限)。
  • 作業擁有者需具備目標資料庫的執行權限。
  • 若步驟呼叫連結伺服器/SSIS 套件,Agent 帳號需有網路存取權限。

歷史記錄保留策略:避免 msdb 膨脹

路徑:Agent 右鍵 → 屬性 → 歷程記錄

計算範例: 作業每天跑 2 次,需保留 30 天 → 至少 60 筆/作業。若有 50 個作業,總筆數約 3,000,設總上限 10,000、單作業 500 即安全。

常見錯誤與排解

錯誤 14274:無法新增/更新/刪除來自 MSX 伺服器的作業

原因: 伺服器重命名後,msdb.dbo.sysjobs.originating_server 仍存舊名稱。

解法(不重啟服務):


USE msdb;
GO
DECLARE @OldName SYSNAME = 'OLD_SERVER_NAME';
DECLARE @NewName SYSNAME = @@SERVERNAME;  -- 目前正確名稱

UPDATE sysjobs SET originating_server = @NewName WHERE originating_server = @OldName;
UPDATE sysjobservers SET server_id = (SELECT server_id FROM sysservers WHERE srvname = @NewName) 
    WHERE server_id = (SELECT server_id FROM sysservers WHERE srvname = @OldName);
-- 同步 sysjobschedules, sysjobsteps 等相關表(視版本而定)

執行後重新整理 Agent,作業即可正常編輯。

作業卡住、不執行

  • 檢查 Agent 服務是否運行
  • 檢查作業是否啟用、排程是否啟用、開始日期是否已過
  • 查看 msdb.dbo.sysjobactivity 確認下次執行時間
  • 檢查步驟命令語法、權限、連結伺服器可達性

監控與除錯查詢


-- 最近 24 小時作業執行狀態
SELECT 
    j.name AS JobName,
    h.run_date, h.run_time,
    h.run_duration,
    CASE h.run_status WHEN 0 THEN 'Failed' WHEN 1 THEN 'Succeeded' WHEN 2 THEN 'Retry' WHEN 3 THEN 'Canceled' END AS Status,
    h.message
FROM msdb.dbo.sysjobhistory h
JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
WHERE h.step_id = 0  -- 0 = 作業總結步驟
  AND h.run_date >= CONVERT(INT, CONVERT(CHAR(8), DATEADD(DAY, -1, GETDATE()), 112))
ORDER BY h.run_date DESC, h.run_time DESC;

-- 正在執行的作業
SELECT 
    j.name, ja.start_execution_date, 
    DATEDIFF(SECOND, ja.start_execution_date, GETDATE()) AS RunningSeconds
FROM msdb.dbo.sysjobactivity ja
JOIN msdb.dbo.sysjobs j ON ja.job_id = j.job_id
WHERE ja.stop_execution_date IS NULL 
  AND ja.start_execution_date IS NOT NULL;

最佳實務清單

  • 所有生產作業必須有失敗通知(Email + 事件日誌)。
  • 長時間作業拆分為多步驟,並設定步驟級重試(重試間隔 5 分鐘、重試 3 次)。
  • 維護類作業(備份、索引重建、統計更新)統一歸類,便於統一管理排程窗口。
  • 定期匯出作業定義(sp_help_job、sp_script_job)納入版控,支援災難恢復快速重建。
  • 避免在作業步驟中直接寫入大量商業邏輯,改呼叫預存程序,利於測試與版本管理。

善用 Agent 作業,能將 DBA 從重複性操作中解放,實現真正的自動化營運。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
設定預設建議值(高頻作業)說明
作業歷程記錄最大筆數1,00010,000 ~ 100,000總上限,超過則截斷最舊
每個作業最大歷程筆數1001,000 ~ 5,000單一作業上限,防止單一高頻作業佔滿
保留天數無限制30 ~ 90 天配合維護計畫清除舊記錄