本頁說明如何設定複寫功能,前提是您有從外部伺服器建立的傾印檔。
你必須完成本頁的所有步驟。完成後,您就能以管理其他 Cloud SQL 執行個體的方式,管理及監控來源代表執行個體。
事前準備
開始前,您應已設定外部伺服器、建立來源代表執行個體,並設定 Cloud SQL 備用資源。
更新複製使用者的權限
外部伺服器上的複製使用者已設為接受來自任何主機 (%
) 的連線。您應更新這個使用者帳戶,確保只能搭配 Cloud SQL 副本使用。在外部伺服器上開啟終端機,然後輸入下列指令:
mysql 用戶端
UPDATE mysql.user SET Host='NEW_HOST' WHERE Host='OLD_HOST' AND User='USERNAME'; GRANT REPLICATION SLAVE, EXECUTE 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 ON *.* TO 'gcp_user'@'gmail.com'; FLUSH PRIVILEGES;
屬性 | 說明 |
---|---|
NEW_HOST | 指定 Cloud SQL 備用資源的輸出 IP。 |
OLD_HOST | 您要變更的 Host 目前值。 |
USERNAME | 外部伺服器上的複製使用者帳戶。 |
GCP_USERNAME | Google Cloud 平台 (GCP) 使用者帳戶的使用者名稱。 |
HOST | Google Cloud 平台 (GCP) 使用者帳戶的主機名稱。 |
確認複製設定
設定完成後,請確認 Cloud SQL 備用資源可以從外部伺服器複製資料。
首先,請確認外部同步設定正確無誤。如要執行這項操作,請使用下列指令進行驗證:
- Cloud SQL 備用執行個體與外部伺服器之間的連線
- 複製使用者權限
- 版本相容性
- Cloud SQL 備用資源尚未開始複製
- 外部伺服器已啟用二進位記錄檔
- 已啟用全域交易 ID (GTID)
開啟終端機並輸入下列指令,確認外部同步設定正確無誤:
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"
}' \
-X POST \
https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE/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",
}' \
-X POST \
https://sqladmin.googleapis.com/sql/v1beta4/projects/myproject/instances/myreplica/verifyExternalSyncSettings
屬性 | 說明 |
---|---|
SYNC_MODE | verifyExternalSyncSettings 驗證您是否能在設定複製作業後,讓 Cloud SQL 備用資源和外部伺服器保持同步。同步模式包括 EXTERNAL_SYNC_MODE_UNSPECIFIED 、ONLINE 和 OFFLINE 。 |
SKIP_VERIFICATION | 是否要在同步處理資料前略過內建驗證步驟。只有在您已驗證複製設定時,才建議使用這項功能。 |
PROJECT_ID | Google Cloud中的專案 ID。 |
REPLICA_INSTANCE | Cloud SQL 副本的 ID。 |
將資料庫匯出至 Cloud Storage bucket
您可以透過 Cloud Storage bucket 中的 mysqldump
檔案,填入 Cloud SQL 副本。申請條件如下:
- 您必須使用 MySQL 隨附的
mysqldump
公用程式。 mysqldump
執行時,請勿在外部伺服器上執行任何 DDL 作業。否則可能會導致匯出檔案中有資料不一致的情況發生。
如要將資料庫匯出至 Cloud Storage bucket,請按照下列步驟操作:
- 在 Google Cloud中建立 Cloud Storage bucket。
- 使用連線至外部資料庫伺服器的用戶端開啟終端機,然後執行下列指令。
mysqldump
mysqldump \ --host=EXTERNAL_HOST \ --port=EXTERNAL_PORT \ --user=USERNAME\ --password=PASSWORD \ --databases=DATABASE_LIST \ --hex-blob \ SOURCE_DATA \ --no-autocommit \ --default-character-set=utf8mb4 \ --single-transaction \ --set-gtid-purged=on \ ADD_DROP_TABLE \ ROUTINES \ COMPRESS \ GZIP \ | gcloud storage cp - gs://BUCKET/DUMP_FILENAME
範例
mysqldump \ --host=192.0.2.1 \ --port=3306 \ --user=replicationUser \ --password \ --databases guestbook journal \ --hex-blob \ --master-data=1 \ --no-autocommit \ --default-character-set=utf8mb4 \ --single-transaction \ --compress \ | gzip \ | gcloud storage cp - gs://replica-bucket/external-database.sql.gz
屬性 | 說明 |
---|---|
EXTERNAL_HOST | 外部伺服器的 IPv4 或 DNS 位址。 |
EXTERNAL_PORT | 外部伺服器的連接埠。
如果外部伺服器是託管在 Cloud SQL 上,則為 3306 。 |
USERNAME | 外部伺服器上具有資料庫讀取權限的複製使用者帳戶或使用者帳戶名稱。 |
PASSWORD | 複寫使用者密碼。 |
DATABASE_LIST | 外部伺服器上所有資料庫的清單 (以空格分隔),系統資料庫 (sys 、mysql 、performance_schema 和 information_schema ) 除外。請使用 SHOW DATABASES MySQL 指令列出資料庫。 |
SOURCE_DATA | 如果您使用的 MySQL 版本早於 8.0.26,請使用 --master-data 做為這個參數的值。如果是 MySQL 8.0.26 以上版本,請將這個參數的值設為 --source-data 。 |
ADD_DROP_TABLE | 如要在每個 CREATE TABLE 陳述式前新增 DROP TABLE 陳述式,請加入 --add-drop-table 。 |
ROUTINES | 如要在傾印資料庫的輸出內容中顯示預存常式 (例如程序和函式),請加入 --routines 。 |
COMPRESS | 如要壓縮 Cloud SQL 副本和外部伺服器之間傳送的所有資訊,請使用 --compress 。 |
GZIP | 如要進一步壓縮傾印檔案,請使用 | gzip 。如果資料庫包含未妥善壓縮的資料,例如無法壓縮的二進位資料或 JPG 圖片,請勿使用這項功能。 |
BUCKET | 您在步驟 1 建立的值區名稱,用於存放傾印檔案。 |
DUMP_FILENAME | 系統會在 bucket 中建立這個名稱的檔案。 這個檔案包含外部伺服器上的資料庫內容。 |
使用 Cloud Storage 值區的檔案路徑更新來源表示法執行個體
來源代表執行個體是 Cloud SQL 執行個體,代表 Cloud SQL 備用資源的來源資料庫伺服器。這類執行個體會顯示在 Google Cloud 控制台中,外觀與一般 Cloud SQL 執行個體相同,但其中不含任何資料,也不需要設定或維護,且不會影響帳單。
source.json
檔案包含來源表示例項的相關資訊。
REST
{ "name": "PRIMARY_INSTANCE_NAME", "region": "REGION_NAME", "databaseVersion": "DB_NAME_AND_VERSION", "onPremisesConfiguration": { "hostPort": "IP_ADDRESS_AND_PORT", "username": "USERNAME", "password": "PASSWORD" }, "dumpFilePath" :"DUMP_FILE_PATH" }
範例
{ "name": "cloudsql-source-instance", "region": "us-central1", "databaseVersion": "MYSQL_5_7", "onPremisesConfiguration": { "hostPort": "192.0.2.0:3306", "username": "replicationUser", "password": "486#@%*@" }, "dumpFilePath" :"gs://replica-bucket/source-database.sql.gz" }
屬性 | 說明 |
---|---|
PRIMARY_INSTANCE_NAME | 與來源表示執行個體相關聯的 Cloud SQL 執行個體名稱。 |
REGION_NAME | 指派給來源代表執行個體的區域名稱。 |
DB_NAME_AND_VERSION | 與來源表示法執行個體相關聯的資料庫名稱和版本號碼。 |
IP_ADDRESS_AND_PORT | 為來源代表執行個體保留的 IP 位址和通訊埠號碼。 |
USERNAME | 來源表示法執行個體的使用者名稱。 |
PASSWORD | 來源表示執行個體的密碼。 |
DUMP_FILE_PATH | 傾印檔案的路徑,其中包含外部伺服器上資料庫的內容。 |
設定 Cloud SQL 備用資源後,您需要使用 Cloud Storage 值區的檔案路徑更新來源代表執行個體。
REST
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_REPRESENTATION_INSTANCE
範例
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 | 儲存在 Cloud Storage 值區中的 JSON 檔案路徑。
這個檔案包含來源表示例項的資料。 |
PROJECT_ID | Google Cloud中的專案 ID。 |
SOURCE_REPRESENTATION_INSTANCE | 來源代表執行個體的名稱。 |
在外部伺服器上啟動複製作業
確認可以從外部伺服器複製資料後,即可執行複製作業。
在初始匯入程序期間,請勿對外部伺服器執行任何 DDL 作業。否則匯入時可能會發生不一致的情況。匯入程序完成後,備用資源會使用外部伺服器上的二進位檔記錄,讓自己的狀態能與外部伺服器的狀態一致。
開啟終端機,使用 gcloud
登入,然後輸入 curl
指令,從外部伺服器複製資料。
REST
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" }' \ -X POST \ https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/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", "skipVerification": false }' \ -X POST \ https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/startExternalSync
屬性 | 說明 |
---|---|
SYNC_MODE | 確認設定複製後,Cloud SQL 副本和外部伺服器是否能保持同步。 |
SKIP_VERIFICATION | 是否要在同步處理資料前略過內建驗證步驟。只有在您已驗證複製設定時,才建議使用這項功能。 |
PROJECT_ID | Google Cloud中的專案 ID。 |
REPLICA_INSTANCE | Cloud SQL 副本的 ID。 |
清理儲存空間
如果從 bucket 中的檔案複製,可以移除這個檔案和 bucket。如要瞭解如何刪除物件和值區,請參閱 Cloud Storage 說明文件中的刪除物件和刪除值區。
繼續複製
從外部伺服器啟動複製作業後,您需要監控複製作業,然後完成遷移作業。詳情請參閱「監控複製作業」。
疑難排解
問題 | 疑難排解 |
---|---|
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 備用資源,以將備用資源升級為獨立執行個體,並停止從外部伺服器複製。