原文地址:https://blog.dbi-services.com/sql-server-msdb-too-big-with-the-table-dbo-sysmaintplan_logdetail/
原文作者:Stéphane Haby
今天,在一個新客戶現場,我看到msdb數據文件超過4GB。有點太大了…
-
為了查看是哪張表占用這么大的空間,我們可以在SSMS中選擇msdb數據庫,右鍵點擊->報告(Reports)->標準報告(Standards Reports)->按"熱門表"劃分的磁盤使用情況(Disk usage by Top Tables)

-
如上圖可見,表dbo.sysmainplan_logdetail是大小為2.3GB且包含13205條記錄的大表。
此表是通過SSMS中管理菜單中的維護計劃向導生成的維護計劃的日志。更多信息請點擊這里:如何使用維護計劃向導。
在谷歌搜索如何清除此表之后,發現很多文章描述了對表進行的截斷操作的方法。
我不確定這是不是能解決此問題的好方法…
- 根據我的經驗,要清除msdb中的日志或歷史記錄,我們需要一個存儲過程,比如sp_delete_backuphistory或sp_purge_jobhistory。
- 在數據庫msdb中的所有存儲過程中搜索,最后找到“sp_maintplan_delete_log”。
- 我也在微軟文檔中搜索,在維護計劃向導找到的只有下圖中標注的這句話。

- 為了清理此表dbo.sysmainplan_logdetail,我在帶有時間戳的循環中使用此存儲過程,不填充T-log文件,只保留最后30天:
DECLARE @date datetime, @sql nvarchar(1000)
SET @date = CONVERT(nvarchar(10), getdate()-720 , 21)
WHILE @date <= CONVERT(nvarchar(10), getdate()-30 , 21)
BEGIN
SET @sql = N'EXEC [msdb].[dbo].[sp_maintplan_delete_log] @oldest_time = {ts''' + CONVERT(nvarchar(23), @date , 21) + N'''}'
EXEC(@sql)
SET @date = @date +30
PRINT @sql
END

4. 上圖中可以看到,在2020年1月之前有5709個記錄…??
清理后,表dbo.sysmainplan_logdetail的記錄數從13205減少到152,且文件大小從2.3GB減小到35MB,如下圖:

為了完整起見,最好的做法是執行與Microsoft文檔中相同的操作,即使用存儲過程sp_purge_jobhistory,sp_delete_backuphistory。
我還建議創建一個日常任務來清理維護計劃中所有的歷史記錄。??
最后修改時間:2022-05-09 10:36:29
「喜歡這篇文章,您的關注和贊賞是給作者最好的鼓勵」
關注作者
【版權聲明】本文為墨天輪用戶原創內容,轉載時必須標注文章的來源(墨天輪),文章鏈接,文章作者等基本信息,否則作者和墨天輪有權追究責任。如果您發現墨天輪中有涉嫌抄襲或者侵權的內容,歡迎發送郵件至:contact@modb.pro進行舉報,并提供相關證據,一經查實,墨天輪將立刻刪除相關內容。




