使用代管匯入功能來設定從外部資料庫的複製作業

本頁說明從外部伺服器複製資料到 Cloud SQL 時,如何設定及使用代管匯入功能。

你必須完成本頁的所有步驟。完成後,您就能以管理任何其他 Cloud SQL 執行個體的方式,管理及監控來源代表執行個體。

事前準備

開始之前,請先完成下列步驟:

  1. 設定外部伺服器

  2. 建立來源表示執行個體

  3. 設定 Cloud SQL 備用資源

確認複製設定

設定完成後,請確認 Cloud SQL 備用資源可以從外部伺服器複製資料。

下列外部同步設定必須正確無誤。

  • Cloud SQL 備用執行個體與外部伺服器之間的連線
  • 複製使用者權限
  • 版本相容性
  • Cloud SQL 備用資源尚未開始複製

如要驗證這些設定,請開啟 Cloud Shell 終端機並輸入下列指令:

curl

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "SYNC_MODE",
         "syncParallelLevel": "SYNC_PARALLEL_LEVEL",
         "selectedObjects": "SELECTED_OBJECTS"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE_ID/verifyExternalSyncSettings

範例

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "online",
         "syncParallelLevel": "optimal",
         "selectedObjects":[{"database":"db1"}, {"database":"db2"}]
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/myproject/instances/myreplica/verifyExternalSyncSettings

這些呼叫會傳回 sql#externalSyncSettingErrorList 類型的清單。

如果清單為空白,表示沒有錯誤。沒有錯誤的回應如下所示:

  {
    "kind": "sql#externalSyncSettingErrorList"
  }
屬性 說明
SYNC_MODE 請確保設定複製作業後,Cloud SQL 備用資源和外部伺服器可以保持同步。同步模式包括 EXTERNAL_SYNC_MODE_UNSPECIFIEDONLINEOFFLINE
SYNC_PARALLEL_LEVEL

確認控制資料庫資料表資料移轉速度的設定。可用的值如下:

  • min: 佔用資料庫的運算資源最少。這是轉移資料最慢的速度。
  • optimal: 兼顧效能,並將資料庫負載量維持在最佳狀態。
  • max:提供最快的資料傳輸速度,但可能會增加資料庫的負載。

注意:這個參數的預設值是 optimal,因為這項設定可提供良好的資料傳輸速度,且對資料庫的影響合理。建議您使用這個值。

SELECTED_OBJECTS 以半形逗號分隔的資料庫清單,這些資料庫會從來源代表執行個體遷移至目的地 Cloud SQL 執行個體。如果您未使用這個參數,或提供空白清單做為參數值,系統就會將所有資料庫從來源遷移至目的地。
PROJECT_ID Google Cloud 專案的 ID。
REPLICA_INSTANCE_ID Cloud SQL 副本的 ID。

更新來源表示法執行個體

如要更新要從來源代表執行個體遷移至目的地 Cloud SQL 執行個體的資料庫,請更新與 selectedObjects 參數相關聯的資料庫名稱清單。如果您未使用這個參數,或提供空白清單做為參數值,系統就會將所有資料庫從來源遷移至目的地。

source.json

    {
      "name": "SOURCE_NAME",
      "region": "REGION",
      "databaseVersion": "DATABASE_VERSION",
      "onPremisesConfiguration": {
        "selectedObjects": "SELECTED_OBJECTS",
        "username": "USERNAME",
        "password": "PASSWORD"
      }
    }

範例

// example of source.json for external server that
// - initiates replication from a Cloud SQL managed import
// - doesn't use SSL/TLS

{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "POSTGRES_9_6",
  "onPremisesConfiguration": {
    "selectedObjects":[{"database":"db1"}, {"database":"db3"}],
    "username": "newReplicationUser",
    "password": "525#@%*@"
  }
}
屬性 說明
SOURCE_NAME 來源表示法執行個體的名稱。
REGION 來源表示法執行個體所在的區域
DATABASE_VERSION 外部伺服器上執行的資料庫版本。選項包括 POSTGRES_9_6POSTGRES_10POSTGRES_11POSTGRES_12POSTGRES_13POSTGRES_14POSTGRES_15POSTGRES_16POSTGRES_17
SELECTED_OBJECTS 以半形逗號分隔的資料庫清單 (已更新),這些資料庫會從來源代表執行個體遷移至目的地 Cloud SQL 執行個體。
USERNAME 外部伺服器上的複製使用者帳戶。
PASSWORD 帳戶密碼。

接著,如要在 Cloud SQL 中修改來源代表執行個體,請開啟 Cloud Shell 終端機並輸入下列指令:

curl

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @JSON_PATH \
     -X PATCH \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/SOURCE_NAME

範例

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @./source.json \
     -X PATCH \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/cloudsql-source-instance
屬性 說明
JSON_PATH 包含外部伺服器要求資料的 JSON 檔案路徑。
PROJECT_ID Google Cloud 專案的 ID。
SOURCE_NAME 來源表示法執行個體的名稱。

在外部伺服器上啟動複製作業

確認可以從外部伺服器複製資料後,請開始複製作業。初始匯入程序執行複製作業的速度最高可達每小時 500 GB。不過,實際速度會因機器層級、資料磁碟大小、網路輸送量和資料庫性質而異。

curl

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "SYNC_MODE",
         "skipVerification": "SKIP_VERIFICATION",
         "syncParallelLevel": "SYNC_PARALLEL_LEVEL"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE_ID/startExternalSync

