建立唯讀備用資源

本頁面說明如何為 Cloud SQL 執行個體建立唯讀副本。

如要將 Cloud SQL 執行個體設為外部訂閱者的發布者,請參閱「設定外部副本」。

唯讀副本是主要執行個體的副本,在正常情況下,會近乎即時地反映主要執行個體的變更。您可以使用唯讀副本,從主要執行個體卸載讀取要求或數據分析流量。

此外,您也可以執行區域遷移,以便進行災難復原。如果副本是跨區域副本,您可以容錯移轉至其他區域,具體來說,就是將副本升級為獨立執行個體 (在這種情況下,現有副本不會將該執行個體視為主要執行個體)。

如要進一步瞭解複製功能的運作方式,請參閱「Cloud SQL 中的複製功能」。

事前準備

如果您要為這個執行個體建立第一個副本,請確認該執行個體符合主要執行個體的需求條件。瞭解詳情。

建立唯讀副本

建立唯讀副本時,請留意下列事項:

  • 每個主要執行個體最多可指派 7 個唯讀副本。

    使用讀取集區或讀取集區自動調度資源時,會套用獨特行為。

    詳情請參閱「關於讀取集區」。

  • 如未指定版本,則預設為 Cloud SQL Enterprise 版本。
  • 建立唯讀副本或串連副本時,如果主要執行個體是 Cloud SQL Enterprise Plus 版本執行個體,則必須指明要使用的版本和級別。

建立唯讀副本的步驟如下。

控制台

  1. 前往 Google Cloud 控制台的「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面。

    前往「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面

  2. 找出要建立副本的執行個體,然後開啟清單旁的 more actions 選單。
  3. 選取「建立唯讀副本」。

    如果沒有看到這個選項,表示該執行個體是副本,您無法為副本建立副本。

  4. 在「Customize your instance」(自訂執行個體) 區段中,更新副本設定。首先,請按一下「Show configuration options」(顯示設定選項),顯示設定群組。接著,展開所需群組,查看及自訂設定。右側會顯示所選選項的摘要。您可以視需要自訂這些設定。在未進行任何自訂的情況下,系統會指派預設值。

    如要進一步瞭解各項設定,請參閱「關於執行個體設定」頁面。

  5. 按一下「Create replica」(建立副本)。

    Cloud SQL 會視需要建立備份,並建立副本。您會回到主要執行個體的頁面。

gcloud

建立副本:

gcloud sql instances create REPLICA_NAME \
--master-instance-name=PRIMARY_INSTANCE_NAME
  

如有需要,您可以使用 --tier 參數指定不同的級別大小。

您可以使用 --region 參數指定其他區域。

如果主要執行個體只有內部 IP 位址,請在指令中加入 --no-assign-ip 參數。

您可以為其他執行個體設定新增更多參數。詳情請參閱「gcloud sql instances create」。

您必須在主要執行個體所在的虛擬私有雲網路中建立副本。您也可以在該虛擬私有雲網路中指定 allocated-ip-range-name。如未指定範圍,系統會在隨機範圍內建立副本。

Terraform

如要建立唯讀副本,請使用 Terraform 資源。

