從外部伺服器複製 (v1)

本頁面說明如何建立設定,將資料從來源資料庫伺服器複製到 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.

    Go to project selector

  • 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.

    Go to project selector

  • Make sure that billing is enabled for your Google Cloud project.

  • Enable the Cloud SQL Admin API.

    Enable the API

  • 安裝並驗證 gcloud CLI
  • 確認伺服器符合來源資料庫伺服器的需求
  • 判斷主要執行個體與副本之間的連線需要哪種安全等級,並取得必要的憑證檔案。
  • 決定要使用哪個Google Cloud 地區來存放 Cloud SQL 副本。
  • 組合來源資料庫伺服器相關必要資訊:

    • 外部 IPv4 位址和通訊埠編號

      MySQL 預設使用通訊埠 3306。

    • MySQL 複製使用者帳戶和密碼
    • MySQL 版本號碼
    • 所有必要 SSL/TLS 憑證和金鑰的位置,視您選取的安全性層級而定
  • 準備好為來源資料庫伺服器更新網路防火牆,以接受 Cloud SQL 備用資源的連線。

    這項步驟必須在建立備用資源後的 30 分鐘內完成。

  • 如果您不是專案擁有者,則必須具備 Storage Admin 角色。

來源資料庫伺服器的必要條件

從外部伺服器複製到 Cloud SQL 副本之前,請確認來源資料庫伺服器符合下列設定需求:

設定程序

如要設定從外部資料庫伺服器複製,請執行下列步驟:

  1. 為您的資料建立 Cloud Storage 值區
  2. 將資料匯出至 Cloud Storage
  3. 進行複製設定
  4. 設定接受備用資源連線的來源資料庫伺服器

  5. 防止其他來源位址存取 MySQL 複製使用者

  6. 完成備用資源的設定

  7. 確認複製狀態

  8. 清理儲存空間

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] 來源資料庫伺服器上所有資料庫的清單 (以空格分隔),系統資料庫 (sysmysqlperformance_schemainformation_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 備用資源和來源代表執行個體

  1. 在 Google Cloud 控制台中開啟 Cloud SQL 執行個體清單。

    開啟執行個體清單

  2. 在按鈕列點選 [Migrate data] (遷移資料),開啟 Cloud SQL Migration Assistant。

  3. 按一下 [Begin migration] (開始遷移)

  4. 在「Source database name」(來源資料庫名稱) 欄位,為 Cloud SQL 中的複製設定提供名稱。

    這個名稱是設定的參照,請使用任何有效的 Cloud SQL 執行個體名稱。

  5. 輸入來源資料庫伺服器的 IP 位址和通訊埠編號。

  6. 提供用來連線複製作業的 MySQL 使用者名稱和密碼。

  7. 選取來源資料庫伺服器的 MySQL 版本。

  8. 如果您在備用資源和來源資料庫伺服器之間的連線使用 SSL/TLS (建議),請選取 [Enable SSL/TLS security] (啟用 SSL/TLS 安全性),並為您的來源伺服器提供 SSL/TLS 憑證資訊。

    如要進一步瞭解 SSL/TLS 選項,請參閱 SSL/TLS 選項一節。

  9. 點選 [繼續],然後填入備用資源的詳細資料。

    為了確保匯入作業盡可能有效率地進行,請為備用資源設定大約能容納資料庫的儲存空間。請選擇大小類似來源伺服器的核心和記憶體。

  10. 提供您之前上傳至 Cloud Storage 的傾印檔案路徑。

  11. 按一下 [Create] (建立) 以建立備用資源。

  12. 點選「下一步」

gcloud

  1. 建立來源代表執行個體

    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_6MYSQL_5_7
    [SOURCE_IP] 來源資料庫伺服器的外部可存取 IPv4 位址。
    [SOURCE_PORT] 來源資料庫伺服器的外部可存取通訊埠。
  2. 建立 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_6MYSQL_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_6MYSQL_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 指令。

  1. 擷取唯讀備用資源的 IP 位址:

    gcloud sql instances describe [REPLICA_NAME] --format="default(ipAddresses)"
  2. 視需要設定來源資料庫伺服器的網路防火牆,以便接受來自 OUTGOING IP 位址的連線。
  3. 確認備用資源已成功連線至來源資料庫伺服器。

    1. 執行個體清單頁面中的副本圖示不再旋轉,且為綠色。
    2. 前往 Google Cloud 控制台的記錄檢視器。

      前往記錄檢視器

    3. 從「執行個體」下拉式選單中選取副本。
    4. 選取 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. 完成備用資源的設定

  1. 設定備用資源上的使用者帳戶。

    您可以使用 Google Cloud 控制台、gcloud CLI 工具或 Cloud SQL API 執行這項操作。不過,您無法使用 mysql 用戶端。如要進一步瞭解 MySQL 使用者,請參閱 MySQL 使用者

    如要使用 Google Cloud 控制台建立使用者,請按照下列步驟操作:

    1. 前往 Google Cloud 控制台的 Cloud SQL 執行個體頁面。
      前往 Cloud SQL 執行個體頁面
    2. 按一下執行個體名稱,開啟「執行個體詳細資料」頁面。
    3. 選取 [使用者] 分頁標籤。
    4. 點選 [建立使用者帳戶]
    5. 在「建立使用者帳戶」對話方塊中,,逐一指定使用者的各項資訊。
    6. 點選「建立」
  2. 使用公開 IP 位址,從您打算用來連線至備用資源的任何用戶端,授予備用資源存取權。

    如需操作說明,請參閱新增授權的位址或位址範圍一節。如要連線至副本,請使用副本的 PRIMARY IP 位址。這個 IP 位址會顯示在 Google Cloud 控制台中。

    否則,您可以使用任何其他連線方法連線至副本。

7. 確認複製狀態

備用資源匯入傾印檔案後,會連線至內部部署伺服器,並套用匯出作業完成後的所有更新。

將副本升級為獨立執行個體前,請務必 檢查複製狀態。如果複製程序未順利完成,升級的副本就不會包含外部執行個體的所有變更。

8. (選用) 將備用資源升級為獨立執行個體

檢查複製狀態後,如要完全取代 (「遷移」) 來源資料庫伺服器,請將備用資源升級為獨立的主要執行個體。備用資源成為主要執行個體後,就不會再連線至原始來源資料庫伺服器。

為新的主要執行個體建立新的備用資源,然後重新啟動連線應用程式,指向新的主要執行個體 (用於寫入作業) 或新的備用資源 (用於讀取作業)。

9. 清理儲存空間

  1. 刪除匯出的檔案:

    gcloud storage rm gs://[BUCKET]/[PATH_TO_DUMP]
    
  2. 如果您不再需要值區,請予以刪除:

    gcloud storage rm gs://[BUCKET] --recursive
    

如要進一步瞭解如何刪除物件刪除值區,請參閱 Cloud Storage 說明文件。

更新設定

如要日後更新設定,可以編輯來源代表執行個體。 如要更新內部部署設定,請注意 hostPorttype 無法更新。

後續步驟