範例

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "online",
         "syncParallelLevel": "optimal"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/startExternalSync
屬性 說明
SYNC_MODE 確認設定複製作業後,Cloud SQL 備用資源和外部伺服器可以保持同步。
SKIP_VERIFICATION 是否要在同步處理資料前略過內建驗證步驟。只有在驗證複製設定後,才建議使用這個參數。
SYNC_PARALLEL_LEVEL

提供可控制資料庫資料表資料移轉速度的設定。可用的值如下:

  • min: 佔用資料庫的運算資源最少。這是轉移資料最慢的速度。
  • optimal: 兼顧效能,並將資料庫負載量維持在最佳狀態。
  • max:提供最快的資料傳輸速度,但可能會增加資料庫的負載。

注意:這個參數的預設值是 optimal,因為這項設定可提供良好的資料傳輸速度,且對資料庫的影響合理。建議您使用這個值。

PROJECT_ID Google Cloud 專案的 ID。
REPLICA_INSTANCE_ID Cloud SQL 副本的 ID。

監控遷移作業

從外部伺服器啟動複製作業後,您需要監控複製作業。詳情請參閱「監控複製作業」。然後完成遷移作業。

疑難排解

請考慮採用下列疑難排解選項:

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

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

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

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

如果錯誤訊息為 set Service Networking service account as servicenetworking.serviceAgent role on consumer project,請停用並重新啟用 Service Networking API。這項動作會建立必要的服務帳戶,以便繼續進行程序。

磁碟空間已滿。 建立副本時,主要執行個體的磁碟大小可能會達到上限。 編輯主要執行個體,將其升級為較大的磁碟大小。
磁碟空間大幅增加。 如果某個時段未主動用於追蹤資料,PostgreSQL 會無限期保留 WAL 區隔,導致磁碟空間無限擴充。如果您在 Cloud SQL 中使用邏輯複製和解碼功能,系統會自動建立及捨棄複製時段。如要偵測未使用的複寫位置,請查詢 pg_replication_slots 系統檢視畫面,並依 active 欄篩選。未使用過的時段可以捨棄,使用 pg_drop_replication_slot 指令移除 WAL 區段。
副本執行個體使用的記憶體過多。 副本會使用暫存記憶體快取經常要求的讀取作業,因此使用的記憶體可能比主要執行個體多。

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

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

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

複製延遲持續偏高。 副本的寫入負載過高,如果備用資源上的 SQL 執行緒無法跟上 IO 執行緒,就會發生複製延遲。某些查詢或工作負載可能會導致特定結構定義出現暫時或永久的高複製延遲。複製延遲的常見原因包括:
  • 副本上的查詢速度緩慢。找出並修正這些問題。
  • 所有資料表都必須有不重複/主索引鍵。如果資料表沒有唯一/主鍵,每次更新都會導致副本完整掃描資料表。
  • 如果使用以列為基礎的複寫功能,DELETE ... WHERE field < 50000000 這類查詢會造成複寫延遲,因為複本上會累積大量更新。

可能的解決方法包括:

  • 編輯執行個體,增加副本大小。
  • 降低資料庫負載。
  • 將讀取流量傳送至唯讀副本。
  • 將資料表編入索引。
  • 找出並修正寫入查詢速度緩慢的問題。
  • 重新建立副本。
在 PostgreSQL 9.6 中重建索引時發生錯誤。 您會收到 PostgreSQL 的錯誤訊息,指出需要重建特定索引。這項操作只能在主要執行個體上進行。如果您建立新的副本執行個體,很快就會再次發生相同錯誤。在 PostgreSQL 10 以下版本中,雜湊索引不會傳播至副本

如果必須使用雜湊索引,請升級至 PostgreSQL 10 以上版本。否則,如果您也想使用副本,請勿在 PostgreSQL 9.6 中使用雜湊索引。

主要執行個體上的查詢一律會執行。 建立副本後,查詢 SELECT * from pg_stat_activity where state = 'active' and pid = XXXX and username = 'cloudsqlreplica' 應會在主要執行個體上持續執行。
建立副本時發生逾時錯誤。 主要執行個體上未提交的長期交易可能會導致唯讀備用資源建立失敗。

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

如果主要執行個體和副本的 vCPU 大小不同,查詢最佳化工具會將 vCPU 大小納入考量,因此可能會發生查詢效能問題。

如要解決這個問題,請完成下列步驟:

  1. 開啟 log_duration 旗標,並將 log_statement 參數設為 ddl。這可讓您瞭解資料庫的查詢和執行時間。不過,視工作負載而定,這可能會導致效能問題。
  2. 在主要執行個體和唯讀備用資源上,針對查詢執行 explain analyze
  3. 比較查詢計畫並檢查差異。

如果是特定查詢,請修改查詢。舉例來說,您可以變更聯結的順序,看看是否能提升效能。

查看複寫記錄

驗證複製設定時,系統會產生記錄。

如要查看這些記錄,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的記錄檢視器。

    前往記錄檢視器

  2. 從「執行個體」下拉式選單中選取 Cloud SQL 副本。
  3. 選取 replication-setup.log 記錄檔。

如果 Cloud SQL 備用資源無法連線至外部伺服器,請確認下列事項:

  • 外部伺服器上的任何防火牆都已設定為允許來自 Cloud SQL 備用資源傳出 IP 位址的連線。
  • 您的 SSL/TLS 設定正確無誤。
  • 複製使用者、主機和密碼正確無誤。

後續步驟