本文列举了RDS实例有关存储空间的常见问题供您参考。
存储空间是否可以直接扩容?是否需要迁移数据?扩容有什么影响?
存储空间可以直接扩容,如果实例所在主机的存储空间不够用,系统会在拥有足够存储空间的主机上自动新建主备实例,并同步原实例数据。
关于如何扩容存储空间以及扩容是否会闪断,请参见:
扩容如何计费?
RDS实例扩容后计费将会发生变化,具体详情,请参见变配的计费规则。
存储空间占用突然升高,如何排查?
RDS实例列表页面,在上方选择地域,然后单击目标实例ID。
在左侧导航栏中单击监控与报警,查看实例占用存储空间的主要文件类型和变化趋势。
如何删除文件来释放空间?
为什么新建的数据库没有任何数据,就已经产生了磁盘使用量?
数据库初始化时,会创建相关的系统表用于存储账户、权限等。此外,数据库系统的日志(Redo、Undo等)也会占用磁盘空间。
为什么从其它异构数据库导入数据,MySQL占用了更多空间?
不同的数据库存储引擎处理数据的方式不同,例如,是否有压缩功能、在某些字段上是否有索引等都会影响占用的存储空间。
RDS实例的存储空间是否包含备份空间?
在RDS控制台的实例基本信息页面的使用量统计中的存储空间的统计值,仅为实例空间,不含备份空间。备份空间的使用量,请参见备份大小。
RDS实例存储空间占满后,会在多长时间内进入“锁定中”状态?
RDS实例存储空间占满后,实例将自动锁定并进入“锁定中”状态。然而,由于巡检机制的存在,实例状态的改变可能会有一定的延迟。
RDS实例一旦被锁定,将无法进行数据写入。建议您配置告警,以避免存储空间占满而导致实例锁定的情况发生。同时,您可以设置存储空间自动扩容,在存储空间不足时,实例会自动扩容存储空间,具体操作:
RDS MySQL实例请参见设置存储空间自动扩容。
RDS PostgreSQL实例请参见设置存储空间自动扩容。
RDS SQL Server实例请参见设置存储空间自动扩容。
对于RDS MySQL实例,您还可以开启空间碎片自动回收,及时清理空间碎片,回收存储空间。
RDS SQL Server实例删除大量数据后,为什么磁盘空间并没有减少?
在RDS SQL Server中执行DELETE
操作删除大量数据后,磁盘空间没有减少的原因与数据库管理系统的设计机制和日志记录行为有关:
事务日志记录:SQL Server为了保证数据的一致性和可恢复性,会对每一次数据操作(包括
DELETE
)进行详细的日志记录。表示即使数据被标记为删除,相应的日志条目仍会占据磁盘空间,可能导致磁盘使用量不减反增。数据页未释放:在SQL Server中,数据存储在数据页中,当数据被删除时,这些数据页并不立即回收,而是被标记为可重用。目的是为了提高后续插入操作的效率,避免频繁的物理磁盘整理操作。因此,虽然数据被逻辑上删除,但物理空间并未立即归还给操作系统。
表和索引碎片:删除数据后,可能会在表和索引中留下空洞,导致存储空间变得碎片化,但这部分空间仍然被数据库认为是已分配的。
若要实际回收这部分空间,建议采取以下措施:
收缩数据库或文件组:使用
DBCC SHRINKDATABASE
或DBCC SHRINKFILE
命令可以尝试回收未使用的空间并减少数据文件的大小。重要该过程可能会很耗时,且频繁收缩可能对性能产生负面影响。更多详情,请参见解决SQL Server实例空间满自动锁的问题或RDS SQL Server空间不足问题。
重建索引:删除大量数据后,索引可能变得碎片化,重建索引可以帮助整理数据页,回收空间,同时提高查询效率。
备份事务日志:对于使用完整恢复模式的数据库,定期备份事务日志可以截断日志,释放日志空间。更多详情,请参见管理日志。
考虑TRUNCATE TABLE:
TRUNCATE TABLE
在合适场景下较DELETE
更高效,它会直接释放数据页而不产生大量日志,执行速度更快。重要TRUNCATE
操作不可逆,且不支持带有WHERE
条件。
综上,如需实现磁盘空间的有效缩减,需要根据实际情况采取多种措施,以此优化数据库的磁盘空间。