[廚餘回收] 在 SQL Server 中新增大量資料後又刪除的副作用

這天客戶跑來跟我說「資料庫壞了,無法新增資料!」,出現了下面這段錯誤訊息:

Could not allocate space for object 'dbo.XXX'.'PK_XXX' in database 'YYY' because the 'PRIMARY' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.

很明顯,這段訊息告訴我們是儲存空間已滿,可是我前幾天才維護過,按照資料增加的速度,不會那麼快才對,來問問看使用者做了什麼事?

原來前一天,客戶曾經將一批歷史的交易資料匯進資料庫,統計完畢跑出報表後,再將這些資料刪掉,今天工作到一半就跳出了這個訊息,由於 SQL Server 不會自動將已刪除資料的空間還給作業系統,所以經過使用者這一頓增刪操作之後,產生了大量的未使用空間,以致於擠壓到同一顆磁碟中其他資料庫的增長空間。

壓縮

首先要緊急處理的問題是讓使用者可以正常作業,所以先將資料庫的「檔案」進行「壓縮」的工作,將未使用的磁碟空間還給作業系統。

檔案大小上限

第二件事情是了解使用者的實際需求,這次造成磁碟空間已滿的統計報表,不一定得在尖峰時間計算,可以挪到離峰時間再處理,所以將歷史資料匯一份到統計報表專用的機器上,並且增加一個 Job 在離峰時間計算所需要的統計報表。

而這個資料庫原本就會定期維護,將歷史資料匯出進行備份,為了避免之後再發生一樣的問題,所幸將資料庫的檔案設定「檔案大小上限」,無知是沒藥醫的。

歷史不斷地在重演,過去工作經驗上所遇到的問題,一再地重覆出現,資源就有一部分被用在處理這類的問題上給浪費掉了。

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學