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

SQL Server 清理維護計劃與作業歷史日誌的標準腳本

     編輯:關於SqlServer

為何需要定期清理 msdb 系統表

msdb 資料庫儲存 SQL Server Agent 作業歷史、維護計劃執行記錄等資訊。長期累積會導致 msdb 膨脹,影響備份還原速度、擴大資料庫體積,甚至造成查詢效能下降。建議納入定期維護計劃自動清理。

三大核心系統表與清理腳本

1. sysjobhistory - 作業執行歷史

-- 查看最近 1000 筆記錄
SELECT TOP 1000 * FROM msdb.dbo.sysjobhistory;

-- 清除所有歷史 (生產環境建議保留最近 N 天)
DELETE FROM msdb.dbo.sysjobhistory;

2. sysmaintplan_log - 維護計劃執行摘要

SELECT TOP 1000 * FROM msdb.dbo.sysmaintplan_log;
DELETE FROM msdb.dbo.sysmaintplan_log;

3. sysmaintplan_logdetail - 維護計劃詳細訊息

SELECT TOP 1000 * FROM msdb.dbo.sysmaintplan_logdetail;
DELETE FROM msdb.dbo.sysmaintplan_logdetail;

最佳實務建議

  • 保留策略:生產環境不建議直接 TRUNCATE 或全刪,應改用 sp_purge_jobhistory 或 sp_maintplan_delete_log 系統存儲過程,指定保留天數。
  • 自動化:將清理腳本加入維護計劃或 Agent 作業,排程每週/每月執行。
  • 備份優先:清理前確保 msdb 已有完整備份,以防誤刪需還原。
  • 磁碟空間:大量刪除後考慮執行 DBCC SHRINKFILE 釋放空間,但頻率不宜過高以免產生碎片。

進階:保留最近 30 天記錄的範例

DECLARE @CutoffDate DATETIME = DATEADD(DAY, -30, GETDATE());

DELETE FROM msdb.dbo.sysjobhistory
WHERE run_date < CONVERT(INT, CONVERT(VARCHAR(8), @CutoffDate, 112));

DELETE FROM msdb.dbo.sysmaintplan_log
WHERE end_time < @CutoffDate;

DELETE FROM msdb.dbo.sysmaintplan_logdetail
WHERE end_time < @CutoffDate;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved