SQL Server实例空间使用率过高是怎么回事?怎么解决?

户在使用SQL Server实例时,会遇到空间使用告警甚至超过实例限额被锁定的情况。在RDS控制台的实例基本信息中,即会出现如下信息:

SQL Server实例空间使用率过高是怎么回事?怎么解决?

本文将介绍造成空间使用率过高的常见原因及其相应的解决方法。

常见原因

造成SQL Server实例空间使用率过高,主要有如下三种原因:

日志文件占用量高

数据文件占用量高

tempdb占用量高

查看空间使用状况

方法一:

通过RDS管理控制台的监控页面查看空间使用情况,登录步骤请参见设置监控频率。

SQL Server实例空间使用率过高是怎么回事?怎么解决?

参数说明:

参数

说明

磁盘空间总体使用量

所有用户数据库的数据文件和日志文件的大小。

数据空间使用量

所有用户数据库的数据文件(mdf和ndf文件)的大小。

日志空间使用量

所有用户数据库的日志文件(ldf文件)。

临时文件空间使用量

tempdb的所有mdf、ndf和ldf文件的大小。

系统文件空间使用量

Master、msdb和model数据库的数据文件和日志文件,以及SQL Server实例目录下面的一些系统文件(错误日志和dll文件等)的大小。

方法二:

通过SQL语句查看所有数据库的数据文件(mdf和ndf文件)和日志文件(ldf文件)的大小,详情请参见RDS For SQL Server查看所有数据库使用空间的方法 。

解决方法

升级实例的磁盘空间

RDS实例支持单独升级磁盘空间,升级磁盘空间是解决空间问题的有效方式之一。关于如何升级磁盘空间,请参见变更配置。

下文将介绍在不升级空间的情况下解决空间问题的方法。

日志文件占用量高的解决方法

状况一:

ldf文件记录了事务的日志信息,如果应用程序中有大量的大事务操作,就会导致事务日志持续增长,并且有可能会导致超过实例磁盘空间上限而使实例被锁定。针对这种情况,建议您执行如下操作:

执行如下命令,检查重用日志中的空间的原因。

select name,log_reuse_wait,log_reuse_wait_desc from sys.databases

关于影响日志截断的因素解释,请参见Factors That Can Delay Log Truncation。

若log_reuse_wait_desc的值是LOG_BACKUP,请收缩日志备份和日志文件,详细步骤如下。

说明:若日志文件非常大,日志备份的时间会比较长,并且在收缩日志文件时,如果遇到未提交的事务,会导致单次收缩效果不明显。在单次收缩效果不明显的情况下,建议您再次收缩日志备份和日志文件。

登录RDS管理控制台。

选择目标实例所在地域。

单击目标实例的ID,进入基本信息页面。

在左侧导航栏中,选择备份恢复,进入备份恢复页面。

单击页面右上角的收缩事务日志按钮。

在确认框中单击确定。

状况二:

事务日志增长过快的根本原因是事务较多或者有大事务。例如,一个事务中操作了500万行数据,在有这种大事务的情况下,建议您将事务拆分,每个事务操作10万行数据,分50次执行。

数据文件占用量高的解决方法

如果数据库文件占用空间比较多,可以先检查数据文件的使用率。对于文件大但使用率低的数据库,可以进行相应处理。详细步骤如下。

执行如下命令,查看数据库的空闲空间。

USE DBName;

GO

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;

更多信息,请参见RDS for SQL Server如何查看实例、数据库及表占用的空间大小。

找到空间使用率较高的数据库,然后执行如下命令,收缩该数据库。

DBCC SHRINKDATABASE(DBName)

您也可以执行如下命令来收缩单个文件。

dbcc shrinkfile(file_id,size) --size为收缩以后的大小,而不是要收缩多少,单位MB.

temdb占用量高的解决方法

有时,当tempdb占用的空间增长过多时,会造成磁盘空间满,从而导致实例锁定。

您可以从实例监控中初步判定tempdb是否占用太多空间。另外,如果tempdb的空间不够,Error Log中也会有相应的记录,如下图所示。关于如何排查tempdb空间不足的情况,请参见Troubleshooting Insufficient Disk Space in tempdb。

针对这种情况,建议您执行如下操作:

通过重启实例来快速释放tempdb的空间。详细步骤,请参见重启实例。

及时释放临时表、行版本、表变量等。

文章转载自:http://yun.jinre.com/newsinfo/780274.html

上一篇:怎么使用Nginx、Nginx Plus抵御DDOS攻击
下一篇:RDS for SQL Server CPU使用率高怎么排查