当我尝试使用 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 堆栈以使用现有数据库快照创建数据库实例。