resource "google_sql_database_instance" "read_replica" {
  name                 = "sqlserver-replica-instance-name"
  master_instance_name = google_sql_database_instance.primary.name
  region               = "europe-west4"
  database_version     = "SQLSERVER_2019_ENTERPRISE"
  root_password        = "INSERT-PASSWORD-HERE"
  replica_configuration {
    failover_target = false
  }

  settings {
    tier              = "db-custom-2-7680"
    availability_type = "ZONAL"
    disk_size         = "100"
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

REST v1beta4

使用執行個體資源的 insert 方法建立唯讀副本。region 和 databaseVersion 屬性必須與主要執行個體相同。

使用任何要求資料之前,請先修改下列項目的值:

  • project-id:專案 ID
  • database-version:列舉版本字串 (例如 SQLSERVER_2017_ENTERPRISE)
  • primary-instance-name:主要執行個體的名稱
  • primary-instance-region:主要執行個體的區域
  • replica-region:副本執行個體的區域
  • replica-name:副本執行個體的名稱
  • machine-type:機器類型的列舉字串。例如:「db-custom-1-3840」

您可以使用 sqlNetworkArchitecture 欄位,強制執行個體在建立時使用新的網路架構,即使專案尚未完全升級也沒問題。如要進一步瞭解新版網路架構及其影響,請參閱「 將執行個體升級為新版網路架構」和「分配 IP 位址範圍」。

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances

JSON 要求主體:

{
  "masterInstanceName": "primary-instance-name",
  "project": "project-id",
  "databaseVersion": "database-version",
  "name": "replica-name",
  "region": "replica-region",
  "settings":
  {
    "tier": "machine-type",
    "settingsVersion": 0,
    
  },
  "sqlNetworkArchitecture": "NEW_NETWORK_ARCHITECTURE"
}

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

為已啟用 Private Service Connect 的執行個體建立唯讀副本

如要為已啟用 Private Service Connect 的執行個體建立唯讀副本,請使用 gcloud CLI 或 API。您可以在與主要執行個體相同的區域或不同區域 (跨區域唯讀副本) 建立這個副本。

唯讀副本無法從連線類型不同的執行個體複製。舉例來說,啟用 Private Service Connect 的執行個體只能從另一個 Private Service Connect 執行個體複製資料。此外,也無法從支援外部 IP 連線的執行個體,或設定私人服務存取權的執行個體複製資料。

gcloud

如要建立執行個體的唯讀副本,請使用 gcloud sql instances create 指令:

gcloud sql instances create REPLICA_INSTANCE_NAME \
--master-instance-name=PRIMARY_INSTANCE_NAME \
--project=PROJECT_ID \
--region=REGION_NAME \
--enable-private-service-connect \
--allowed-psc-projects=ALLOWED_PROJECTS \
--availability-type=AVAILABILITY_TYPE \
--no-assign-ip

請依指示取代下列項目:

  • REPLICA_INSTANCE_NAME:副本執行個體的名稱。
  • PRIMARY_INSTANCE_NAME:主要執行個體的名稱。
  • PROJECT_ID:執行個體所在 Google Cloud 專案的 ID 或專案編號。
  • REGION_NAME:副本執行個體的區域名稱。
  • ALLOWED_PROJECTS:允許的專案 ID 或編號清單,以半形逗號分隔。如果專案不在這份清單中,就無法用來建立執行個體,並為執行個體啟用 Private Service Connect。

    Cloud SQL 不會將主要執行個體的允許專案複製到副本。您必須為每個副本建立 Private Service Connect 端點。如果您使用 Cloud SQL Auth Proxy 或 Cloud SQL 語言連接器,請為副本建立 DNS 區域和 DNS 記錄。

  • AVAILABILITY_TYPE:為執行個體啟用高可用性。請為這項參數指定下列其中一個值:
    • REGIONAL:啟用高可用性,建議用於正式版執行個體。執行個體會容錯移轉至所選區域內的其他可用區。
    • ZONAL:不提供容錯移轉功能。這是預設值。

    如要進一步瞭解如何設定及移除執行個體的高可用性,請參閱「為現有執行個體設定高可用性」和「停用執行個體的高可用性」。

REST v1

使用任何要求資料之前,請先修改下列項目的值:

  • PRIMARY_INSTANCE_NAME:主要執行個體的名稱。
  • PROJECT_ID:執行個體所在 Google Cloud 專案的 ID 或專案編號。
  • REPLICA_INSTANCE_NAME:副本執行個體的名稱。
  • REGION_NAME:副本執行個體的區域名稱。
  • MACHINE_TYPE:執行個體的機型。
  • AVAILABILITY_TYPE:為執行個體啟用高可用性。請為這項參數指定下列其中一個值:
    • REGIONAL:啟用高可用性,建議用於正式版執行個體。執行個體會容錯移轉至所選區域內的其他可用區。
    • ZONAL:不提供容錯移轉功能。這是預設值。

    如要進一步瞭解如何設定及移除執行個體的高可用性,請參閱「為現有執行個體設定高可用性」和「停用執行個體的高可用性」。

  • ALLOWED_PROJECTS:允許的專案 ID 或編號清單,以半形逗號分隔。如果專案不在這份清單中,就無法用來建立執行個體,並為執行個體啟用 Private Service Connect。

    Cloud SQL 不會將主要執行個體的允許專案複製到副本。您必須為每個副本建立 Private Service Connect 端點。如果您使用 Cloud SQL Auth Proxy 或 Cloud SQL 語言連接器,則必須為副本建立 DNS 區域和 DNS 記錄。

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances

JSON 要求主體:

{
  "masterInstanceName": "PRIMARY_INSTANCE_NAME",
  "project": "PROJECT_ID",
  "databaseVersion": "SQLSERVER_2019_STANDARD",
  "name": "REPLICA_INSTANCE_NAME",
  "region": "REGION_NAME",
  "kind": "sql#instance",
  "settings":
  {
    "tier": "MACHINE_TYPE",
    "availabilityType": "AVAILABILITY_TYPE",
    "settingsVersion": 0,
    "ipConfiguration": {
      "ipv4Enabled": false,
      "pscConfig": {
        "allowedConsumerProjects": [ALLOWED_PROJECTS],
        "pscEnabled": true
      }
    },
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "ASYNCHRONOUS",
    "tier": "MACHINE_TYPE"
  }
}

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/REPLICA_INSTANCE_NAME",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "operationType": "CREATE_REPLICA",
  "name": "OPERATION_ID",
  "targetId": "REPLICA_INSTANCE_NAME",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

REST v1beta4

使用任何要求資料之前,請先修改下列項目的值:

  • PRIMARY_INSTANCE_NAME:主要執行個體的名稱。
  • PROJECT_ID:執行個體所在 Google Cloud 專案的 ID 或專案編號。
  • REPLICA_INSTANCE_NAME:副本執行個體的名稱。
  • REGION_NAME:副本執行個體的區域名稱。
  • MACHINE_TYPE:執行個體的機型。
  • AVAILABILITY_TYPE:為執行個體啟用高可用性。請為這項參數指定下列其中一個值:
    • REGIONAL:啟用高可用性,建議用於正式版執行個體。執行個體會容錯移轉至所選區域內的其他可用區。
    • ZONAL:不提供容錯移轉功能。這是預設值。

    如要進一步瞭解如何設定及移除執行個體的高可用性,請參閱「為現有執行個體設定高可用性」和「停用執行個體的高可用性」。

  • ALLOWED_PROJECTS:允許的專案 ID 或編號清單,以半形逗號分隔。如果專案不在這份清單中,就無法用來建立執行個體,並為執行個體啟用 Private Service Connect。

    Cloud SQL 不會將主要執行個體的允許專案複製到副本。您必須為每個副本建立 Private Service Connect 端點。如果您使用 Cloud SQL Auth Proxy 或 Cloud SQL 語言連接器,則必須為副本建立 DNS 區域和 DNS 記錄。

HTTP 方法和網址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances

JSON 要求主體:

{
  "masterInstanceName": "PRIMARY_INSTANCE_NAME",
  "project": "PROJECT_ID",
  "databaseVersion": "SQLSERVER_2019_STANDARD",
  "name": "REPLICA_INSTANCE_NAME",
  "region": "REGION_NAME",
  "kind": "sql#instance",
  "settings":
  {
    "tier": "MACHINE_TYPE",
    "availabilityType": "AVAILABILITY_TYPE",
    "settingsVersion": 0,
    "ipConfiguration": {
      "ipv4Enabled": false,
      "pscConfig": {
        "allowedConsumerProjects": [ALLOWED_PROJECTS],  
        "pscEnabled": true
      }
    },
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "ASYNCHRONOUS",
    "tier": "MACHINE_TYPE"
  }
}

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE_NAME",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "operationType": "CREATE_REPLICA",
  "name": "OPERATION_ID",
  "targetId": "REPLICA_INSTANCE_NAME",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

建立串聯式副本

本節說明如何建立及管理串接副本。

如要瞭解串聯式副本的運作方式,請參閱「串聯式副本」。

事前準備

主要執行個體必須有可串連的副本。下一節將說明建立可串接副本的步驟。

建立可串聯副本的步驟

建立可串接的副本時,必須在與主要執行個體不同的區域中建立副本。您可以設定 cascadable-replica 旗標,設定可串連的副本。

gcloud

使用 --master-instance-name 旗標指定主要執行個體,並使用 --cascadable-replica 旗標建立新的副本:

gcloud sql instances create REPLICA_NAME \
   --master-instance-name=PRIMARY_INSTANCE_NAME \
   --cascadable-replica \
   --region=REGION

更改下列內容:

  • REPLICA_NAME:您要建立的副本專屬 ID。
  • PRIMARY_INSTANCE_NAME:主要執行個體的名稱。
  • REGION:要建立新副本的區域。這個區域必須與主要執行個體的區域不同。

您必須在與主要執行個體相同的虛擬私有雲網路中建立副本。您也可以在該虛擬私有雲網路中指定分配的 IP 範圍名稱。如未指定範圍,系統會在隨機範圍內建立副本。

您可以為其他執行個體設定新增更多參數。例如:

  • 您可以使用 --tier 參數指定不同的機器層級大小。
  • 如果主要執行個體只有私人 IP 位址,請在指令中加入 --no-assign-ip 參數。

如要進一步瞭解如何新增執行個體設定參數,請參閱「gcloud sql instances create」。

建立可串聯副本後,即可建立串聯副本。

curl

  1. 如要在主要執行個體下建立可串接的副本,請編輯下列 JSON 程式碼範例,並儲存至名為 request.json 的檔案。

    使用任何要求資料之前,請先替換下列項目:

    • PROJECT_ID:專案 ID。
    • DATABASE_VERSION:資料庫版本的列舉字串。例如:SQLSERVER_2017_ENTERPRISE.
    • PRIMARY_INSTANCE_NAME:主要執行個體的名稱。
    • PRIMARY_INSTANCE_REGION:主要執行個體的區域。
    • REPLICA_REGION:副本執行個體的區域。
    • REPLICA_NAME:副本執行個體的名稱。
    • MACHINE_TYPE:機器類型的列舉字串。例如:db-custom-2-3840。
    {
      "masterInstanceName": "PRIMARY_INSTANCE_NAME",
      "project": "PROJECT_ID",
      "databaseVersion": "DATABASE_VERSION"
      "name": "REPLICA_NAME",
      "region": "REPLICA_REGION",
      "settings":
        {
          "tier": "MACHINE_TYPE",
          "settingsVersion": 0,
        }
        "replicaConfiguration":
        {
         "cascadableReplica": true
        }
    }
  2. 在 replicaConfiguration 部分,確認 cascadadableReplica 欄位設為 true。
  3. 請執行下列指令:
    curl -X POST
    -H "Authorization: Bearer "$(gcloud auth print-access-token)
    -H "Content-Type: application/json; charset=utf-8"
    -d @request.json
    "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances"

建立可串聯副本後,即可建立串聯副本。

Terraform

如要建立可串連的副本,請使用 Terraform 資源。

下列範例會建立主要執行個體和可串接的副本,您可以在執行切換作業時,將該副本指派為災難復原副本,做為進階災難復原 (DR) 的一部分。

resource "google_sql_database_instance" "original-primary" {
  name   = "sqlserver-primary-instance-name"
  region = "us-east1"
  # Specify a database version that supports Cloud SQL Enterprise Plus edition.
  database_version = "SQLSERVER_2022_ENTERPRISE"
  instance_type    = "CLOUD_SQL_INSTANCE"
  root_password    = "INSERT-PASSWORD-HERE"
  replica_names    = ["sqlserver-replica-instance-name"]
  settings {
    tier    = "db-perf-optimized-N-2"
    edition = "ENTERPRISE_PLUS"
    backup_configuration {
      enabled = "true"
    }
  }
}

resource "google_sql_database_instance" "dr_replica" {
  name = "sqlserver-replica-instance-name"
  # Specify the original primary instance as the master instance.
  master_instance_name = google_sql_database_instance.original-primary.name
  # 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 = "SQLSERVER_2022_ENTERPRISE"
  instance_type    = "READ_REPLICA_INSTANCE"
  root_password    = "INSERT-PASSWORD-HERE"
  replica_configuration {
    # Make the replica a cascadable replica.
    cascadable_replica = true
  }

  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"
  }
}

建立串聯式副本的步驟

建立串聯式副本時,必須在可串聯副本所在的區域建立副本。如要設定串聯式副本,請在 –master-instance-name 參數中提供可串聯副本的名稱。

控制台

  1. 前往 Google Cloud 控制台的「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面。

    前往「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面

  2. 找出要建立的副本,然後按一下該副本上層副本的「副本」分頁標籤。
  3. 按一下「建立副本」。
  4. 在「Create read replica」(建立唯讀副本) 頁面中,更新執行個體 ID 和任何其他設定選項,包括名稱、區域和可用區。
  5. 點選「建立」。

    Cloud SQL 會建立副本。您會回到上層副本的執行個體頁面。

  6. 針對要建立的每個新串接副本,重複執行步驟 4 到 6。

gcloud

  1. 在 --master-instance-name 旗標中指定可串接的副本執行個體,建立新的副本:
  2. gcloud sql instances create REPLICA_NAME \
          --master-instance-name=CASCADABLE_REPLICA_NAME \
    更改下列內容:
    • REPLICA_NAME:您要建立的副本專屬 ID
    • CASCADABLE_REPLICA_NAME:可串接副本的名稱
  3. 建立串聯式副本後,您會發現對主要執行個體所做的變更,會複製到串聯式副本鏈中的所有副本。

curl

  1. 如要在可串連副本下建立串連副本,請編輯下列 JSON 程式碼範例,並儲存至名為 request.json 的檔案:
    {
      "masterInstanceName": "CASCADABLE_REPLICA_NAME",
      "project": "PROJECT_ID",
      "name": "REPLICA_NAME",
      "region": "REPLICA_REGION",
      "settings":
        {
          "tier": "MACHINE_TYPE",
        }
    }
  2. 請執行下列指令:
    curl -X POST
    -H "Authorization: Bearer "$(gcloud auth print-access-token)
    -H "Content-Type: application/json; charset=utf-8"
    -d @request.json
    "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances"

疑難排解

問題 疑難排解
唯讀副本建立後未開始複製。 記錄檔中可能會有更具體的錯誤。 在 Cloud Logging 中檢查記錄,找出實際錯誤。
無法建立唯讀副本 - invalidFlagValue 錯誤。 要求中的其中一個標記無效。這可能是您明確提供的旗標,也可能是設為預設值的旗標。

首先,請確認 max_connections 旗標的值大於或等於主要執行個體的值。

如果 max_connections 旗標設定正確,請檢查 Cloud Logging 中的記錄,找出實際錯誤。

無法建立唯讀副本,發生不明錯誤。 記錄檔中可能會有更具體的錯誤。 在 Cloud Logging 中檢查記錄,找出實際錯誤。

如果錯誤為 set Service Networking service account as servicenetworking.serviceAgent role on consumer project,請按照「建立服務代理並授予角色」中的操作說明,手動建立必要的服務帳戶。

磁碟已滿。 建立副本時,主要執行個體磁碟空間可能會用盡。編輯主要執行個體,升級至較大的磁碟。
副本執行個體耗用過多記憶體。 副本會使用暫存記憶體快取經常要求的讀取作業,因此可能比主要執行個體耗用更多記憶體。

重新啟動副本執行個體,回收暫存記憶體空間。

已停止複製。 已達儲存空間上限,且未啟用儲存空間自動增加功能。

編輯執行個體,啟用 automatic storage increase。

複製作業延遲時間持續偏高。 寫入負載過高,副本無法處理。如果副本上的 SQL 執行緒無法跟上 IO 執行緒,就會發生複製作業延遲。某些類型的查詢或工作負載可能會導致特定結構定義暫時或永久出現高複製延遲。複製延遲的常見原因包括:
  • 副本上的慢速查詢。找出並修正問題。
  • DELETE ... WHERE field < 50000000 這類查詢會導致資料列式複製作業發生複製延遲,因為副本上會累積大量更新。

可能的解決方案包括:

  • 編輯執行個體,增加副本大小。
  • 降低資料庫負載。
  • 將讀取流量傳送至唯讀副本。
  • 為資料表建立索引。
  • 找出並修正寫入速度緩慢的查詢。
  • 重新建立副本。
副本建立作業逾時失敗。 如果主要執行個體上有長時間執行的未提交交易,可能會導致唯讀副本建立失敗。

請先停止所有執行中的查詢,再重新建立副本。

後續步驟