本頁面說明如何建立設定,將資料從來源資料庫伺服器複製到 MySQL 副本。
來源資料庫伺服器可以是符合所有伺服器必要條件的任何 MySQL 伺服器,包括 Cloud SQL 執行個體。在其他雲端服務業者託管的執行個體,只要符合必要條件 (包括支援 GTID),也可做為資料來源。
相關設定的詳細說明,請參閱從外部伺服器複製資料的相關說明。
事前準備
在您設定從外部伺服器複製資料之前,必須先完成以下步驟:
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin API.
- 安裝並驗證 gcloud CLI。
- 確認伺服器符合來源資料庫伺服器的需求。
- 判斷主要執行個體與副本之間的連線需要哪種安全等級,並取得必要的憑證檔案。
- 決定要使用哪個Google Cloud 地區來存放 Cloud SQL 副本。
-
組合來源資料庫伺服器相關必要資訊:
外部 IPv4 位址和通訊埠編號
MySQL 預設使用通訊埠 3306。
- MySQL 複製使用者帳戶和密碼
- MySQL 版本號碼
- 所有必要 SSL/TLS 憑證和金鑰的位置,視您選取的安全性層級而定
準備好為來源資料庫伺服器更新網路防火牆,以接受 Cloud SQL 備用資源的連線。
這項步驟必須在建立備用資源後的 30 分鐘內完成。
-
如果您不是專案擁有者,則必須具備
Storage Admin
角色。
來源資料庫伺服器的必要條件
從外部伺服器複製到 Cloud SQL 副本之前,請確認來源資料庫伺服器符合下列設定需求:
執行 MySQL Community Edition 版本 5.6 或 5.7。
已啟用二進位檔記錄。 瞭解詳情。
二進位檔記錄長時間保留,足以讓備用資源能完成匯入。
一般而言,一週就足夠。 進一步瞭解設定二進位檔記錄的保留政策。
使用以列為單位的二進位記錄。 瞭解詳情。
GTID 已啟用,且強制確保 GTID 的一致性。
進一步瞭解 GTID。 查看強制執行 GTID 一致性的選項。
所有資料表 (系統資料庫中的資料表除外) 均使用 InnoDB 儲存引擎。
MySQL 使用者帳戶具有
REPLICATION_SLAVE
權限。請將這個帳戶設為接受從任何位置建立的連線 (host =
%
)。您可以在後續步驟中設定只有該名使用者具備存取權。請勿將這個使用者帳戶用於複製以外的任何用途。外部可存取的 IPv4 位址和 TCP 通訊埠。
設定程序
如要設定從外部資料庫伺服器複製,請執行下列步驟:
1. 為您的資料建立 Cloud Storage 值區
建立在匯出程序中暫時保留資料的值區,或使用現有值區。
如要進一步瞭解如何建立值區,請參閱建立儲存空間值區一文。如要進一步瞭解 Storage Admin 角色,請參閱 Cloud Storage IAM 角色。
2. 將資料匯出至 Cloud Storage
備用資源會在 Cloud Storage 中尋找自己的資料,因此請將伺服器資料的複本放在這裡。您可以在匯出後繼續接受對伺服器的寫入作業。備用資源在匯入傾印檔案之後,就會開始處理匯出之後的所有變更,最後會讓自己的資料與主要執行個體的資料一致。
請在已安裝 gcloud CLI,且能夠連線至您 MySQL 伺服器的機器上,執行下列指令:
mysqldump \
-h [PRIMARY_INSTANCE_IP] -P [PRIMARY_INSTANCE_PORT] -u [USERNAME] -p \
--databases [DBS] \
--hex-blob --skip-triggers --master-data=1 \
--order-by-primary --no-autocommit \
--default-character-set=utf8mb4 \
--single-transaction --set-gtid-purged=on | gzip | \
gcloud storage cp - gs://[BUCKET]/[PATH_TO_DUMP]
If the source of the migration is a Relational Database Service (RDS) for MySQL,
the master-data flag is not supported and should not be specified.
This command might look like the following example:
mysqldump \
-h [PRIMARY_INSTANCE_IP] -P [PRIMARY_INSTANCE_PORT] -u [USERNAME] -p \
--databases [DBS] \
--hex-blob --skip-triggers \
--order-by-primary --no-autocommit \
--default-character-set=utf8mb4 \
--single-transaction --set-gtid-purged=on | gzip | \
gcloud storage cp - gs://[BUCKET]/[PATH_TO_DUMP]
Additionally, you should configure RDS instances to retain binlogs for a
a longer period of time.
This command might look like the following example:
// Sets the retention period to one day.
call mysql.rds_set_configuration('binlog retention hours', 24);
將 [PROPERTIES_IN_BRACKETS]
替換成下列值:
屬性 | 值 |
---|---|
[PRIMARY_INSTANCE_IP] |
來源資料庫伺服器的 IPv4 位址。 |
[PRIMARY_INSTANCE_PORT] |
來源資料庫伺服器的通訊埠。 |
[USERNAME] |
MySQL 複製使用者帳戶。 |
[PASSWORD] |
MySQL 複製使用者帳戶的密碼。 |
[DBS] |
來源資料庫伺服器上所有資料庫的清單 (以空格分隔),系統資料庫 (sys 、mysql 、performance_schema 和 information_schema ) 除外。請使用 SHOW DATABASES MySQL 指令列出資料庫。 |
[BUCKET] |
您建立用來保留匯出檔案的值區名稱。 |
[PATH_TO_DUMP] |
匯出檔案的路徑。 |
如果您看到部分傾印和 GTID 的相關警告,這是正常的。
這個指令可能如下列範例:
mysqldump \
-h 192.0.2.1 -P 3306 -u replicationUser \
--databases guestbook \
--hex-blob --skip-triggers --master-data=1 \
--order-by-primary --no-autocommit \
--default-character-set=utf8mb4 \
--single-transaction --set-gtid-purged=on | gzip | \
gcloud storage cp - gs://export-bucket/hq-primary1.sql.gz
3. 建立複製設定
如果備用資源使用私人 IP,來源資料庫伺服器必須設定為可從備用資源的 VPC 存取。只有 gcloud CLI 和 Cloud SQL Admin API 支援在私人虛擬私有雲中建立副本。
主控台
這個步驟會建立 Cloud SQL 備用資源和來源代表執行個體。
在 Google Cloud 控制台中開啟 Cloud SQL 執行個體清單。
在按鈕列點選 [Migrate data] (遷移資料),開啟 Cloud SQL Migration Assistant。
按一下 [Begin migration] (開始遷移)。
在「Source database name」(來源資料庫名稱) 欄位,為 Cloud SQL 中的複製設定提供名稱。
這個名稱是設定的參照,請使用任何有效的 Cloud SQL 執行個體名稱。
輸入來源資料庫伺服器的 IP 位址和通訊埠編號。
提供用來連線複製作業的 MySQL 使用者名稱和密碼。
選取來源資料庫伺服器的 MySQL 版本。
如果您在備用資源和來源資料庫伺服器之間的連線使用 SSL/TLS (建議),請選取 [Enable SSL/TLS security] (啟用 SSL/TLS 安全性),並為您的來源伺服器提供 SSL/TLS 憑證資訊。
如要進一步瞭解 SSL/TLS 選項,請參閱 SSL/TLS 選項一節。
點選 [繼續],然後填入備用資源的詳細資料。
為了確保匯入作業盡可能有效率地進行,請為備用資源設定大約能容納資料庫的儲存空間。請選擇大小類似來源伺服器的核心和記憶體。
提供您之前上傳至 Cloud Storage 的傾印檔案路徑。
按一下 [Create] (建立) 以建立備用資源。
點選「下一步」。
gcloud
建立來源代表執行個體。
gcloud beta sql instances create [REPLICA_NAME] \ --region=[REGION] --database-version=[MYSQL_VERSION] \ --source-ip-address=[SOURCE_IP] --source-port=[SOURCE_PORT]
如果副本使用私人 IP 位址,請一併新增: --network=[VPC_NETWORK_NAME]
將
[PROPERTIES_IN_BRACKETS]
替換成下列值:屬性 值 [SOURCE_REPRESENTATION_NAME]
來源代表執行個體的名稱。使用任何有效的 Cloud SQL 執行個體名稱。 [REGION]
您要存放 Cloud SQL 備用資源的區域。 [MYSQL_VERSION]
在您的來源資料庫伺服器上執行的 MySQL 版本: MYSQL_5_6
或MYSQL_5_7
。[SOURCE_IP]
來源資料庫伺服器的外部可存取 IPv4 位址。 [SOURCE_PORT]
來源資料庫伺服器的外部可存取通訊埠。 建立 Cloud SQL 備用資源。
gcloud beta sql instances create [REPLICA_NAME] \ --master-instance-name=[SOURCE_REPRESENTATION_NAME] \ --master-username=[USERNAME] --prompt-for-master-password \ --master-dump-file-path=gs://[BUCKET]/[PATH_TO_DUMP] \ --master-ca-certificate-path=[SOURCE_SERVER_CA_PATH] \ --client-certificate-path=[CLIENT_CERT_PATH] \ --client-key-path=[PRIVATE_KEY_PATH] \ --tier=[MACHINE_TYPE] --storage-size=[DISK_SIZE]
如果副本使用私人 IP 位址,請一併新增: --network=[VPC_NETWORK_NAME]
將
[PROPERTIES_IN_BRACKETS]
替換成下列值:屬性 值 [REPLICA_NAME]
Cloud SQL 唯讀備用資源的名稱。使用任何有效的 Cloud SQL 執行個體名稱。 [SOURCE_REPRESENTATION_NAME]
您在之前步驟建立的來源代表執行個體名稱。 [USERNAME]
來源資料庫伺服器上的 MySQL 複製使用者帳戶。 [BUCKET]
您建立用來保留匯出檔案的值區名稱。 [PATH_TO_DUMP]
匯出檔案的路徑。 [SOURCE_SERVER_CA_PATH]
儲存來源資料庫伺服器 CA 憑證的本機路徑。只有 SSL/TLS 需要。 [CLIENT_CERT_PATH]
儲存用戶端憑證的本機路徑。只有伺服器與用戶端驗證需要。 [PRIVATE_KEY_PATH]
儲存用戶端憑證私密金鑰檔案的本機路徑。只有伺服器與用戶端驗證需要。 [MACHINE_TYPE]
您備用資源的大小。一般來說,副本的大小與來源資料庫伺服器差不多。如果不確定要使用哪種機器類型,請先從 db-custom-2-7680
開始。之後如有需要可以變更大小。[DISK_SIZE]
副本的儲存空間大小 (GB)。為獲得最佳效能,請建立副本,並確保儲存空間足以容納整個匯入檔案。 [VPC_NETWORK_NAME]
虛擬私有雲,格式為:projects/[PROJECT_ID]/global/networks/[NETWORK_NAME]
cURL
1. 建立 Cloud SQL 來源代表執行個體
gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
--header 'Content-Type: application/json' \
--data '{
"name": "[SOURCE_REPRESENTATION_NAME]",
"region": "[REGION]",
"databaseVersion": "[MYSQL_VERSION]",
"onPremisesConfiguration": {
"hostPort": "[SOURCE_SERVER_IP]:[SOURCE_SERVER_PORT]"
}
}' \
-X POST \
https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances
將 [PROPERTIES_IN_BRACKETS]
替換成下列值:
屬性 | 值 |
---|---|
[SOURCE_REPRESENTATION_NAME] |
來源代表執行個體的名稱。使用任何有效的 Cloud SQL 執行個體名稱。 |
[REGION] |
您要存放 Cloud SQL 備用資源的區域。 |
[MYSQL_VERSION] |
在您的來源資料庫伺服器上執行的 MySQL 版本:MYSQL_5_6 或 MYSQL_5_7 。 |
[SOURCE_SERVER_IP] |
來源資料庫伺服器的外部可存取 IPv4 位址。 |
[SOURCE_SERVER_PORT] |
來源資料庫伺服器的外部可存取通訊埠。 |
[PROJECT_ID] |
Google Cloud 專案的專案 ID。 |
舉例來說,如要為 IP 位址為 192.0.2.0
的來源資料庫伺服器建立名為 hq-primary1
的來源代表執行個體,該伺服器在 3306
連接埠上開啟,並執行 MySQL 5.7,適用於 MyProject
專案和 us-central1
區域中的 Cloud SQL 副本,您可以使用下列指令:
gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
--header 'Content-Type: application/json' \
--data '{
"name": "hq-primary1",
"region": "us-central1",
"databaseVersion": "MYSQL_5_7",
"onPremisesConfiguration": {
"hostPort": "192.0.2.0:3306"
}
}' \
-X POST \
https://www.googleapis.com/sql/v1beta4/projects/MyProject/instances
2. 建立 Cloud SQL 副本
您在這個步驟中使用來源代表伺服器來代表來源資料庫伺服器,以建立 Cloud SQL 唯讀備用資源,並為備用資源提供先前步驟中載入 Cloud Storage 的資料。
由於這個 API 呼叫會要求您提供機密資訊,因此您應該使用 JSON 檔案提供資料給 cURL,而非使用指令列提供資料。
建立資料檔案:
{
"replicaConfiguration": {
"mysqlReplicaConfiguration": {
"username": "[USERNAME]",
"password": "[PASSWORD]",
"dumpFilePath": "gs://[BUCKET]/[PATH_TO_DUMP]",
"caCertificate": "[SOURCE_SERVER_CA]",
"clientCertificate": "[CLIENT_CERT]",
"clientKey": "[PRIVATE_KEY]"
}
},
"settings": {
"tier": "[MACHINE_TYPE]",
"dataDiskSizeGb": "[DISK_SIZE]"
},
"masterInstanceName": "[SOURCE_REPRESENTATION_NAME]",
"region": "[REGION]",
"databaseVersion": "[MYSQL_VERSION]",
"name": "[REPLICA_NAME]"
}
如果副本使用私人 IP 位址,請在設定中加入「ipConfiguration.privateNetwork」,值的格式為「projects/[PROJECT_ID]/global/networks/[NETWORK_NAME]」。
將 [PROPERTIES_IN_BRACKETS]
替換成下列值:
屬性 | 值 |
---|---|
[USERNAME] |
來源資料庫伺服器上的 MySQL 複製使用者帳戶。 |
[PASSWORD] |
MySQL 複製使用者帳戶的密碼。 |
[BUCKET] |
您建立用來保留匯出檔案的值區名稱。 |
[PATH_TO_DUMP] |
匯出檔案的路徑。 |
[SOURCE_SERVER_CA] |
來源資料庫伺服器的 CA 憑證。僅適用於 SSL/TLS。將憑證貼入要求內文。 |
[CLIENT_CERT] |
用戶端憑證。只有伺服器與用戶端驗證需要。將憑證貼入要求內文。 |
[PRIVATE_KEY] |
用戶端憑證的私密金鑰檔案。只有伺服器與用戶端驗證需要。將金鑰貼入要求本文。 |
[MACHINE_TYPE] |
您備用資源的大小。一般來說,副本的大小與來源資料庫伺服器差不多。如果不確定要使用哪種機器類型,請先從 db-custom-2-7680 開始。之後如有需要可以變更大小。 |
[DISK_SIZE] |
副本的儲存空間大小 (GB)。為獲得最佳效能,請建立副本,並確保有足夠的儲存空間可容納整個匯入作業。 |
[SOURCE_REPRESENTATION_NAME] |
您之前建立的來源代表執行個體名稱。 |
[REGION] |
您建立來源代表執行個體的區域。唯讀備用資源必須與來源代表執行個體在同一個區域。 |
[MYSQL_VERSION] |
在您的來源資料庫伺服器上執行的 MySQL 版本:MYSQL_5_6 或 MYSQL_5_7 。 |
[REPLICA_NAME] |
Cloud SQL 唯讀備用資源的名稱。使用任何有效的 Cloud SQL 執行個體名稱。 |
在指令列呼叫 API:
gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
--header 'Content-Type: application/json' \
--data @[PATH_TO_DATA_FILE] \
-X POST \
https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances
針對我們稍早建立的來源表示例項和 bucket,資料檔案 data.json
可能如下列範例所示:
{
"replicaConfiguration": {
"mysqlReplicaConfiguration": {
"username": "replicationUser",
"password": "486#@%*@",
"dumpFilePath": "gs://export-bucket/hq-primary1.sql.gz",
"caCertificate": "[SOURCE_SERVER_CA]",
"clientCertificate": "[CLIENT_CERT]",
"clientKey": "[PRIVATE_KEY]"
}
},
"settings": {
"tier": "db-custom-4-15360",
"dataDiskSizeGb": "100"
},
"masterInstanceName": "hq-primary1",
"region": "us-central1",
"databaseVersion": "MYSQL_5_7",
"name": "hq-primary1-replica1"
}
cURL 指令如下所示:
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
--header 'Content-Type: application/json' \
--data @./data.json
-X POST \
https://www.googleapis.com/sql/v1beta4/projects/MyProject/instances
讀取副本可以存取傾印檔案時,就會開始匯入程序。 匯入程序所需時間取決於傾印檔案大小、副本機器類型和資料庫結構。根據估計的一般指南,預期備用資源每小時約匯入 25-50 GB。
在匯入程序完成前,副本會維持在 PENDING_CREATE
狀態,完成後則會變更為 RUNNABLE
狀態。
4. 設定接受備用資源連線的來源資料庫伺服器
備用資源必須連線到來源資料庫,才能複製成功。如果您的來源資料庫伺服器是在防火牆後或有一些其他網路限制,您必須使用備用資源的 OUTGOING
IP 位址,為備用資源啟用網路存取權。請注意,這「不是」 Google Cloud 控制台中顯示的副本主要清單 IP 位址。您可以擷取 OUTGOING
IP 位址,方法是將游標懸停在 IP 位址的「More info」(更多資訊) 工具提示上,或使用下方的 gcloud
指令。
擷取唯讀備用資源的 IP 位址:
gcloud sql instances describe [REPLICA_NAME] --format="default(ipAddresses)"
- 視需要設定來源資料庫伺服器的網路防火牆,以便接受來自
OUTGOING
IP 位址的連線。 確認備用資源已成功連線至來源資料庫伺服器。
- 執行個體清單頁面中的副本圖示不再旋轉,且為綠色。
前往 Google Cloud 控制台的記錄檢視器。
- 從「執行個體」下拉式選單中選取副本。
-
選取
replication-setup.log
記錄檔。如果備用資源無法連線到來源資料庫伺服器,請確認下列項目:
-
來源資料庫伺服器上的任何防火牆都已設定為允許來自副本
OUTGOING
IP 位址的連線。 - 您的 SSL/TLS 設定無誤。
- 您的複製使用者、主機和密碼正確無誤。
-
來源資料庫伺服器上的任何防火牆都已設定為允許來自副本
5. 防止其他來源位址存取 MySQL 複製使用者
這並不是必要的步驟,但為了確保安全性,我們建議您這麼做。
來源資料庫伺服器上的 MySQL 複製使用者已設為接受來自任何主機 (%
) 的連線。請更新該使用者帳戶,只接受來自副本 OUTGOING
IP 位址的連線:
UPDATE mysql.user SET Host='[OUTGOING_IP]' WHERE Host='%' AND User='[USERNAME]';
FLUSH PRIVILEGES;
6. 完成備用資源的設定
設定備用資源上的使用者帳戶。
您可以使用 Google Cloud 控制台、gcloud CLI 工具或 Cloud SQL API 執行這項操作。不過,您無法使用
mysql
用戶端。如要進一步瞭解 MySQL 使用者,請參閱 MySQL 使用者。如要使用 Google Cloud 控制台建立使用者,請按照下列步驟操作:
- 前往 Google Cloud 控制台的 Cloud SQL 執行個體頁面。
前往 Cloud SQL 執行個體頁面 - 按一下執行個體名稱,開啟「執行個體詳細資料」頁面。
- 選取 [使用者] 分頁標籤。
- 點選 [建立使用者帳戶]。
- 在「建立使用者帳戶」對話方塊中,,逐一指定使用者的各項資訊。
- 點選「建立」。
- 前往 Google Cloud 控制台的 Cloud SQL 執行個體頁面。
使用公開 IP 位址,從您打算用來連線至備用資源的任何用戶端,授予備用資源存取權。
如需操作說明,請參閱新增授權的位址或位址範圍一節。如要連線至副本,請使用副本的
PRIMARY
IP 位址。這個 IP 位址會顯示在 Google Cloud 控制台中。否則,您可以使用任何其他連線方法連線至副本。
7. 確認複製狀態
備用資源匯入傾印檔案後,會連線至內部部署伺服器,並套用匯出作業完成後的所有更新。
將副本升級為獨立執行個體前,請務必 檢查複製狀態。如果複製程序未順利完成,升級的副本就不會包含外部執行個體的所有變更。
8. (選用) 將備用資源升級為獨立執行個體
檢查複製狀態後,如要完全取代 (「遷移」) 來源資料庫伺服器,請將備用資源升級為獨立的主要執行個體。備用資源成為主要執行個體後,就不會再連線至原始來源資料庫伺服器。
為新的主要執行個體建立新的備用資源,然後重新啟動連線應用程式,指向新的主要執行個體 (用於寫入作業) 或新的備用資源 (用於讀取作業)。
9. 清理儲存空間
刪除匯出的檔案:
gcloud storage rm gs://[BUCKET]/[PATH_TO_DUMP]
如果您不再需要值區,請予以刪除:
gcloud storage rm gs://[BUCKET] --recursive
如要進一步瞭解如何刪除物件及刪除值區,請參閱 Cloud Storage 說明文件。
更新設定
如要日後更新設定,可以編輯來源代表執行個體。
如要更新內部部署設定,請注意 hostPort
和 type
無法更新。