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

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

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

事前準備

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

  1. 設定外部伺服器

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

  3. 設定 Cloud SQL 備用資源

更新複製使用者的權限

外部伺服器上的複製使用者已設為接受來自任何主機 (%) 的連線。請更新這個使用者帳戶,使其只能與 Cloud SQL 副本搭配使用。

所需權限

遷移和傾印的組合共有四種。

  • 類型 1:持續遷移和受管理傾印
  • 類型 2:持續遷移和手動傾印
  • 類型 3:一次性遷移和受管理傾印
  • 類型 4:一次性遷移和手動傾印

下表列出各類型遷移作業和啞終端機組合的權限。

類型 1

使用者帳戶必須具備下列權限:

如果是 MySQL 8.0 以上版本,建議略過 BACKUP ADMIN 權限,以獲得最佳效能。

類型 2

使用者帳戶必須具備下列權限:

第 3 類

使用者帳戶必須具備下列權限:

如果是 MySQL 8.0 以上版本,建議略過 BACKUP ADMIN 權限,以獲得最佳效能。

類型 4

不需要任何權限。

更新權限

如要更新權限,請開啟外部伺服器上的終端機,然後輸入下列指令。

mysql 用戶端

對於 GTID:

    UPDATE mysql.user
      SET Host='NEW_HOST'
      WHERE Host='OLD_HOST'
      AND User='USERNAME';
    GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW, REPLICATION_CLIENT,
    RELOAD ON . TO
    'USERNAME'@'HOST';
    FLUSH PRIVILEGES;

如為 binlog:

    UPDATE mysql.user
    SET Host='NEW_HOST'
    WHERE Host='OLD_HOST'
    AND User='USERNAME';
    GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW, REPLICATION CLIENT,
    RELOAD ON . TO 'GCP_USERNAME'@'HOST';
    FLUSH PRIVILEGES;

範例

UPDATE mysql.user
  SET Host='192.0.2.0'
  WHERE Host='%'
  AND User='replicationUser';
GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW, REPLICATION CLIENT,
RELOAD ON *.* TO 'username'@'host.com';
FLUSH PRIVILEGES;
屬性 說明
NEW_HOST 指定 Cloud SQL 備用資源的輸出 IP
OLD_HOST 您要變更的 Host 目前值。
USERNAME 外部伺服器上的複製使用者帳戶。
GCP_USERNAME 使用者帳戶的使用者名稱。
HOST 使用者帳戶的主機名稱。

確認複製設定

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

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

  • Cloud SQL 備用執行個體與外部伺服器之間的連線
  • 複製使用者權限
  • 版本相容性
  • Cloud SQL 備用資源尚未開始複製
  • 外部伺服器已啟用二進位記錄檔
  • 如果您嘗試從 RDS 外部伺服器進行外部同步,並使用 Google Cloud 儲存空間,系統就會啟用 GTID

如要驗證這些設定,請開啟 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",
         "mysqlSyncConfig": {
           "initialSyncFlags": "SYNC_FLAGS"
         }
       }' \
     -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"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/myproject/instances/myreplica/verifyExternalSyncSettings

example w/ sync flags

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"
         "mysqlSyncConfig": {
             "initialSyncFlags": [{"name": "max-allowed-packet", "value": "1073741824"}, {"name": "hex-blob"}, {"name": "compress"}]
             }
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/verifyExternalSyncSettings

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

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

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

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

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

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

SYNC_FLAGS 要驗證的初始同步旗標清單。如果您打算從來源複製時使用自訂同步處理標記,才建議使用這項功能。如需允許的旗標清單,請參閱「初始同步旗標」。
PROJECT_ID Google Cloud 專案的 ID。
REPLICA_INSTANCE_ID Cloud SQL 副本的 ID。

全域讀取鎖定權限

