You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform创建OCI自治数据库启用Data Guard报错方案咨询

问题说明

使用Terraform创建OCI自治数据库时,若创建阶段直接将is_data_guard_enabled设为true,会触发以下报错:

Error: 400-InvalidParameter, Operation failed. Cannot enable Autonomous Data Guard during database creation.

该报错由OCI平台限制导致:Autonomous Data Guard不支持在数据库创建流程中直接启用,必须先以Data Guard关闭的状态完成数据库创建,再通过更新操作为已存在的数据库开启Data Guard能力。

实现逻辑

不需要拆分多资源、多阶段部署,通过Terraform自身的条件判断+资源状态识别,即可实现「首次创建自动传false完成建库、后续更新读取变量值开启Data Guard」的逻辑,单次terraform apply即可完成全流程,无需人工二次执行命令。

具体修改方式

调整资源中两个Data Guard相关参数的赋值逻辑,通过判断当前资源是否已存在(资源ID是否生成)来决定传入的参数值:

  • 资源首次创建时,资源ID为空,强制给两个DG参数传入false,绕过创建阶段的平台限制
  • 资源创建完成后,资源ID已生成,参数值读取你定义的变量值,自动触发更新操作开启Data Guard

修改后的完整资源代码如下:

resource "oci_database_autonomous_database" "autonomous_database_function" {
  compartment_id         = var.compartment_id
  db_name                = var.db_name
  display_name           = var.db_name
  private_endpoint_label = var.db_name
  admin_password         = random_password.oci_password.result

  is_preview_version_with_service_terms_accepted = "false"
  is_free_tier                                   = "false"
  is_dedicated                                   = "false"
  db_workload                                    = var.db_workload
  cpu_core_count                                 = var.cpu_core_count
  is_auto_scaling_enabled                        = var.auto_scaling_enabled
  is_auto_scaling_for_storage_enabled            = var.auto_scaling_enabled
  is_mtls_connection_required                    = var.is_mtls_connection_required
  data_storage_size_in_tbs                       = var.data_storage_size_in_tbs
  license_model                                  = var.license_model
  nsg_ids                                        = var.nsg_ids
  db_version                                     = var.db_version
  # 调整DG参数赋值逻辑,创建阶段固定传false,创建完成后读取变量值
  is_data_guard_enabled        = try(oci_database_autonomous_database.autonomous_database_function.id, "") == "" ? false : var.is_data_guard_enabled
  database_edition             = var.database_edition
  is_local_data_guard_enabled  = try(oci_database_autonomous_database.autonomous_database_function.id, "") == "" ? false : var.local_dg
  # Networking
  subnet_id = var.subnet_id

  dynamic "customer_contacts" {
    for_each = var.alert_recepient_email_address
    content {
      email = customer_contacts.value
    }
  }
  scheduled_operations {
    day_of_week {
      name = var.sched_ops_day_time[0]
    }
    scheduled_start_time = var.sched_ops_day_time[1]
  }
}

注意事项

  • 上述逻辑同时适配跨区域Autonomous Data Guard和本地Data Guard两个能力,两个参数必须同时套用条件判断,任意一个参数在创建阶段传true都会触发相同报错
  • OCI Terraform provider内置了资源状态轮询逻辑,会等待数据库创建完成进入AVAILABLE状态后,再执行Data Guard开启的更新操作,不需要额外添加等待资源就绪的逻辑
  • 该逻辑不会丢失后续参数变更能力,Data Guard开启完成后,后续如果需要关闭Data Guard、调整其他数据库配置,直接修改变量值执行apply即可正常触发更新
  • 不需要拆分两次apply执行,单次执行会自动按顺序完成建库、开启DG的全流程

内容的提问来源于stack exchange,提问作者Naresh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:55:00