﻿# 如何解決 Azure SQL Elastic Pool 資料庫集區 Allocated space 已滿的問題

我公司有個 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 而已 (如下圖示)：

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3675467838e0bdd43a48-40375cc4-9149-45a6-afaf-a5913391a266.webp)

我有發現 Allocated space (已預先配置的空間) 已經高達 50GB 了，已經抵達 Maximum storage size (最大儲存空間上限)，但我不是非常確定原因為何。

### 解決方案一：用新台幣解決

古人說：「用錢能解決的問題，都是小事」

沒錯，我直接將 Maximum storage size 調整為 100 GB，問題就解決了，這就是課金的魅力！😆

> 設定步驟請參考[這裡](https://stackoverflow.com/a/73909351/910074)。

### 解決方案二：自動將所有資料庫套用 AUTO\_SHRINK 資料庫選項

但我心裡就想知道一件事：「Azure SQL Elastic Pool 的 Allocated space 有辦法降低嗎？」

由於 Azure SQL Elastic Pool 不是「一個資料庫」，而是提供「一堆資料庫」共用的 DTU 資源，讓所有資料庫共用一個儲存空間，所以 Allocated space 其實是所有資料庫 Allocated space 的加總，要調降的話，也要一個資料庫、一個資料庫來設定才行。

我最後找到一個完美的方法，就是在「每一個資料庫」個別執行以下 T-SQL 命令：

```sql
ALTER DATABASE CURRENT SET AUTO_SHRINK ON
```

這個命令會將 `AUTO_SHRINK` (自動縮小磁碟用量) 資料庫選項開啟，他會不定時檢查是否有可以自動縮小的空間，有就會自動縮小 Allocated space！

但使用上有幾個前提：

1.  非正式環境使用
    
    因為我公司的 Azure SQL Elastic Pool 主要是給工程師開發測試之用，因此符合這個條件。
    
2.  資料庫不能太大
    
    由於 PaaS 服務讓我們無法掌管執行 [DBCC SHRINKDATABASE](https://learn.microsoft.com/zh-tw/sql/t-sql/database-console-commands/dbcc-shrinkdatabase-transact-sql?view=sql-server-ver16&WT.mc_id=DT-MVP-4015686) 的時間點，如果資料庫太大，可能會導致資料庫存取效能降低，這點也要特別注意。
    
    這個條件我也剛好符合，畢竟測試資料並不會太多。
    

在套用這個設定的幾天後，我重新看一次 Azure SQL Elastic Pool 的空間用量，發現 Allocated space 已經成功的自動降下來了！👍

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/9fdccdac062591ed2f6f-614bfcd6-45b0-435e-a52e-24cd99dac38d.webp)

### 相關連結

-   [Azure SQL Server Error : The elastic pool has reached its storage limit. The storage usage for the elastic pool cannot exceed (204800) - Stack Overflow](https://stackoverflow.com/a/73909351/910074)
-   [DTU resource limits elastic pools - Azure SQL Database | Microsoft Learn](https://learn.microsoft.com/en-us/azure/azure-sql/database/resource-limits-dtu-elastic-pools?view=azuresql&WT.mc_id=DT-MVP-4015686)
