全部產品
Search
文件中心

ApsaraDB RDS:解決SQL Server執行個體空間滿自動鎖的問題

更新時間:Jun 19, 2024

問題描述

SQL Server執行個體可能會由於SQL語句、外部攻擊等原因導致執行個體空間滿,為避免資料丟失,RDS會對執行個體進行自動鎖定,磁碟鎖定之後,將無法進行寫入操作。當執行個體由於執行個體空間滿自動鎖定時,可在控制台查看的運行狀態。

問題原因

造成SQL Server執行個體空間滿的主要有以下三種原因:

  • 記錄檔佔用量高。

  • 資料檔案佔用量高。

  • 臨時檔案佔用量高。

解決辦法

查看空間使用狀況

  • 方法一:

通過RDS管理主控台的監控頁面查看空間使用方式,詳情請參見查看資源和引擎監控查看空間狀況

參數說明如下。

參數

說明

磁碟空間總體使用量

所有使用者資料庫的資料檔案和記錄檔的大小。

資料空間使用量

所有使用者資料庫的資料檔案(mdf和ndf檔案)的大小。

日誌空間使用量

所有使用者資料庫的記錄檔(ldf檔案)。

臨時檔案空間使用量

tempdb的所有mdf、ndf和ldf檔案的大小。

系統檔案空間使用量

master、msdb和model資料庫的資料檔案和記錄檔,以及SQL Server執行個體目錄下面的一些系統檔案(錯誤記錄檔和dll檔案等)的大小。

  • 方法二:

通過SQL語句查看所有資料庫的資料檔案(mdf和ndf檔案)和記錄檔(ldf檔案)的大小,詳情請參見RDS for SQL Server如何查看執行個體、資料庫及表佔用的空間大小

解決空間滿自動鎖問題

升級執行個體的儲存空間

升級執行個體儲存空間後即可解鎖執行個體,關於如何升級執行個體儲存空間,請參見變更配置

記錄檔佔用量高的解決方案

說明

如果應用程式中有大量的大事務操作,就會導致交易記錄持續增長,並且有可能會導致超過執行個體磁碟空間上限而使執行個體被鎖定。

  • 方法一:

  1. 用戶端串連執行個體後執行以下語句。

    select name,log_reuse_wait,log_reuse_wait_desc from sys.databases;
  2. 若log_reuse_wait_desc的值是LOG_BACKUP,請收縮交易記錄

    說明

    若記錄檔非常大,記錄備份的時間會比較長,並且在收縮記錄檔時,如果遇到未提交的事務,會導致單次收縮效果不明顯。在單次收縮效果不明顯的情況下,建議您再次收縮交易記錄。

  • 方法二:

    • 交易記錄增長過快的根本原因是事務較多或者有大事務。例如,一個事務中操作了500萬行資料,在有這種大事務的情況下,建議您將事務拆分,每個事務操作10萬行資料,分50次執行。

    1. 依次執行以下SQL語句,查看資料庫的空閑空間。

      USE [$DB_Name];
      SELECT SUM(unallocated_extent_page_count) AS [free pages],
             (SUM(unallocated_extent_page_count)*1.0/128) AS [free space in MB]
      FROM sys.dm_db_file_space_usage;
      說明

      [$DB_Name]指資料庫名。

    2. 找到空間使用率較高的資料庫,然後執行以下語句,收縮該資料庫。

      DBCC SHRINKDATABASE([$DB_Name]);

      也可以執行以下命令來收縮單個檔案。

      DBCC SHRINKFILE(file_id,[$Size]);
      說明

      [$Size]指收縮以後的大小,而不是要收縮多少,單位MB。

    • 臨時檔案用量高的解決方案。您可以從執行個體監控中初步判定臨時檔案是否佔用太多空間。如果臨時檔案的空間不夠,Error Log中也會有相應的記錄。關於如何排查臨時檔案空間不足的情況,請參見Troubleshooting Insufficient Disk Space in tempdb,建議您執行以下操作:

    • 重啟執行個體來快速釋放臨時檔案的空間。

      及時釋放暫存資料表、行版本、表變數等。

適用於

  • 雲資料庫RDS SQL Server版