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

本頁面說明如何設定及使用資料的受控匯入功能,以便從外部伺服器複製至 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 bucket,則會啟用 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

使用同步處理標記的示例

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. 返回「Logs Explorer」(記錄檔探索工具)。當您看到以下記錄時,請停止寫入外部伺服器上的資料庫。在大多數情況下,這項操作只需要幾秒鐘的時間。

       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

同步處理標記示例

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 執行緒無法跟上 I/O 執行緒時,就會發生複製延遲。某些類型的查詢或工作負載,可能會導致特定結構定義的複製延遲時間暫時或永久性偏高。複製延遲的常見原因包括:
  • 複本上的查詢速度緩慢。找出並修正這些問題。
  • 所有資料表都必須有專屬/主索引鍵。在這種沒有唯一/主鍵的資料表上進行的每項更新,都會導致備援資料庫進行完整資料表掃描。
  • DELETE ... WHERE field < 50000000 這類查詢會導致以列為基礎的複製作業出現延遲,因為複本上會累積大量更新。

可能的解決方法包括:

複製延遲時間突然飆升。 這是因為長時間執行的交易。當交易 (單一陳述式或多個陳述式) 在來源執行個體上進行修訂時,系統會在二進位記錄中記錄交易的開始時間。當副本收到此 binlog 事件時,會將該時間戳記與目前的時間戳記進行比較,以計算複製延遲時間。因此,來源上長時間執行的交易會導致備援資料上立即出現大量複製延遲。如果交易中的資料列變更數量龐大,複本執行交易的時間也會很長。在這段期間,複製延遲時間會增加。副本完成這筆交易後,追趕期間將取決於來源的寫入工作負載和副本的處理速度。

為避免交易時間過長,可採用以下解決方案:

  • 將交易拆分為多筆小額交易
  • 將單一大型寫入查詢分割為較小的批次
  • 請嘗試將長時間執行的 SELECT 查詢與混合 DML 的交易分開
變更並行複製旗標會導致錯誤。 為一或多個標記設定了錯誤的值。

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

  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.err log 檔案的 Cloud Logging 中,找到 MySQL IO 執行緒或 SQL 執行緒的錯誤。
  • 連線到複本執行個體時,也會發生這個錯誤。 執行 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 控制台的「Logs Viewer」(記錄檢視器)。

    前往「記錄檢視器」

  2. 從「Instance」下拉式選單中選取 Cloud SQL 備用資源。
  3. 選取 replication-setup.log 記錄檔案。

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

  • 外部伺服器上的任何防火牆都會設定為允許 Cloud SQL 備援資源的傳出 IP 位址連線。
  • 安全資料傳輸層 (SSL)/傳輸層安全標準 (TLS) 設定正確無誤。
  • 複寫使用者、主機和密碼皆正確無誤。

後續步驟