[SQL][問題處理]msdb 居然變成最大的資料庫了 ?

很多時候使用 SQL Server 的維護計畫是很方便,但如果沒有管理的話,很可能讓您的磁碟空間就默默的被吃光了。

今天收到一個同事的詢問「為什麼 msdb 會長得那麼大 ?」,「可以限制 msdb 不要長大嗎 ?」一收到這個問題的時候,實在有點錯愕。因為 msdb 主要是讓 SQL Agent 來存放相關資訊的資料表,如果 SQL Agent 都沒有 Job 或者是一些維護工作在進行的話,正常來說 msdb 應該資料也都不多。但如果限制 msdb 的使用,那勢必會影響到 SQL Agent 的運作,因此當下決定連線幫同事看一下,到底問題是出在哪裡。

當開啟同事的 msdb 資料庫的時候,實在讓我嚇了一跳,看起來應該是存了不少資料,所以讓 mdf 的檔案可以長到 27GB

為了要能知道到底被那些資料給佔據到那麼大的空間,所以我們直接利用 SSMS 上面的管理報表,在 msdb 資料庫上面,按下滑鼠右鍵選擇「報表」→「標準報表」→「依資料表的磁碟使用量」

就可以透過報表和排序的功能,找出佔據資料表空間的兇手。而從下圖中可以看出來,大部分的資料其實都是被維護計畫的資料表給佔據了,雖然資料筆數並不多,但佔用空間卻是非常的大。

但這也讓我有點好奇,為什麼維護計畫會占用那麼多空間,因此我們看一下維護計畫的 Log,會發現無法呈現資訊,因此發生超出記憶體的異常了。


查看問題會比較花時間,但既然知道問題發生原因,那麼我們就可以先利用 TRUNCATE TABLE 的指令,直接將維護計畫的相關 Log 給直接清除

接下來再透過 sp_delete_backuphistory 的預存程序,指定一個日期,他就會將這個之前的相關備份紀錄給清除了

清除完之後,就可以利用壓縮資料庫的方式,將空出來的空間給釋放掉,這樣資料庫就可以縮減到 130MB ,以原來 27GB 有非常顯著的差異。

後續也協助朋友,在 SQL Agent 的設定內,只保留最近四週的 Log,這樣後續應該就不會再發生 msdb 吃掉硬碟空間的狀況了。