我公司有個 Azure SQL Elastic Pool 資料庫集區,我有 52 個資料庫,每個資料庫都蠻小的,最大的一個也才 5GB 左右,原本預設最大可用儲存空間為 50GB,但上周某一天開始就有個應用程式出現儲存空間使用量已滿等問題,讓我覺得十分詭異,查了一下資料庫用量也都還沒滿,還有許多剩餘空間才對,但就是有個資料庫要求更多空間,導致程式發生異常。今天我就來聊聊這個問題,以及我已經找到的解決方案!
問題描述
首先,我是先從以下錯誤訊息開始追查問題的:
System.Data.SqlClient.SqlException: The elastic pool has reached its storage limit. The storage usage for the elastic pool cannot exceed (51200) MBs.
從例外訊息來看,很明顯錯誤是從 Azure SQL Database 傳來的!
我到 Azure Portal 認真查了一下 SQL elastic pool 的儲存空間使用狀況,發現我實際使用的空間(Used space)只有 18.5 GB 而已 (如下圖示):
我有發現 Allocated space (已預先配置的空間) 已經高達 50GB 了,已經抵達 Maximum storage size (最大儲存空間上限),但我不是非常確定原因為何。
解決方案一:用新台幣解決
古人說:「用錢能解決的問題,都是小事」
沒錯,我直接將 Maximum storage size 調整為 100 GB,問題就解決了,這就是課金的魅力!😆
設定步驟請參考這裡。
解決方案二:自動將所有資料庫套用 AUTO_SHRINK 資料庫選項
但我心裡就想知道一件事:「Azure SQL Elastic Pool 的 Allocated space 有辦法降低嗎?」
由於 Azure SQL Elastic Pool 不是「一個資料庫」,而是提供「一堆資料庫」共用的 DTU 資源,讓所有資料庫共用一個儲存空間,所以 Allocated space 其實是所有資料庫 Allocated space 的加總,要調降的話,也要一個資料庫、一個資料庫來設定才行。
我最後找到一個完美的方法,就是在「每一個資料庫」個別執行以下 T-SQL 命令:
ALTER DATABASE CURRENT SET AUTO_SHRINK ON
這個命令會將 AUTO_SHRINK
(自動縮小磁碟用量) 資料庫選項開啟,他會不定時檢查是否有可以自動縮小的空間,有就會自動縮小 Allocated space!
但使用上有幾個前提:
-
非正式環境使用
因為我公司的 Azure SQL Elastic Pool 主要是給工程師開發測試之用,因此符合這個條件。
-
資料庫不能太大
由於 PaaS 服務讓我們無法掌管執行 DBCC SHRINKDATABASE 的時間點,如果資料庫太大,可能會導致資料庫存取效能降低,這點也要特別注意。
這個條件我也剛好符合,畢竟測試資料並不會太多。
在套用這個設定的幾天後,我重新看一次 Azure SQL Elastic Pool 的空間用量,發現 Allocated space 已經成功的自動降下來了!👍
相關連結