您可參考本文操作解決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版