本頁面說明在您從外部伺服器建立傾印檔案時,設定複製作業的程序。
請務必完成本頁所有步驟。完成後,您可以以與其他 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 Platform (GCP) 使用者帳戶的使用者名稱。 |
HOST | Google Cloud Platform (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 值區
您可以使用位於 Cloud Storage 值區中的 mysqldump
檔案,填入 Cloud SQL 複本。適用條件如下:
- 您必須使用 MySQL 隨附的
mysqldump
公用程式。 mysqldump
執行時,請勿在外部伺服器上執行任何 DDL 作業。否則可能會導致匯出檔案中有資料不一致的情況發生。
如要將資料庫匯出至 Cloud Storage 值區,請按照下列步驟操作:
- 在 Google Cloud中建立 Cloud Storage 值區。
- 使用可連線至外部資料庫伺服器的用戶端開啟終端機,然後執行下列指令。
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 | 如果您使用的是 8.0.26 以外的舊版 MySQL,請使用 --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 | 系統會在值區中建立這個名稱的檔案。這個檔案包含外部伺服器上資料庫的內容。 |
使用 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 控制台的「Logs Viewer」(記錄檢視器)。
- 從「Instance」下拉式選單中選取 Cloud SQL 備用資源。
- 選取
replication-setup.log
記錄檔案。
如果 Cloud SQL 備用資源無法連線至外部伺服器,請確認下列事項:
- 外部伺服器上的任何防火牆都會設定為允許 Cloud SQL 備援資源的傳出 IP 位址連線。
- 安全資料傳輸層 (SSL)/傳輸層安全標準 (TLS) 設定正確無誤。
- 複寫使用者、主機和密碼皆正確無誤。
後續步驟
- 瞭解如何更新執行個體。
- 瞭解如何管理備用資源。
- 瞭解如何監控執行個體。
- 瞭解如何升級 Cloud SQL 備用資源,將備用資源升級為獨立執行個體,並停止從外部伺服器複製資料。