全部產品
Search
文件中心

ApsaraDB RDS:RDS SQL Server雲資料庫的磁碟空間被佔滿

更新時間:Jun 19, 2024

您可參考本文操作解決RDS SQL Server資料庫的磁碟空間被佔滿的情況。

說明

阿里雲提醒您:

  • 如果您對執行個體或資料有修改、變更等風險操作,務必注意執行個體的容災、容錯能力,確保資料安全。

  • 如果您對執行個體(包括但不限於ECS、RDS)等進行配置與資料修改,建議提前建立快照或開啟RDS記錄備份等功能。

  • 如果您在阿里雲平台授權或者提交過登入帳號、密碼等安全資訊,建議您及時修改。

問題描述

使用雲資料庫RDS SQL Server時,資料庫的磁碟空間被佔滿。

問題原因

由於業務需要過高,導致雲資料庫RDS SQL Server的磁碟空間被佔滿。

解決方案

在雲資料庫RDS SQL Server版中,刪除資料後的空間會被重新使用,因此如果磁碟空間使用率不高時,可以選擇不回收檔案。但當磁碟空間被佔滿,影響業務正常運行,則需要回收檔案,一般先選擇回收記錄檔,因為回收記錄檔的速度快,在短時間內可清理出足夠的可用空間。以下是關於回收記錄檔的操作步驟:

  1. 查看待回收記錄檔的大小,具體步驟請參考以下內容:

    • 如果您使用的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]為邏輯檔案名稱。

  2. 執行以下SQL語句,查看記錄檔空間是否可回收。

    SELECT [name],
           [log_reuse_wait_desc]
    FROM master.sys.databases
    WHERE [name]='[$Database_Name]'
  3. 執行以下SQL語句,回收記錄檔空間。

    DBCC SHRINKFILE([$Logic_Name])
    說明
    • 建議您在資料庫低峰期執行該命令,以避免對業務造成影響。

    • 常見的日誌等待類型和解決方案請參見更多資訊

  4. 執行以下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
  5. 執行以下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
    說明

    已用空間和空間大小通過上一步擷取。

  6. 執行以下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

更多資訊

常見的日誌等待類型和解決方案如下所示:

  1. LOG_BACKUP

    該情況表示日誌未備份,因此不能回收。

    登入RDS控制台,進入目標執行個體資訊頁面,單擊左側導覽列備份恢複,然後單擊備份設定,編輯好備份恢複各參數後,單擊頁面右上方的備份並收縮交易記錄。備份設定個參數詳情,請參見備份SQL Server資料

  2. ACTIVE_TRANSACTION

    該情況屬於有活躍事務阻塞了日誌回收。請參考以下操作步驟:

    1. 執行以下SQL語句,擷取長時間的活躍事務SPID。

      DBCC OPENTRAN
    2. 執行以下SQL語句,其中[$SPID]為上一步擷取的活躍事務SPID,查看請求SQL語句,考慮是否可以使用kill命令終止阻塞源。待終止後,查看log_reuse_wait,進行收縮操作。

      DBCC INPUTBUFFER([$SPID])

相關文檔

RDS SQL Server如何收縮交易記錄

適用於

雲資料庫RDS SQL Server版