您可参考本文操作解决RDS SQL Server数据库的磁盘空间被占满的情况。
阿里云提醒您:
如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
问题描述
使用云数据库RDS SQL Server时,数据库的磁盘空间被占满。
问题原因
由于业务需要过高,导致云数据库RDS SQL Server的磁盘空间被占满。
解决方案
在云数据库RDS SQL Server版中,删除数据后的空间会被重新使用,因此如果磁盘空间使用率不高时,可以选择不回收文件。但当磁盘空间被占满,影响业务正常运行,则需要回收文件,一般先选择回收日志文件,因为回收日志文件的速度快,在短时间内可清理出足够的可用空间。以下是关于回收日志文件的操作步骤:
查看待回收日志文件的大小,具体步骤请参考以下内容:
如果您使用的RDS SQL Server实例版本为2012或2016,则执行以下SQL语句,查看待回收日志文件的大小:
SELECT DB_NAME(database_id) AS [Database Name], [Name] AS [Logical Name], [Physical_Name] AS [Physical Name], ((size * 8) / 1024) AS [Size(MB)] FROM sys.master_files ORDER BY [Size(MB)] DESC
如果您使用的RDS SQL Server实例版本为2008 R2,则执行以下SQL语句,查看待回收日志文件的大小:
说明需要对各个数据库逐个执行。
USE [$Database_Name] GO SELECT a.name AS [$Logic_Name], size/128, FILEPROPERTY(a.name, 'SpaceUsed')/128, size/128 - FILEPROPERTY(a.name, 'SpaceUsed')/128, FILEPROPERTY(a.name, 'SpaceUsed')*100.0/size FROM sys.database_files a cross join (select recovery_model_desc, log_reuse_wait, log_reuse_wait_desc, is_auto_shrink_on from sys.databases where name=DB_NAME())b WHERE type=1
说明[$Database_Name]为数据库名。
[$Logic_Name]为逻辑文件名。
执行以下SQL语句,查看日志文件空间是否可回收。
SELECT [name], [log_reuse_wait_desc] FROM master.sys.databases WHERE [name]='[$Database_Name]'
执行以下SQL语句,回收日志文件空间。
DBCC SHRINKFILE([$Logic_Name])
说明建议您在数据库低峰期执行该命令,以避免对业务造成影响。
常见的日志等待类型和解决方法请参见更多信息。
执行以下SQL语句,查看数据文件大小。
USE [$Database_Name] GO SELECT a.name AS [$Logic_Name], size/128, FILEPROPERTY(a.name, 'SpaceUsed')/128, size/128 - FILEPROPERTY(a.name, 'SpaceUsed')/128, FILEPROPERTY(a.name, 'SpaceUsed')*100.0/size FROM sys.database_files a cross join (select recovery_model_desc, log_reuse_wait, log_reuse_wait_desc, is_auto_shrink_on from sys.databases where name=DB_NAME())b WHERE type=0
执行以下SQL语句,收缩数据文件。
说明一般情况下,通常每5 GB进行循环收缩,如果影响业务,则中断操作,不会进行回滚。
DECLARE @usedspace INT, @totalspace INT SELECT @usedspace = xxx, @totalspace = yyy WHILE @totalspace > @usedspace BEGIN SET @totalspace = @totalspace - 5 * 1024 DBCC SHRINKFILE([$Logic_Name], @totalspace) END
说明已用空间和空间大小通过上一步获取。
执行以下SQL语句,查看收缩进度。
说明该收缩进度为预估值。
SELECT DB_NAME(database_id) AS dbname, session_id, request_id, start_time, percent_complete, dateadd(mi, estimated_completion_time/60000, getdate()) AS ETC FROM sys.dm_exec_requests WHERE percent_complete <> 0
更多信息
常见的日志等待类型和解决方法如下所示:
LOG_BACKUP
该情况表示日志未备份,因此不能回收。
登录RDS控制台,进入目标实例信息页面,单击左侧导航栏备份恢复,然后单击备份设置,编辑好备份恢复各参数后,单击页面右上角的备份并收缩事务日志。备份设置个参数详情,请参见备份SQL Server数据。
ACTIVE_TRANSACTION
该情况属于有活跃事务阻塞了日志回收。请参考以下操作步骤:
执行以下SQL语句,获取长时间的活跃事务SPID。
DBCC OPENTRAN
执行以下SQL语句,其中[$SPID]为上一步获取的活跃事务SPID,查看请求SQL语句,考虑是否可以使用
kill
命令终止阻塞源。待终止后,查看log_reuse_wait,进行收缩操作。DBCC INPUTBUFFER([$SPID])
相关文档
适用于
云数据库RDS SQL Server版