如何优化我的 Amazon RDS for SQL Server 数据库实例中的存储占用?
我的 Amazon Relational Database Service (Amazon RDS) for Microsoft SQL Server 数据库实例使用了超出预期的空间。我想优化我的磁盘存储。
简短描述
要优化存储消耗,首先要解决眼下的存储问题,然后再识别消耗空间的组件。如果您的实例处于 Storage Full(存储已满)状态,则应扩展存储或迁移到具有足够存储容量的新 RDS 数据库实例。如果您的数据库实例尚有可用存储,则应识别消耗空间的组件,并对每个相应组件应用优化技术。
您可以使用 Amazon CloudWatch 中的 FreeStorageSpace 指标监控数据库实例的可用存储空间。FreeStorageSpace 指标不会描述 SQL Server 引擎如何使用可用存储空间。经常监控此指标并打开存储自动扩缩功能,以确保存储不会耗尽。
解决方法
解决处于 Storage Full(存储已满)状态的 Amazon RDS for SQL Server 实例的存储问题
当您的数据库实例卡滞在 Storage Full(存储已满)状态时,您无法执行基本操作。有关详细信息,请参阅如何解决 Amazon RDS 数据库实例用尽存储空间时出现的问题?
某些 RDS for SQL Server 数据库实例对修改存储的方式有限制。如果您的数据库实例不符合修改条件,则 RDS 控制台中的 Allocated storage(分配的存储空间)选项将被禁用。
注意:使用磁性存储的 RDS for SQL Server 实例不支持扩展存储和存储自动扩缩。
要在修改选项不可用时扩展实例的存储空间,请使用本机备份和恢复将数据迁移到新数据库实例。然后,验证新数据库实例是否已配置每秒输入/输出 (IOPS) 或具有 General Purpose SSD(通用型 SSD)存储类型。或者,使用 AWS Database Migration Service (AWS DMS) 将您的数据迁移到新的数据库实例。有关详细信息,请参阅 Using a Microsoft SQL Server database as a source for AWS DMS(使用 Microsoft SQL Server 数据库作为 AWS DMS 的源)。
要查看数据库实例的有效存储选项,请运行以下 describe-valid-db-instance-modifications 命令:
describe-valid-db-instance-modifications
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 Troubleshooting errors for the AWS CLI(AWS CLI 错误故障排除)。此外,请确保您使用的是最新版本的 AWS CLI。
对于开启存储自动扩缩功能的数据库实例,只有在特定条件存在时才会自动扩展存储。如果自动扩缩功能无法按预期扩展存储空间,则您可以手动扩展存储空间。但是,请注意,自动和手动存储扩展都有限制条件。有关自动扩缩条件和限制的详细信息,请参阅 使用 Amazon RDS 存储自动扩缩功能自动管理容量。
分析数据库的存储消耗
要获取有关 RDS for 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** 的文件包含正在进行的事务的事务日志。
有关详细信息,请参阅 Microsoft 网站上的 sys.master_files (Transact-SQL)。
**注意:**sys.master_files 系统视图会显示 tempdb 的起始大小。它不能反映 tempdb 的当前大小。
要查看 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 引擎如何使用存储。SQL Server 引擎存储包括以下类别。
数据库文件
您可以将单个数据库使用的总存储空间细分为当前活动数据库中的行、索引和可用空间。要细分总存储空间,请运行以下查询:
use db_name EXEC sp_spaceused;
**注意:**请将 db_name 替换为您的用户数据库名称。
事务日志文件
要确定事务日志使用的存储量,请运行以下查询:
DBCC SQLPERF(LOGSPACE)
有关每个数据库的日志空间使用情况的更多详细信息,请运行以下查询:
use db_name; SELECT DB_NAME() AS [Database Name], ls.total_log_size_in_bytes / 1048576.0 AS [Total Log Size in MB], ls.used_log_space_in_bytes / 1048576.0 AS [Used Log Size in MB], (ls.total_log_size_in_bytes - ls.used_log_space_in_bytes) / 1048576.0 AS [Free Log Space in MB], ls.used_log_space_in_percent AS [Used Log Space in %], ls.log_space_in_bytes_since_last_backup / 1048576.0 AS [Log Since Last Log Backup in MB], dls.log_backup_time AS [Last Log Backup Time] FROM sys.dm_db_log_space_usage AS ls CROSS APPLY sys.dm_db_log_stats(DB_ID()) AS dls;
**注意:**请将 db_name 替换为您的数据库名称。
您可能会在事务日志中看到可用空间。要释放过多的可用空间,请运行 DBCC SHRINKFILE 命令。有关详细信息,请参阅 Microsoft 网站上的 DBCC SHRINKFILE (Transact-SQL)。
要减少为事务日志分配的过多可用空间,请使用 ALTER DATABASE (transact-SQL) 文件和文件组选项。这些选项可配置数据库的自动增长设置。有关详细信息,请参阅 Microsoft 网站上的 ALTER DATABASE (Transact-SQL) 文件和文件组选项。
临时数据库 (tempdb)
SQL Server tempdb 会自动增长。如果 tempdb 占用大量可用存储空间,您可以缩减 tempdb 数据库。
**注意:**如果您缩减 tempdb 数据库,则在运行该命令后,请查看 SQL Server Management Studio (SSMS) 的 Message(消息)选项卡中是否有错误消息。
如果您收到“DBCC SHRINKFILE: Page could not be moved because it is a work table page”错误消息,请参阅 Microsoft 网站上的 DBCC FREESYSTEMCACHE (Transact-SQL) 和 DBCC FREEPROCCACHE (Transact-SQL)。您也可以重启数据库实例以清除 tempdb。
处于 Storage Full(存储已满)状态的数据库实例可能无法重启。如果发生这种情况,请增加为数据库实例分配的存储空间,然后尝试再次重启。有关详细信息,请参阅如何解决 Amazon RDS 数据库实例用尽存储空间时出现的问题?
数据库索引
如果您将大量可用存储专用于索引,请检查索引调整是否可以节省空间。要获取有关索引使用情况的信息,请运行 sys.dm_db_index_usage_stats 动态管理视图查询。有关动态管理视图查询的查询示例和信息,请参阅微软网站上的 sys.dm_db_index_usage_stats (Transact-SQL)。最佳实践是删除未使用的索引以回收空间。这可以帮助您评估调整优先级。
跟踪文件
跟踪文件,包括 C2 审计跟踪文件和转储文件,可能会占用大量磁盘空间。RDS 会自动删除超过 7 天的跟踪和转储文件,但您可以调整 跟踪文件的保留设置。
Amazon S3 集成消耗的空间
如果您已将数据库实例与 Amazon Simple Storage Service (Amazon S3) 集成,请检查您是否将文件上传到了您的 D: 驱动器。要检查您的 S3 集成消耗了多少空间,请使用 rds_gather_file_details 存储过程和 rds\ _fn\ _list\ _list\ _file\ _details 函数列出数据库实例上的文件。有关详细信息,请参阅列出 RDS 数据库实例上的文件。
CDC
当您为数据库开启更改数据捕获 (CDC) 时,频繁更改源表或数据库会增加日志文件的大小。存储空间可能会用完。如果日志磁盘已满,则 CDC 无法处理更多事务。
审计
如果没有为数据库实例正确配置审计,日志可能会呈指数级增长并影响存储。有关详细信息,请参阅 SQL Server Audit(SQL Server 审计)。
C2 审计模式会将大量事件信息保存到日志文件中。日志文件可能会快速增长并使数据库实例进入 Storage Full(存储已满)状态。有关详细信息,请参阅 Microsoft 网站上的 服务器配置:c2 审核模式。
此外,如果您开启查询存储等功能,则这些功能可能会提高您的资源利用率。
相关信息
Amazon RDS for Microsoft SQL Server
Migrating Microsoft SQL Server databases to the AWS Cloud(将 Microsoft SQL Server 数据库迁移到 AWS 云)

