問題描述
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版