如果沒有權限存取外部伺服器上的全域讀取鎖定 (例如 Amazon RDS 和 Amazon Aurora),請按照下列步驟暫停寫入伺服器:

  1. 前往 Logs Explorer,然後從資源清單中選取 Cloud SQL 副本。您應該會看到 Cloud SQL 副本的最新記錄清單。請暫時忽略這些資訊。
  2. 開啟終端機並輸入「在外部伺服器上啟動複製作業」中的指令,從外部伺服器複製資料。
  3. 返回記錄檔探索工具。看到如下所示的記錄時,請停止在外部伺服器上寫入資料庫。在多數情況下,這項作業只需要幾秒鐘。

       DUMP_IMPORT(START): Start importing data, please pause any write to the
       external primary database.
    
  4. 在記錄檔探索工具中看到下列記錄項目時,請重新啟用外部伺服器上的資料庫寫入功能。

       DUMP_IMPORT(SYNC): Consistent state on primary and replica. Writes to the
       external primary may resume.
    
    

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

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

在初始匯入程序期間,請勿對外部伺服器執行任何 DDL 作業。否則匯入時可能會發生不一致的情況。匯入程序完成後,備用資源會使用外部伺服器上的二進位檔記錄,讓自己的狀態能與外部伺服器的狀態一致。

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",
         "mysqlSyncConfig": {
           "initialSyncFlags": "SYNC_FLAGS"
         }
       }' \
     -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

example w/ sync flags

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"
         "skipVerification": false,
         "mysqlSyncConfig": {
             "initialSyncFlags": [{"name": "max-allowed-packet", "value": "1073741824"}, {"name": "hex-blob"}, {"name": "compress"}]
             }
       }' \
     -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,因為這項設定可提供良好的資料傳輸速度,且對資料庫的影響合理。建議您使用這個值。

SYNC_FLAGS 要驗證的初始同步旗標清單。如果您打算從來源複製時使用自訂同步處理標記,才建議使用這項功能。如需允許的旗標清單,請參閱「初始同步旗標」。
PROJECT_ID Google Cloud 專案的 ID。
REPLICA_INSTANCE_ID Cloud SQL 副本的 ID。

初始同步旗標

如要使用自訂資料庫標記遷移資料,可以使用下列允許的標記:

  • --add-drop-database
  • --add-drop-table
  • --add-drop-trigger
  • --add-locks
  • --allow-keywords
  • --all-tablespaces
  • --apply-slave-statements
  • --column-statistics
  • --comments
  • --compact
  • --compatible
  • --complete-insert
  • --compress
  • --compression-algorithms
  • --create-options
  • --default-character-set
  • --delayed-insert
  • --disable-keys
  • --dump-date
  • --events
  • --extended-insert
  • --fields-enclosed-by
  • --fields-escaped-by
  • --fields-optionally-enclosed-by
  • --fields-terminated-by
  • --flush-logs
  • --flush-privileges
  • --force
  • --get-server-public-key
  • --hex-blob
  • --ignore-error
  • --ignore-read-lock-error
  • --ignore-table
  • --insert-ignore
  • --lines-terminated-by
  • --lock-all-tables
  • --lock-tables
  • --max-allowed-packet
  • --net-buffer-length
  • --network-timeout
  • --no-autocommit
  • --no-create-db
  • --no-create-info
  • --no-data
  • --no-defaults
  • --no-set-names
  • --no-tablespaces
  • --opt
  • --order-by-primary
  • --pipe
  • --quote-names
  • --quick
  • --replace
  • --routines
  • --secure-auth
  • --set-charset
  • --shared-memory-base-name
  • --show-create-skip-secondary-engine
  • --skip-opt
  • --ssl-cipher
  • --ssl-fips-mode
  • --ssl-verify-server-cert
  • --tls-ciphersuites
  • --tls-version
  • --triggers
  • --tz-utc
  • --verbose
  • --xml
  • --zstd-compression-level

