如何解决使用 AWS CloudFormation 通过快照创建 RDS 数据库实例时出现的“DBInstance xxxxxx failed to stabilize”错误?

上次更新日期:2021 年 2 月 4 日

当我尝试使用 AWS CloudFormation 创建 AWS::RDS::DBInstance 资源时,收到了以下错误:“DBInstance xxxxxx failed to stabilize”。

简短描述

如果您使用 AWS CloudFormation 从现有的 RDS 数据库快照创建 Amazon Relational Database Service (Amazon RDS) 数据库实例 (AWS::RDS::DBInstance),则您可能会收到错误,原因如下:

  • 数据库快照中的存储类型与数据库实例中的存储类型不匹配。
  • 您的数据库快照包含无效的对象。

注意:RDS 数据库实例稳定性问题还有其他可能的原因。以下解决方案中的步骤仅适用于通过 AWS CloudFormation 中的快照创建 RDS 数据库实例的问题。

解决方法

匹配数据库快照与数据库实例之间的存储类型

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI

1.    使用 Amazon RDS 控制台describe-db-snapshots AWS CLI 命令验证数据库快照的存储类型。例如:

aws rds describe-db-snapshots --db-snapshot-identifier MyRDSSnapShot --region us-east-1
{
    "DBSnapshots": [
        {
            .......
            "AllocatedStorage": 20, 
            "Status": "available", 
            "PercentProgress": 100, 
            "DBSnapshotArn": "arn:aws:rds:us-east-1:1234567890:snapshot:MyRDSSnapShot", 
            "EngineVersion": "12.1.0.2.v7", 
            "ProcessorFeatures": [], 
            "OptionGroupName": "default:oracle-ee-12-1", 
            "SnapshotCreateTime": "2019-03-16T17:43:41Z", 
            "AvailabilityZone": "us-east-1f", 
            "StorageType": "gp2",
            .......
        }
    ]
}

注意:来自 AWS CLI 命令的存储类型gp2 在 Amazon RDS 控制台中映射到通用型 (SSD) 值。

2.    在 AWS CloudFormation JSON 或 YAML 模板的 AWS::RDS::DBInstance 资源定义中,设置 StorageType 的值以匹配快照的存储类型。在这种情况下,存储类型设置为 gp2

JSON:

{
    "MySampleDB": {
        "Type": "AWS::RDS::DBInstance",
        "Properties": {
            "DBInstanceClass": "db.t2.small",
            "StorageType": "gp2",
            "Engine": "postgres",
            "EngineVersion": "9.5.12",
            ........
        }
    }
}

YAML:

MySampleDB:
  Type: 'AWS::RDS::DBInstance'
  Properties:
    DBInstanceClass: db.t2.small
    StorageType: gp2
    Engine: postgres
    EngineVersion: 9.5.12
    ......

注意:如果未设置存储类型,则 AWS CloudFormation 默认情况下会将 StorageType 设置为标准,这可能与所引用快照的存储类型不匹配。如果存储类型不匹配,则由于需要执行额外的存储转换流程,RDS 可能需要更长的时间来创建数据库。此外,这种不匹配可能会导致较大规模数据库的超时错误。最佳实践是在 AWS።RDS።DBInstance 资源中明确定义存储类型。此外,请考虑将存储类型设置为与快照的存储类型匹配。

3.    启动您的 AWS CloudFormation 堆栈以创建数据库实例。

验证您的数据库快照没有无效的对象

如果用于创建数据库实例的数据库快照包含无效的对象,请完成以下步骤:

1.    找出并修复现有数据库中的无效对象。

例如,以下 Oracle 数据库查询可返回无效对象的列表:

select owner,object_name,object_type,status from dba_objects where status='INVALID'

2.    从现有数据库重新拍摄快照

重要提示:只有修复或删除了数据库中的所有无效对象后,才能重新拍摄数据库快照。

3.    启动您的 AWS CloudFormation 堆栈以使用现有数据库快照创建数据库实例。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?