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

Terraform修改Cloud SQL实例区域后,如何同步重建数据库?

解决Terraform中Cloud SQL实例变更区域时数据库未同步重建的问题

问题核心在于:你当前的google_sql_database资源仅通过实例名称关联SQL实例,但修改区域后新实例的名称和旧实例一致,Terraform无法识别到数据库需要关联新实例,因此不会在第一次apply时同步创建新数据库。

修改方案

将数据库资源的instance参数从引用实例名称改为引用实例的唯一标识符(比如self_link或id),这样当SQL实例因区域变更被销毁重建时,这个唯一标识符会发生变化,Terraform会自动触发数据库的销毁和重建操作,实现一步完成。

修改后的代码如下:

# main.tf
resource "google_sql_database_instance" "database_instance" {
  database_version    = "POSTGRES_14"
  deletion_protection = false
  instance_type       = "CLOUD_SQL_INSTANCE"
  name                = "test-database"
  project             = var.project_name
  region              = "europe-west1" # 修改为目标区域
  root_password       = null
  settings {
    activation_policy     = "ALWAYS"
    availability_type     = "ZONAL"
    collation             = null
    connector_enforcement = "NOT_REQUIRED"
    disk_autoresize       = true
    disk_autoresize_limit = 0
    disk_type             = "PD_SSD"
    edition               = "ENTERPRISE"
    pricing_plan          = "PER_USE"
    tier                  = "db-custom-1-3840"
    time_zone             = null
    maintenance_window {
      day          = 1
      hour         = 0
      update_track = "stable"
    }
  }
  timeouts {
    create = null
    delete = null
    update = null
  }
}

resource "google_sql_database" "database" {
  # 关键修改:用self_link替代name,关联实例的唯一标识
  instance   = google_sql_database_instance.database_instance.self_link
  name       = "new_database"
  project    = var.project_name
  depends_on = [google_sql_database_instance.database_instance]
}

原理说明

  • self_link是Google Cloud资源的全局唯一URL,每个SQL实例的self_link包含区域信息,当实例区域变更重建后,新实例的self_link会和旧实例完全不同。
  • Terraform会监控资源参数的变化,当instance参数值改变时,会判定数据库资源需要销毁旧实例上的数据库,并在新实例上创建新的数据库,从而在一次terraform apply中完成所有操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 08:31:19