如要瞭解允許的值,請參閱 MySQL 公開文件

監控遷移作業

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

疑難排解

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

問題 疑難排解
建立唯讀副本時,系統未開始複製作業。 記錄檔中可能會有更具體的錯誤。 檢查 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。這項動作會建立必要的服務帳戶,以便繼續進行程序。

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

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

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

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

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

可能的解決方法包括:

複製延遲時間突然大幅增加。 這是因為交易執行時間過長所致。當交易 (單一陳述式或多個陳述式) 在來源執行個體上提交時,交易的開始時間會記錄在二進位記錄檔中。副本收到這個 binlog 事件時,會比較該時間戳記與目前的時間戳記,以計算複寫延遲。因此,來源上長時間執行的交易會導致副本立即出現大量複製延遲。如果交易中的資料列變更量很大,副本也會花費很長時間執行。這段時間內,複製延遲會增加。副本完成這項交易後,追趕期會視來源的寫入工作負載和副本的處理速度而定。

如要避免交易時間過長,可以嘗試以下解決方法:

  • 將交易拆分成多筆小額交易
  • 將單一大型寫入查詢分成較小的批次
  • 嘗試將包含 DML 的交易中冗長的 SELECT 查詢分開
變更平行複製旗標會導致錯誤。 一或多個標記的值不正確。

在顯示錯誤訊息的主要執行個體上,設定平行複製標記:

  1. 修改 binlog_transaction_dependency_trackingtransaction_write_set_extraction 標記:
    • binlog_transaction_dependency_tracking=COMMIT_ORDER
    • transaction_write_set_extraction=OFF
  2. 新增 slave_pending_jobs_size_max 旗標:

    slave_pending_jobs_size_max=33554432

  3. 修改 transaction_write_set_extraction 旗標:

    transaction_write_set_extraction=XXHASH64

  4. 修改 binlog_transaction_dependency_tracking 旗標:

    binlog_transaction_dependency_tracking=WRITESET

建立副本時發生逾時錯誤。 主要執行個體上未提交的長期交易可能會導致唯讀備用資源建立失敗。

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

此外,如果是 MySQL,也請考慮下列選項:

問題 疑難排解
Lost connection to MySQL server during query when dumping table 來源可能已無法使用,或傾印包含的封包過大。

確認外部主要伺服器可供連線。 您也可以修改來源執行個體上的 net_read_timeoutnet_write_timeout 旗標值,停止發生錯誤。如要進一步瞭解這些旗標的允許值,請參閱「設定資料庫旗標」。

如要進一步瞭解如何使用 mysqldump 標記進行受管理匯入遷移作業,請參閱「 允許和預設的初始同步標記」。

初始資料遷移作業成功,但沒有任何資料複製。 其中一個可能的原因是來源資料庫定義了複製標記,導致部分或所有資料庫變更未複製過來。

請確認複製旗標 (例如 binlog-do-dbbinlog-ignore-dbreplicate-do-dbreplicate-ignore-db) 未以衝突的方式設定。

在主要執行個體上執行 show master status 指令,即可查看目前的設定。

初始資料遷移作業成功,但資料複製作業在一段時間後停止運作。 建議做法:

  • 在 Google Cloud 控制台的 Cloud Monitoring 專區中,查看副本執行個體的 複寫指標
  • MySQL IO 執行緒或 SQL 執行緒的錯誤會顯示在 Cloud Loggingmysql.err log 檔案中。
  • 連線至副本執行個體時,也可能會發現這個錯誤。 執行 SHOW SLAVE STATUS 指令,並檢查輸出內容中是否有下列欄位:
    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error
mysqld check failed: data disk is full 備用執行個體的資料磁碟已滿。

增加副本執行個體的磁碟大小。您可以手動增加磁碟大小,也可以啟用儲存空間自動增加功能。

查看複寫記錄

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

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

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

    前往記錄檢視器

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

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

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

後續步驟