SQL Server 2016 磁碟空間不足
我正在執行 SQL Server 2016。我有一個執行的數據庫,顯然 D: 驅動器上的空間不足。每日索引重建開始產生如下所示的錯誤。
消息 1101,級別 17,狀態 12,第 3 行
由於文件組“PRIMARY”中的磁碟空間不足,無法為數據庫“MarketDataAnalysisDB”分配新頁面。通過刪除文件組中的對象、向文件組中添加其他文件或為文件組中的現有文件設置自動增長來創建必要的空間。
我做的第一件事是將 D: 驅動器中的日誌刪除到 C: 驅動器上,以便我可以(希望)刪除一些較舊的歷史數據並釋放空間。我能夠移動日誌文件,但索引仍然沒有執行(與上述相同的錯誤)。
因此,我開始刪除數據行,以釋放空間,以便將來的行可以重新增長到數據庫中。在刪除語句之後,4 1/2 小時後,我收到了類似的錯誤
消息 1105,級別 17,狀態 2,行 2
無法為數據庫 ’tempdb’ 中的對象 ’’ 分配空間,因為 ‘PRIMARY’ 文件組已滿。通過刪除不需要的文件、刪除文件組中的對象、向文件組添加其他文件或為文件組中的現有文件設置自動增長來創建磁碟空間。
雖然錯誤資訊非常有用,但我無法執行任何建議的項目。驅動器上除了數據庫文件之外什麼都沒有。當我開始閱讀有關縮小數據庫的內容時,我意識到我真的不明白為什麼會出現此錯誤。我附上了一張已用空間資訊的圖像,希望比我更了解這一點的人可以提供一種安全的方法來減少數據庫大小。目標是允許新記錄進入,同時我想出一個滾動分區實現,這目前超出了我的 SQL 技能,無法自行實現。
我可能考慮的另一個選擇是為數據購買更大的硬碟驅動器。但是,據我所見,似乎有空間,同時 SQL Server 認為我空間不足。
減小數據庫大小的最佳方法是什麼?
$$ EDIT $$:我沒有馬上意識到這一點,但是,我嘗試刪除花了 4 個小時的行,並且位於 c: 驅動器上的日誌文件有近 200GB 可用空間填滿了日誌文件,所以現在 c: 驅動器已用完磁碟空間!該怎麼辦?
在 SSMS 中檢查的內容:
右鍵點擊有問題的數據庫,點擊“屬性”,然後選擇“文件”選項卡。
- 記下數據庫的所有文件,以及它們所在的驅動器。請注意哪些文件啟用了自動增長,以及(其中)哪些文件具有最大文件大小。
切換到“選項”選項卡。
- 檢查恢復模型(右上角)。是“完整”、“簡單”還是“批量記錄”?
對系統數據庫重複第一步
tempdb
。使用 Windows/文件資源管理器,檢查上面提到的每個驅動器上有多少可用空間。
為什麼你有問題:
索引重建過程會佔用數據庫本身或數據庫中的額外空間
tempdb
(取決於創建索引時的設置)。在您的情況下,說重建使用您的數據庫而不是tempdb
. 完全重建索引後,此空間將再次釋放為可用空間;這就是為什麼看起來你的數據文件中有可用空間,但在重建過程中你用完了。請注意,數據庫重建會將數據寫入事務日誌,跟踪所做的更改,以防它們必須回滾。事務日誌的精確行為取決於數據庫的恢復模式。
使用“簡單”恢復模型的數據庫需要保留每個事務的詳細資訊,直到事務完成。一旦事務完成,就可以釋放日誌空間以供重用。因此,您可以在事務期間用完事務日誌中的空間,但十分鐘後查看日誌時幾乎沒有可用空間。
使用“完整”恢復模型(或“批量記錄”)的數據庫保留事務資訊,直到備份事務日誌。這意味著“完整”中的數據庫,即使有定期的完整數據庫備份,但沒有安排事務日誌備份,最終將填滿,因為必須將幾個月甚至幾年前完成的事務保存在日誌中。
使用“完全”恢復模型的主要原因是允許“時間點”恢復。您可以將完整備份與事務日誌備份字元串結合起來,將數據庫恢復到從進行完整備份到進行最近的事務日誌備份的任何時間點。
如果您希望選擇還原到比上次完整備份更新的點,請使用“完整”恢復模式,並安排事務日誌備份的發生頻率足夠高,這樣您就不會介意失去未備份的數據向上。如果您不需要事務日誌備份(並且您確定),那麼將您的數據庫放入“簡單”模型。
一點建議:如果您使用“完整”但沒有備份您的事務日誌,如果您有足夠的空間來保存它,您可以選擇進行第一個事務日誌備份。如果你不這樣做,你基本上可以通過以下方式“重新開始”:
- 將恢復模式轉變為“簡單”。這會將所有已完成的事務標記為可以發布。您可以使用 T-SQL
CHECKPOINT
命令來確保立即釋放空間。- 切換回“完整”
- 立即對數據庫進行完整備份
- 緊接著,確保設置了正常事務日誌備份。
這是縮減事務日誌真正有意義的少數場景之一。如果它很大,試著把它切成兩半。理想情況下,您不希望將文件縮小到必須為正常操作而增長的程度。如果您正在尋找一個好的目標大小,我聽說過將事務日誌的大小設置為最大索引大小的兩倍的建議。
如前所述,索引重建確實將數據寫入事務日誌。因此,如果您使用的是“完整”模型,並且確實執行了事務日誌備份,那麼您可能希望在重建發生時*更頻繁地執行它們。*幾年前我在我的一個數據庫上執行了此操作 - 我通常的事務日誌備份計劃是每 15 分鐘一次,但在重建過程中我將其提高到每 5 分鐘一次。
因此,如果所有這些設置都很好,請檢查您的驅動器是否實際已滿,或者您的文件是否有增長上限(或不增長)。如果您仍有驅動器空間,那麼您可以:
- 手動增加文件的大小(在上述“文件”選項卡上);
- 如果不允許自動增長,則允許(您可以根據需要設置最大值);要麼
- 如果允許自動增長,但設置了最大值,則增加最大值(或刪除它)。
如果您沒有任何可用磁碟空間,並且您的事務日誌大小合適 - 那麼您需要更多磁碟空間。
有一種方法可以為 SQL Server 中的文件設置最大大小。你應該檢查它們,看看它們是否人為地限制了增長。
你還需要去你的網路管理員那裡很好地詢問網路驅動器。您可能需要切換 SQL 服務以使用活動目錄帳戶,然後授予他們訪問網路驅動器的權限並將您的數據移動到那裡。
如果您有多個文件組(例如,每個 CPU 核心 1 個),您可以一次移動一個。