本頁說明從外部伺服器複製資料到 Cloud SQL 時,如何設定及使用代管匯入功能。
你必須完成本頁的所有步驟。完成後,您就能以管理任何其他 Cloud SQL 執行個體的方式,管理及監控來源代表執行個體。
事前準備
開始之前,請先完成下列步驟:
更新複製使用者的權限
外部伺服器上的複製使用者已設為接受來自任何主機 (%
) 的連線。請更新這個使用者帳戶,使其只能與 Cloud SQL 副本搭配使用。
所需權限
遷移和傾印的組合共有四種。
- 類型 1:持續遷移和受管理傾印
- 類型 2:持續遷移和手動傾印
- 類型 3:一次性遷移和受管理傾印
- 類型 4:一次性遷移和手動傾印
下表列出各類型遷移作業和啞終端機組合的權限。
類型 1
使用者帳戶必須具備下列權限:
- REPLICATION SLAVE
- 執行
- SELECT
- 顯示檢視畫面
- 複製用戶端
- 重新載入
- 觸發條件
- (僅適用於從 Amazon RDS 和 Amazon Aurora 遷移) LOCK TABLES
如果是 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_UNSPECIFIED 、ONLINE 和 OFFLINE 。 |
SYNC_PARALLEL_LEVEL | 確認控制資料庫資料表資料移轉速度的設定。可用的值如下:
注意:這個參數的預設值是 |
SYNC_FLAGS | 要驗證的初始同步旗標清單。如果您打算從來源複製時使用自訂同步處理標記,才建議使用這項功能。如需允許的旗標清單,請參閱「初始同步旗標」。 |
PROJECT_ID | Google Cloud 專案的 ID。 |
REPLICA_INSTANCE_ID | Cloud SQL 副本的 ID。 |
全域讀取鎖定權限
如果沒有權限存取外部伺服器上的全域讀取鎖定 (例如 Amazon RDS 和 Amazon Aurora),請按照下列步驟暫停寫入伺服器:
- 前往 Logs Explorer,然後從資源清單中選取 Cloud SQL 副本。您應該會看到 Cloud SQL 副本的最新記錄清單。請暫時忽略這些資訊。
- 開啟終端機並輸入「在外部伺服器上啟動複製作業」中的指令,從外部伺服器複製資料。
返回記錄檔探索工具。看到如下所示的記錄時,請停止在外部伺服器上寫入資料庫。在多數情況下,這項作業只需要幾秒鐘。
DUMP_IMPORT(START): Start importing data, please pause any write to the external primary database.
在記錄檔探索工具中看到下列記錄項目時,請重新啟用外部伺服器上的資料庫寫入功能。
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 | 提供可控制資料庫資料表資料移轉速度的設定。可用的值如下:
注意:這個參數的預設值是 |
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 錯誤。 | 要求中的其中一個標記無效。這可能是您明確提供的旗標,也可能是設為預設值的旗標。 首先,請確認 如果 |
無法建立唯讀副本 - 發生不明錯誤。 | 記錄檔中可能會有更具體的錯誤。
檢查 Cloud Logging 中的記錄,找出實際錯誤。 如果錯誤訊息為 |
磁碟空間已滿。 | 建立副本時,主要執行個體的磁碟大小可能會達到上限。 編輯主要執行個體,將其升級為較大的磁碟大小。 |
副本執行個體使用的記憶體過多。 | 副本會使用暫存記憶體快取經常要求的讀取作業,因此使用的記憶體可能比主要執行個體多。 重新啟動副本執行個體,即可回收暫存記憶體空間。 |
複製作業已停止。 | 儲存空間已達上限,且未啟用自動增加儲存空間功能。
編輯執行個體,啟用 |
複製延遲持續偏高。 | 副本的寫入負載過高,如果備用資源上的 SQL 執行緒無法跟上 IO 執行緒,就會發生複製延遲。某些查詢或工作負載可能會導致特定結構定義出現暫時或永久的高複製延遲。複製延遲的常見原因包括:
可能的解決方法包括:
|
複製延遲時間突然大幅增加。 | 這是因為交易執行時間過長所致。當交易 (單一陳述式或多個陳述式) 在來源執行個體上提交時,交易的開始時間會記錄在二進位記錄檔中。副本收到這個 binlog 事件時,會比較該時間戳記與目前的時間戳記,以計算複寫延遲。因此,來源上長時間執行的交易會導致副本立即出現大量複製延遲。如果交易中的資料列變更量很大,副本也會花費很長時間執行。這段時間內,複製延遲會增加。副本完成這項交易後,追趕期會視來源的寫入工作負載和副本的處理速度而定。 如要避免交易時間過長,可以嘗試以下解決方法:
|
變更平行複製旗標會導致錯誤。 | 一或多個標記的值不正確。
在顯示錯誤訊息的主要執行個體上,設定平行複製標記:
|
建立副本時發生逾時錯誤。 | 主要執行個體上未提交的長期交易可能會導致唯讀備用資源建立失敗。 停止所有執行中的查詢後,重新建立副本。 |
此外,如果是 MySQL,也請考慮下列選項:
問題 | 疑難排解 |
---|---|
Lost connection to MySQL server during query when dumping table 。 |
來源可能已無法使用,或傾印包含的封包過大。
確認外部主要伺服器可供連線。 您也可以修改來源執行個體上的 net_read_timeout 和 net_write_timeout 旗標值,停止發生錯誤。如要進一步瞭解這些旗標的允許值,請參閱「設定資料庫旗標」。 如要進一步瞭解如何使用 |
初始資料遷移作業成功,但沒有任何資料複製。 | 其中一個可能的原因是來源資料庫定義了複製標記,導致部分或所有資料庫變更未複製過來。 請確認複製旗標 (例如 在主要執行個體上執行 |
初始資料遷移作業成功,但資料複製作業在一段時間後停止運作。 | 建議做法:
|
mysqld check failed: data disk is full 。 |
備用執行個體的資料磁碟已滿。
增加副本執行個體的磁碟大小。您可以手動增加磁碟大小,也可以啟用儲存空間自動增加功能。 |
查看複寫記錄
驗證複製設定時,系統會產生記錄。
如要查看這些記錄,請按照下列步驟操作:
前往 Google Cloud 控制台的記錄檢視器。
- 從「執行個體」下拉式選單中選取 Cloud SQL 副本。
- 選取
replication-setup.log
記錄檔。
如果 Cloud SQL 備用資源無法連線至外部伺服器,請確認下列事項:
- 外部伺服器上的任何防火牆都已設定為允許來自 Cloud SQL 備用資源傳出 IP 位址的連線。
- 您的 SSL/TLS 設定正確無誤。
- 複製使用者、主機和密碼正確無誤。
後續步驟
- 瞭解如何更新執行個體。
- 瞭解如何管理備用資源。
- 瞭解如何監控執行個體。
- 瞭解如何升級 Cloud SQL 備用資源。