您可參考本文操作解決RDS SQL Server資料庫的磁碟空間被佔滿的情況。
阿里雲提醒您:
如果您對執行個體或資料有修改、變更等風險操作,務必注意執行個體的容災、容錯能力,確保資料安全。
如果您對執行個體(包括但不限於ECS、RDS)等進行配置與資料修改,建議提前建立快照或開啟RDS記錄備份等功能。
如果您在阿里雲平台授權或者提交過登入帳號、密碼等安全資訊,建議您及時修改。
問題描述
使用雲資料庫RDS SQL Server時,資料庫的磁碟空間被佔滿。
問題原因
由於業務需要過高,導致雲資料庫RDS SQL Server的磁碟空間被佔滿。
解決方案
在雲資料庫RDS SQL Server版中,刪除資料後的空間會被重新使用,因此如果磁碟空間使用率不高時,可以選擇不回收檔案。但當磁碟空間被佔滿,影響業務正常運行,則需要回收檔案,一般先選擇回收記錄檔,因為回收記錄檔的速度快,在短時間內可清理出足夠的可用空間。以下是關於回收記錄檔的操作步驟:
查看待回收記錄檔的大小,具體步驟請參考以下內容:
如果您使用的RDS SQL Server執行個體版本為2012或2016,則執行以下SQL語句,查看待回收記錄檔的大小:
SELECT DB_NAME(database_id) AS [Database Name], [Name] AS [Logical Name], [Physical_Name] AS [Physical Name], ((size * 8) / 1024) AS [Size(MB)] FROM sys.master_files ORDER BY [Size(MB)] DESC
如果您使用的RDS SQL Server執行個體版本為2008 R2,則執行以下SQL語句,查看待回收記錄檔的大小:
說明需要對各個資料庫逐個執行。
USE [$Database_Name] GO SELECT a.name AS [$Logic_Name], size/128, FILEPROPERTY(a.name, 'SpaceUsed')/128, size/128 - FILEPROPERTY(a.name, 'SpaceUsed')/128, FILEPROPERTY(a.name, 'SpaceUsed')*100.0/size FROM sys.database_files a cross join (select recovery_model_desc, log_reuse_wait, log_reuse_wait_desc, is_auto_shrink_on from sys.databases where name=DB_NAME())b WHERE type=1
說明[$Database_Name]為資料庫名。
[$Logic_Name]為邏輯檔案名稱。
執行以下SQL語句,查看記錄檔空間是否可回收。
SELECT [name], [log_reuse_wait_desc] FROM master.sys.databases WHERE [name]='[$Database_Name]'
執行以下SQL語句,回收記錄檔空間。
DBCC SHRINKFILE([$Logic_Name])
說明建議您在資料庫低峰期執行該命令,以避免對業務造成影響。
常見的日誌等待類型和解決方案請參見更多資訊。
執行以下SQL語句,查看資料檔案大小。
USE [$Database_Name] GO SELECT a.name AS [$Logic_Name], size/128, FILEPROPERTY(a.name, 'SpaceUsed')/128, size/128 - FILEPROPERTY(a.name, 'SpaceUsed')/128, FILEPROPERTY(a.name, 'SpaceUsed')*100.0/size FROM sys.database_files a cross join (select recovery_model_desc, log_reuse_wait, log_reuse_wait_desc, is_auto_shrink_on from sys.databases where name=DB_NAME())b WHERE type=0
執行以下SQL語句,收縮資料檔案。
說明一般情況下,通常每5 GB進行迴圈收縮,如果影響業務,則中斷操作,不會進行復原。
DECLARE @usedspace INT, @totalspace INT SELECT @usedspace = xxx, @totalspace = yyy WHILE @totalspace > @usedspace BEGIN SET @totalspace = @totalspace - 5 * 1024 DBCC SHRINKFILE([$Logic_Name], @totalspace) END
說明已用空間和空間大小通過上一步擷取。
執行以下SQL語句,查看收縮排度。
說明該收縮排度為預估值。
SELECT DB_NAME(database_id) AS dbname, session_id, request_id, start_time, percent_complete, dateadd(mi, estimated_completion_time/60000, getdate()) AS ETC FROM sys.dm_exec_requests WHERE percent_complete <> 0
更多資訊
常見的日誌等待類型和解決方案如下所示:
LOG_BACKUP
該情況表示日誌未備份,因此不能回收。
登入RDS控制台,進入目標執行個體資訊頁面,單擊左側導覽列備份恢複,然後單擊備份設定,編輯好備份恢複各參數後,單擊頁面右上方的備份並收縮交易記錄。備份設定個參數詳情,請參見備份SQL Server資料。
ACTIVE_TRANSACTION
該情況屬於有活躍事務阻塞了日誌回收。請參考以下操作步驟:
執行以下SQL語句,擷取長時間的活躍事務SPID。
DBCC OPENTRAN
執行以下SQL語句,其中[$SPID]為上一步擷取的活躍事務SPID,查看請求SQL語句,考慮是否可以使用
kill
命令終止阻塞源。待終止後,查看log_reuse_wait,進行收縮操作。DBCC INPUTBUFFER([$SPID])
相關文檔
適用於
雲資料庫RDS SQL Server版