使用傾印檔案來設定從外部資料庫的複製作業

本頁說明如何設定複寫功能,前提是您有從外部伺服器建立的傾印檔。

你必須完成本頁的所有步驟。完成後,您就能以管理其他 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_UNSPECIFIEDONLINEOFFLINE
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,請按照下列步驟操作:

  1. 在 Google Cloud中建立 Cloud Storage bucket
  2. 使用連線至外部資料庫伺服器的用戶端開啟終端機,然後執行下列指令。

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 外部伺服器上所有資料庫的清單 (以空格分隔),系統資料庫 (sysmysqlperformance_schemainformation_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_timeoutnet_write_timeout 旗標值,停止發生錯誤。如要進一步瞭解這些旗標的允許值,請參閱「設定資料庫旗標」。

如要進一步瞭解如何使用 mysqldump 標記進行受管理匯入遷移作業,請參閱「 允許和預設的初始同步標記」。

初始資料遷移作業成功,但沒有任何資料複製。 其中一個可能的原因是來源資料庫定義了複製標記,導致部分或所有資料庫變更未複製過來。

請確認複製旗標 (例如 binlog-do-dbbinlog-ignore-dbreplicate-do-dbreplicate-ignore-db) 未以衝突的方式設定。

在主要執行個體上執行 show master status 指令,即可查看目前的設定。

初始資料遷移作業成功,但資料複製作業在一段時間後停止運作。 建議做法:

  • 在 Google Cloud 控制台的 Cloud Monitoring 專區中,查看副本執行個體的 複寫指標
  • MySQL IO 執行緒或 SQL 執行緒的錯誤會顯示在 Cloud Loggingmysql.err log 檔案中。
  • 連線至副本執行個體時,也可能會發現這個錯誤。 執行 SHOW SLAVE STATUS 指令,並檢查輸出內容中是否有下列欄位:
    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error
mysqld check failed: data disk is full 備用執行個體的資料磁碟已滿。

增加副本執行個體的磁碟大小。您可以手動增加磁碟大小,也可以啟用儲存空間自動增加功能。

查看複寫記錄

驗證複製設定時,系統會產生記錄。

如要查看這些記錄,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的記錄檢視器。

    前往記錄檢視器

  2. 從「執行個體」下拉式選單中選取 Cloud SQL 副本。
  3. 選取 replication-setup.log 記錄檔。

如果 Cloud SQL 備用資源無法連線至外部伺服器,請確認下列事項:

  • 外部伺服器上的任何防火牆都已設定為允許來自 Cloud SQL 備用資源傳出 IP 位址的連線。
  • 您的 SSL/TLS 設定正確無誤。
  • 複製使用者、主機和密碼正確無誤。

後續步驟