为什么我启用存储 AutoScaling 后我的 Amazon RDS 数据库实例的可用存储低或者我的数据库实例处于存储已满状态?

上次更新时间:2020 年 3 月 5 日

我为 Amazon Relational Database Service (Amazon RDS) 数据库实例启用了存储 AutoScaling,但我看到可用存储空间低于 10% 或者实例处于存储已满的状态。为什么会出现这种情况,我该怎样解决呢?

简短描述

如果您最近手动或通过 AutoScaling 增加了 RDS 数据库实例的存储,则实例无法在数据库实例完成存储优化后的六个小时(冷却期)再进行任何存储修改。由于冷却期仅在操作完成后开始,且存储优化有时候可能需要数小时才能完成,存储修改冷却期总共可能会超过六小时。在存储修改冷却期,即使可用存储空间不足 10%,AutoScaling 也无法增加您的数据库实例存储。有关更多信息,请参阅增加数据库实例存储容量

如果您使用 AutoScaling 增加了 RDS 数据库实例的存储,存储将增加 5 GiB、10% 的当前分配存储或者基于过去一小时 FreeStorageSpace 指标的预测增长,以最高者为准。

如果您希望提高数据负载(例如大于 RDS 数据库实例当前存储大小 20% 的负载),最好的做法是在数据加载前手动提高 RDS 数据库存储的大小。例如,如果您的 RDS 数据库实例存储大小为 100 GiB 且拥有 10.1 GiB 的可用空间,并且存储使用量通常为每小时 100 MB,则 AutoScaling 会将存储提高 10% (10 GiB)。但是如果您希望在一小时内加载 50 GiB 数据,10% 的存储增加是不够的。由于上一个 AutoScaling 操作在存储修改冷却期进行,RDS 数据库实例至少在六小时内不能进行任何存储修改,从而导致 RDS 数据库实例处于存储已满状态数小时。

解决方法

如果您无法提高 RDS 数据库实例的存储大小,首先检查有无以下迹象,例如您的实例是否受存储修改冷却期影响:

  • 您的 RDS 数据库实例的状态为存储优化
  • 您的 RDS 数据库实例的状态为存储已满可用,但最近进行了存储修改。要确认最近已执行存储提高操作,请检查您的 RDS 数据库实例事件是否出现以下消息: “将修改应用至分配的存储已完成”或“将 AutoScale 发起的修改应用至分配的存储已完成”。 由于冷却期在存储优化完成后开始且操作可能需要数小时才能完成,最好检查过去 24 小时的存储修改情况。

如果最近进行了存储修改且您不能等到冷却期过去,则您可以将数据库恢复到拥有更多 Amazon Elastic Block Store (Amazon EBS) 存储的新 RDS 数据库实例中。但是,如果 RDS 数据库实例处于存储已满状态,您必须先停止 RDS 数据库实例上的任何数据加载。然后,您可以遵循数据库引擎的流程从 RDS 数据库实例中释放存储空间。停止 RDS 数据库实例上的所有数据加载后,Amazon RDS 自动化还尝试释放日志文件使用的空间。但是,此过程可能需要几分钟到几小时不等,之后,实例才会不再处于存储已满状态。

如果 RDS 数据库实例未处于存储已满状态,您可以使用以下方法之一提高您的数据库实例存储大小。

  • 选项 1: 创建并提升 RDS 数据库实例的只读副本
  • 选项 2: 手动拍摄数据库快照并将您的 RDS 数据库实例恢复到某个时间点

这两个选项都会导致数据库停机,但创建并提升只读副本可降低停机时间。MySQL、MariaDB 和 PostgreSQL 引擎的所有版本都支持 Amazon RDS 只读副本。对于 Oracle 数据库实例,只读副本只受 Oracle Enterprise Edition、版本 12.1.0.2.v10 和更高版本支持。要使用 Oracle 只读副本,您必须拥有 Active Data Guard 许可证。

选项 1:创建并提升 RDS 数据库实例的只读副本

  1. 如果您尚没有只读副本,请创建您的 RDS 数据库实例的只读副本
  2. 手动提高只读副本的存储容量。默认情况下,Amazon RDS 存储 AutoScaling 在只读副本上被禁用。
  3. 将您的活动 RDS 数据库实例重命名为另一个名称,以停止所有的传入流量。
  4. 将只读副本重命名为您的活动 RDS 数据库实例以前使用的名称。此操作会将只读副本终端节点更改为与活动的 RDS 数据库实例相同,因此,您不必重新配置您的应用程序。
  5. 提升只读副本

注意:对于应用程序或客户端,数据库将在步骤 3–5 期间发生停机。

选项 2:手动拍摄数据库快照并将您的 RDS 数据库实例恢复到某个时间点

  1. 重命名您的活动 RDS 数据库实例,以停止所有的传入流量。此操作将阻止 RDS 数据库实例达到存储已满状态。如果 RDS 数据库实例处于存储已满状态,您将不能继续下一步,以手动拍摄快照。
  2. 拍摄 RDS 数据库实例的数据库快照。您必须拍摄新快照,以防恢复的 RDS 数据库实例也受到存储修改冷却期的影响。
  3. 通过选择最近的可恢复时间将您的 RDS 数据库实例恢复到某个时间点。然后,对于实例标识符,输入您的活动 RDS 数据库实例使用的名称。注意:为了避免导致冷却期的任何进一步自动扩展提高,现在不要启用 AutoScaling。
  4. 或者,选择修改已恢复的 RDS 数据库实例,以包括任何自定义安全组。默认的数据库安全组将应用至新的 RDS 数据库实例。如果您使用任何自定义安全组,请立即设置它们。
  5. 手动提高新的 RDS 数据库实例的存储容量

注意: 对于应用程序或客户端,数据库将在步骤 1–4 期间发生停机。