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

您可参考本文操作解决RDS SQL Server数据库的磁盘空间被占满的情况。

说明

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

问题描述

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

问题原因

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

解决方案

在云数据库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语句,收缩数据文件。

    说明

    一般情况下,通常每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
    说明

    已用空间和空间大小通过上一步获取。

  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

更多信息

常见的日志等待类型和解决方法如下所示:

  1. LOG_BACKUP

    该情况表示日志未备份,因此不能回收。

    登录RDS控制台,进入目标实例信息页面,单击左侧导航栏备份恢复,然后单击备份设置,编辑好备份恢复各参数后,单击页面右上角的备份并收缩事务日志。备份设置个参数详情,请参见备份SQL Server数据

  2. ACTIVE_TRANSACTION

    该情况属于有活跃事务阻塞了日志回收。请参考以下操作步骤:

    1. 执行以下SQL语句,获取长时间的活跃事务SPID。

      DBCC OPENTRAN
    2. 执行以下SQL语句,其中[$SPID]为上一步获取的活跃事务SPID,查看请求SQL语句,考虑是否可以使用kill命令终止阻塞源。待终止后,查看log_reuse_wait,进行收缩操作。

      DBCC INPUTBUFFER([$SPID])

相关文档

RDS SQL Server如何收缩事务日志

适用于

云数据库RDS SQL Server版