問題描述
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如何查看執行個體、資料庫及表佔用的空間大小。
解決空間滿自動鎖問題
升級執行個體的儲存空間
升級執行個體儲存空間後即可解鎖執行個體,關於如何升級執行個體儲存空間,請參見變更配置。
記錄檔佔用量高的解決方案
如果應用程式中有大量的大事務操作,就會導致交易記錄持續增長,並且有可能會導致超過執行個體磁碟空間上限而使執行個體被鎖定。
方法一:
用戶端串連執行個體後執行以下語句。
select name,log_reuse_wait,log_reuse_wait_desc from sys.databases;
若log_reuse_wait_desc的值是LOG_BACKUP,請收縮交易記錄。
說明若記錄檔非常大,記錄備份的時間會比較長,並且在收縮記錄檔時,如果遇到未提交的事務,會導致單次收縮效果不明顯。在單次收縮效果不明顯的情況下,建議您再次收縮交易記錄。
方法二:
交易記錄增長過快的根本原因是事務較多或者有大事務。例如,一個事務中操作了500萬行資料,在有這種大事務的情況下,建議您將事務拆分,每個事務操作10萬行資料,分50次執行。
依次執行以下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]指資料庫名。
找到空間使用率較高的資料庫,然後執行以下語句,收縮該資料庫。
DBCC SHRINKDATABASE([$DB_Name]);
也可以執行以下命令來收縮單個檔案。
DBCC SHRINKFILE(file_id,[$Size]);
說明[$Size]指收縮以後的大小,而不是要收縮多少,單位MB。
臨時檔案用量高的解決方案。您可以從執行個體監控中初步判定臨時檔案是否佔用太多空間。如果臨時檔案的空間不夠,Error Log中也會有相應的記錄。關於如何排查臨時檔案空間不足的情況,請參見Troubleshooting Insufficient Disk Space in tempdb,建議您執行以下操作:
重啟執行個體來快速釋放臨時檔案的空間。
及時釋放暫存資料表、行版本、表變數等。
適用於
雲資料庫RDS SQL Server版