resource "google_sql_database_instance" "original-primary" {
name = "postgres-original-primary-instance"
region = "us-east1"
# Specify a database version that supports Cloud SQL Enterprise Plus edition.
database_version = "POSTGRES_12"
instance_type = "CLOUD_SQL_INSTANCE"
settings {
# Specify a tier that supports Cloud SQL Enterprise Plus edition.
tier = "db-perf-optimized-N-2"
edition = "ENTERPRISE_PLUS"
backup_configuration {
# You must enable automated backups and point-in-time-recovery (PITR).
enabled = true
point_in_time_recovery_enabled = true
}
}
# Set `deletion_protection` to true to ensure that one can't accidentally
# delete this instance by use of Terraform whereas
# `deletion_protection_enabled` flag protects this instance at the Google Cloud level.
deletion_protection = false
}
resource "google_sql_database_instance" "dr-replica" {
name = "postgres-dr-replica-instance"
# DR replica must be in a different region than the region of the primary instance.
region = "us-west2"
# DR replica must be the same database version as the primary instance.
database_version = "POSTGRES_12"
instance_type = "READ_REPLICA_INSTANCE"
# Specify the primary instance as the master instance.
master_instance_name = google_sql_database_instance.original-primary.name
settings {
# DR replica must be in the same tier as your primary instance and support Enterprise Plus edition.
tier = "db-perf-optimized-N-2"
edition = "ENTERPRISE_PLUS"
}
# Set `deletion_protection` to true to ensure that one can't accidentally
# delete this instance by use of Terraform whereas
# `deletion_protection_enabled` flag protects this instance at the Google Cloud level.
deletion_protection = false
}
data "google_project" "default" {
}
resource "google_sql_database_instance" "original-primary" {
name = "postgres-original-primary-instance"
region = "us-east1"
database_version = "POSTGRES_12"
instance_type = "CLOUD_SQL_INSTANCE"
replication_cluster {
# Designate the DR replica.
# The format for setting the DR replica is `project-id:dr-replica-name`.
failover_dr_replica_name = "${data.google_project.default.project_id}:postgres-dr-replica-instance"
}
settings {
tier = "db-perf-optimized-N-2"
edition = "ENTERPRISE_PLUS"
backup_configuration {
enabled = true
point_in_time_recovery_enabled = true
}
}
# Set `deletion_protection` to true to ensure that one can't accidentally
# delete this instance by use of Terraform whereas
# `deletion_protection_enabled` flag protects this instance at the Google Cloud level.
deletion_protection = false
# Optional. Add more settings.
}
resource "google_sql_database_instance" "dr-replica" {
name = "postgres-dr-replica-instance"
region = "us-west2"
database_version = "POSTGRES_12"
instance_type = "READ_REPLICA_INSTANCE"
master_instance_name = google_sql_database_instance.original-primary.name
settings {
tier = "db-perf-optimized-N-2"
edition = "ENTERPRISE_PLUS"
}
# Set `deletion_protection` to true to ensure that one can't accidentally
# delete this instance by use of Terraform whereas
# `deletion_protection_enabled` flag protects this instance at the Google Cloud level.
deletion_protection = false
# Optional. Add more settings.
}
#
# This sample provides the first part of the switchover operation and turns the DR replica
# into the new primary instance.
data "google_project" "default" {
}
resource "google_sql_database_instance" "original-primary" {
name = "postgres-original-primary-instance"
region = "us-east1"
database_version = "POSTGRES_12"
instance_type = "CLOUD_SQL_INSTANCE"
replication_cluster {
failover_dr_replica_name = "${data.google_project.default.project_id}:postgres-dr-replica-instance"
}
settings {
tier = "db-perf-optimized-N-2"
edition = "ENTERPRISE_PLUS"
backup_configuration {
enabled = true
point_in_time_recovery_enabled = true
}
}
# Set `deletion_protection` to true to ensure that one can't accidentally
# delete this instance by use of Terraform whereas
# `deletion_protection_enabled` flag protects this instance at the Google Cloud level.
deletion_protection = false
# Optional. Add more settings.
}
resource "google_sql_database_instance" "dr-replica" {
name = "postgres-dr-replica-instance"
region = "us-west2"
database_version = "POSTGRES_12"
# Change the instance type from "READ_REPLICA_INSTANCE" to "CLOUD_SQL_INSTANCE".
instance_type = "CLOUD_SQL_INSTANCE"
# Remove or comment out the master_instance_name from the DR replica.
# master_instance_name = google_sql_database_instance.original-primary.name
# Add the original primary instance to a list of replicas for the new primary.
replica_names = [google_sql_database_instance.original-primary.name]
# Designate the original primary instance as the DR replica of the new primary instance.
# The format for setting the DR replica is `project-id:dr-replica-name`.
replication_cluster {
failover_dr_replica_name = "${data.google_project.default.project_id}:${google_sql_database_instance.original-primary.name}"
}
settings {
tier = "db-perf-optimized-N-2"
edition = "ENTERPRISE_PLUS"
backup_configuration {
# Add a backup configuration section to enable automated backups and point-in-time-recovery (PITR) for the new primary instance.
enabled = true
point_in_time_recovery_enabled = true
}
}
# Set `deletion_protection` to true to ensure that one can't accidentally
# delete this instance by use of Terraform whereas
# `deletion_protection_enabled` flag protects this instance at the Google Cloud level.
deletion_protection = false
# Optional. Add more settings.
}
进行更改后,运行 terraform plan 以更新主副本和灾难恢复副本。验证输出是否包含 Plan: 0 to add, 1 to change, 0 to destroy.。如需执行切换,请运行 terraform apply。
# This sample provides the second part of the switchover operation and makes the original primary instance
# a replica of the new primary instance. After you run `terraform apply` for this sample, you'll see
# the following message:
#
# "No changes. Your infrastructure matches the configuration.
#
# Terraform has compared your real infrastructure against your configuration and found no differences,
# so no changes are needed.
#
# Apply complete! Resources: 0 added, 0 changed, 0 destroyed."
data "google_project" "default" {
}
resource "google_sql_database_instance" "original-primary" {
name = "postgres-original-primary-instance"
region = "us-east1"
database_version = "POSTGRES_12"
# Change instance type for the original primary from "CLOUD_SQL_INSTANCE" to "READ_REPLICA_INSTANCE".
instance_type = "READ_REPLICA_INSTANCE"
# Set master_instance_name to the the new primary instance, the old DR replica.
master_instance_name = "postgres-dr-replica-instance"
# replica_names = [] # If you previously defined a replica_names field in your template, then delete the DR replica
# (new primary) from the list of replicas. Don't delete the entire replica_names field.
# Instead set the field to an empty string. For example, replica_names = [""].
replication_cluster {
# This instance no longer requires a designated DR replica since it's a replica.
# Remove the DR replica designation by setting the field to an empty string.
failover_dr_replica_name = ""
}
settings {
tier = "db-perf-optimized-N-2"
edition = "ENTERPRISE_PLUS"
backup_configuration {
# Disable automated backups and PITR because this instance is now a replica.
enabled = false
point_in_time_recovery_enabled = false
}
}
# Set `deletion_protection` to true to ensure that one can't accidentally
# delete this instance by use of Terraform whereas
# `deletion_protection_enabled` flag protects this instance at the Google Cloud level.
deletion_protection = false
# Optional. Add more settings.
}
resource "google_sql_database_instance" "dr-replica" {
name = "postgres-dr-replica-instance"
region = "us-west2"
database_version = "POSTGRES_12"
instance_type = "CLOUD_SQL_INSTANCE"
replica_names = [google_sql_database_instance.original-primary.name]
replication_cluster {
failover_dr_replica_name = "${data.google_project.default.project_id}:${google_sql_database_instance.original-primary.name}"
}
settings {
tier = "db-perf-optimized-N-2"
edition = "ENTERPRISE_PLUS"
backup_configuration {
enabled = true
point_in_time_recovery_enabled = true
}
}
# Set `deletion_protection` to true to ensure that one can't accidentally
# delete this instance by use of Terraform whereas
# `deletion_protection_enabled` flag protects this instance at the Google Cloud level.
deletion_protection = false
# Optional. Add more settings.
}
如果 Terraform 状态成功更新,当您针对第二个示例运行 terraform plan 时,会看到类似于以下内容的消息:
No changes. Your infrastructure matches the configuration.
如果您运行 terraform apply,则会收到类似于以下内容的消息:
Resources: 0 added, 0 changed, 0 destroyed.
REST v1
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID:主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
REPLICA_NAME:灾难恢复副本的名称。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/REPLICA_NAME/switchover