如何排查运行 SQL Server 的 Amazon RDS 数据库实例的存储消耗问题?

上次更新时间:2019 年 8 月 13 日

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

解决方法

对于 RDS 数据库实例,您可以使用 FreeStorageSpace 这一 Amazon CloudWatch 指标来监控可用存储空间。但该指标不会描述 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 系统视图显示了临时数据库的开机大小,但不会反映临时数据库的当前大小。请运行以下查询来检查临时数据库的当前大小:

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) 中的消息选项卡,查看错误消息。如果您收到 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 动态管理视图来收集有关索引使用情况的详细信息,这可以帮助您评估优化优先级。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助吗?