如何排查我的 RDS for SQL Server 数据库实例中的存储消耗问题?

上次更新日期:2022 年 10 月 17 日

我的 Amazon Relational Database Service(Amazon RDS)for Microsoft SQL Server 数据库实例使用的空间超出预期。为什么会发生这种情况,我该如何优化磁盘存储?

简短描述

您可以使用 Amazon CloudWatch 中的 FreeStorageSpace 指标监控数据库实例的可用存储空间。经常监控此指标并开启存储自动扩展功能有助于防止实例耗尽存储空间(存储已满状态)。

FreeStorageSpace 指标不会描述 SQL Server 引擎消耗可用存储的情况。

解决方法

Amazon RDS for SQL Server 实例处于存储空间已满状态

当您的 RDS 实例停留在存储已满状态时,您无法执行基本操作。有关更多详细信息,请参阅如何解决在 Amazon RDS 数据库实例存储用尽时出现的问题?

某些 RDS for SQL Server 数据库实例在修改存储方面存在限制。在 Amazon RDS 控制台中,如果数据库实例不符合修改条件,则系统会停用 Allocated Storage(分配存储)选项。要在修改选项不可用时扩展实例的存储空间,请使用本机备份和还原将您的数据迁移到新实例。确保新实例具有预调配 IOPS 或通用型(SSD)存储类型。或者,使用数据迁移工具迁移到新实例。有关更多信息,请参阅修改 Amazon RDS 数据库实例

使用以下 AWS 命令行界面(AWS CLI)命令返回数据库实例的有效存储选项:

describe-valid-db-instance-modifications

注意:使用磁性存储的 RDS for SQL Server 实例不支持扩展存储和存储自动扩展。

对于已开启存储自动扩展的实例,只有在某些情况下才会扩展存储。有关更多信息,请参阅使用 Amazon RDS 存储自动扩展功能自动管理容量。此外,仅当最大存储阈值不等于或超过存储增量时,才会扩展存储。有关更多信息,请参阅限制

RDS for SQL Server 实例的存储消耗量

要收集有关 SQL Server 数据库实例的物理磁盘空间使用量的详细信息,请运行与以下类似的查询:

SELECT D.name AS [database_name]
    , F.name AS [file_name]
    , F.type_desc AS [file_type]
    , CONVERT(decimal(10,2), F.size * 0.0078125) AS [size_on_disk_mb]
    , CONVERT(decimal(10,2), F.max_size * 0.0078125) AS [max_size_mb]
FROM sys.master_files AS F
INNER JOIN sys.databases AS D
    ON F.database_id = D.database_id;

包含 ROWS 的文件代表数据,包含 LOGS 的文件代表正在进行中的事务。

注意:sys.master_files 系统视图显示临时数据库的初始大小。它不反映 tempdb 的当前大小。请运行以下查询来检查临时数据库的当前大小:

select name AS [database_name], 
physical_name AS [file_name], 
convert(decimal(10,2),size*0.0078125) AS [size_on_disk_mb]
from tempdb.sys.database_files;

在优化存储前,请确保您了解 SQL Server 引擎使用存储的方式。SQL Server 引擎存储大致分为以下几个类别:

数据库文件

您可以将单个数据库使用的总存储量细分为行、索引和当前活动数据库的可用空间。要执行此操作,请运行类似以下内容的查询:

EXEC sp_spaceused;

事务日志文件

要确定事务日志使用的存储量,请运行以下查询:

DBCC SQLPERF(LOGSPACE)

事务日志中应当有可用空间,但您可以按照有关 DBCC SHRINKFILE 的 Microsoft 文档的说明,取消分配过多的可用空间。

您可以使用 ALTER DATABASE(transact-SQL)文件和文件组选项减少为事务日志分配的过多可用空间。这些选项配置数据库的自动增长设置。

临时数据库(tempdb)

SQL Server 临时数据库会自动增长。如果临时数据库正在大量消耗可用存储,您可以缩减临时数据库

注意:如果您缩减临时数据库,请在运行此命令后检查 SQL Server Management Studio(SSMS)中的 Message(消息)选项卡,查看错误消息。如果您收到 DBCC SHRINKFILE: Page could not be moved because it is a work table page 错误消息,请参阅有关 DBCC FREESYSTEMCACHEDBCC FREEPROCCACHE 的 Microsoft 文档。您也可以重启数据库实例以清除临时数据库。

处于存储已满状态的数据库实例可能无法重启。如果出现这种情况,请增加为数据库实例分配的存储空间,然后重启。有关更多详细信息,请参阅如何解决在 Amazon RDS 数据库实例存储用尽时出现的问题?

数据库索引

当您将很大一部分可用存储专用于索引时,您可以通过索引优化节省一些空间。您可以运行 sys.dm_db_index_usage_stats 动态管理视图来收集有关索引使用情况的详细信息。这可以帮助您评估优化优先级。

跟踪文件

跟踪文件(包括 C2 审计跟踪文件和转储文件)可能会占用大量磁盘空间。Amazon RDS 会自动删除超过 7 天的跟踪和转储文件,但您也可以调整跟踪文件的保留设置。有关详细信息,请参阅设置跟踪和转储文件的保留期

Amazon S3 集成占用的空间

如果您已将 RDS 数据库实例与 Amazon S3 集成,则可能已将占用空间的文件上传到 D: 驱动器。要检查 S3 集成所占用的空间量,请运行命令来列出数据库实例上的文件。有关更多信息,请参阅列出 RDS 数据库实例上的文件

CDC

对于开启了 CDC 的数据库,日志文件大小会根据源表或数据库的更改频率而增加。存储空间最终可能会耗尽。如果日志磁盘已满,则 CDC 无法处理进一步的事务。

审计

例如,如果审计配置不正确,日志可能会呈指数级增长并影响存储。有关更多信息,请参阅使用 SQL Server 审计

C2 审计模式将大量事件信息保存到日志文件中。日志文件可能会快速增长并使实例处于“存储已满”状态。有关更多信息,请参阅 Microsoft 文档中的 C2 审计模式服务器配置选项

此外,开启查询存储等功能也可能会影响资源利用率。