RDS SQL Server云数据库的磁盘空间被占满

RDS SQL Server云数据库的磁盘空间被占满

更新时间:2020-09-10 14:07:09

问题描述

在使用RDS SQL Server版云数据库时,数据库的磁盘空间被占满。

问题原因

由于业务需要过高,导致RDS SQL Server版云数据库的磁盘空间被占满。

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

在云数据库RDS SQL Server版中,删除数据后的空间会被重新使用,因此如果磁盘空间使用率不高时,可以选择不回收文件。但当磁盘空间被占满,影响业务正常运行,则需要回收文件,一般先选择回收日志文件,因为回收日志文件的速度快,在短时间内可清理出足够的可用空间。以下是关于回收日志文件的操作步骤:

  1. 查看待回收日志文件的大小,详细信息请参考以下内容:
    • 如果您使用的是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]为逻辑文件名。
  2. 执行以下SQL语句,查看日志文件空间是否可回收。
    SELECT [name],
           [log_reuse_wait_desc]
    FROM master.sys.databases
    WHERE [name]='[$Database_Name]'
  3. 执行以下SQL语句,回收日志文件空间。
    DBCC SHRINKFILE([$Logic_Name])
    说明:常见的日志等待类型和解决方法请参考更多信息
  4. 执行以下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
  5. 执行以下SQL语句,收缩数据文件。
    说明:一般情况下,最好每5GB进行循环收缩,如果影响业务,则中断操作,不会进行回滚。
    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
    说明:已用空间和空间大小通过上一步获取。
  6. 执行以下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控制台中,进入指定实例信息页面,单击左侧导航栏备份恢复,然后单击备份设置,编辑好备份恢复各参数后,单击页面右上角的收缩事务日志
    • ACTIVE_TRANSACTION
      该情况属于有活跃事务阻塞了日志回收。请参考以下操作步骤:
      1. 执行以下SQL语句,获取长时间的活跃事务SPID。
        DBCC OPENTRAN
      2. 执行以下SQL语句,其中[$SPID]为上一步获取的活跃事务SPID,查看请求SQL语句,考虑是否可以使用kill命令终止阻塞源。待终止后,查看log_reuse_wait,进行收缩操作。
        DBCC INPUTBUFFER([$SPID])

适用于

  • 云数据库RDS SQL Server版

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。