问题描述
SQL Server实例可能会由于SQL语句、外部攻击等原因导致实例空间满,为避免数据丢失,RDS会对实例进行自动锁定,磁盘锁定之后,将无法进行写入操作。当实例由于实例空间满自动锁定时,在控制台的看到如下信息。
问题原因
造成SQL Server实例空间满的主要有以下三种原因:
- 日志文件占用量高。
- 数据文件占用量高。
- 临时文件占用量高。
解决方案
阿里云提醒您:
- 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
- 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
- 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
查看空间使用状况
方法一
通过RDS管理控制台的监控页面查看空间使用情况,详情请参见查看资源和引擎监控。
参数说明如下。
参数 | 说明 |
磁盘空间总体使用量 | 所有用户数据库的数据文件和日志文件的大小。 |
数据空间使用量 | 所有用户数据库的数据文件(mdf和ndf文件)的大小。 |
日志空间使用量 | 所有用户数据库的日志文件(ldf文件)。 |
临时文件空间使用量 | tempdb的所有mdf、ndf和ldf文件的大小。 |
系统文件空间使用量 | master、msdb和model数据库的数据文件和日志文件,以及SQL Server实例目录下面的一些系统文件(错误日志和dll文件等)的大小。 |
通过SQL语句查看所有数据库的数据文件(mdf和ndf文件)和日志文件(ldf文件)的大小,详情请参见RDS for SQL Server如何查看实例、数据库及表占用的空间大小。
方法三
可是用相关工具查看空间使用状况,具体使用方法可参见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。
- 依次执行以下SQL语句,查看数据库的空闲空间。
-
临时文件用量高的解决方法。您可以从实例监控中初步判定临时文件是否占用太多空间。如果临时文件的空间不够,Error Log中也会有相应的记录。关于如何排查临时文件空间不足的情况,请参见Troubleshooting Insufficient Disk Space in tempdb,建议您执行以下操作:
- 重启实例来快速释放临时文件的空间。
- 及时释放临时表、行版本、表变量等。
适用于
- 云数据库RDS SQL Server版
如果您的问题仍未解决,您可以在阿里云社区提交工单联系阿里云技术支持。