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

本頁面說明如何使用從外部伺服器建立的 dump 檔案設定複製作業。

您必須完成本頁的所有步驟。完成後,您就能像管理及監控其他 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 Cloud de Confiance by S3NS 使用者帳戶的使用者名稱。
HOST Cloud de Confiance by S3NS 使用者帳戶的主機名稱。

驗證複製設定

設定完成後,請確認 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 Cloud de Confiance中的專案 ID。
REPLICA_INSTANCE Cloud SQL 副本的 ID。

將資料庫匯出至 Cloud Storage bucket

您可以使用位於 Cloud Storage bucket 中的 mysqldump 檔案,填入 Cloud SQL 副本。適用條件如下:

  • 您必須使用 MySQL 隨附的 mysqldump 公用程式。
  • mysqldump 執行期間,請勿在外部伺服器上執行任何 DDL 作業。否則可能會導致匯出檔案中有資料不一致的情況發生。

如要將資料庫匯出至 Cloud Storage bucket,請按照下列步驟操作:

  1. 在 Cloud de Confiance中建立 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 外部伺服器上所有資料庫的清單 (以空格分隔),但不包括系統資料庫 (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 如要進一步壓縮 dump 檔案,請使用 | gzip。如果資料庫包含無法妥善壓縮的資料,例如二進位不可壓縮資料或 JPG 圖片,請勿使用這項功能。
BUCKET 您在步驟 1 建立的 bucket 名稱,用於存放 dump 檔案。
DUMP_FILENAME 系統會在 bucket 中建立這個名稱的檔案。這個檔案包含外部伺服器上的資料庫內容。

使用 Cloud Storage bucket 的檔案路徑更新來源表示法執行個體

來源代表執行個體是 Cloud SQL 執行個體,代表 Cloud SQL 副本的來源資料庫伺服器。您可以在 Cloud de Confiance by S3NS 控制台查看,外觀與一般 Cloud SQL 執行個體相同,但沒有資料、不需設定或維護,也不會影響帳單。

source.json 檔案包含來源表示法執行個體的相關資訊。

REST

{
  "name": "PRIMARY_INSTANCE_NAME",
  "region": "REGION_NAME",
  "databaseVersion": "DB_NAME_AND_VERSION",
  "onPremisesConfiguration": {
    "hostPort": "IP_ADDRESS_AND_PORT",
    "selectedObjects": "SELECTED_OBJECTS",
    "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",
    "selectedObjects":[{"database":"db1"}, {"database":"db3"}],
    "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 位址和通訊埠號碼。
SELECTED_OBJECTS 更新後的物件清單 (以半形逗號分隔),指定要從來源代表執行個體遷移至目的地 Cloud SQL 執行個體的資料庫。
USERNAME 來源表示法執行個體的使用者名稱。
PASSWORD 來源表示法執行個體的密碼。
DUMP_FILE_PATH dump 檔案的路徑,其中包含外部伺服器上的資料庫內容。

設定 Cloud SQL 副本後,您需要使用 Cloud Storage bucket 的檔案路徑,更新來源代表執行個體。

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 bucket 中的 JSON 檔案路徑。這個檔案包含來源表示法執行個體的資料。
PROJECT_ID Cloud de Confiance中的專案 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 Cloud de Confiance中的專案 ID。
REPLICA_INSTANCE Cloud SQL 副本的 ID。

清理儲存空間

如果您是從 bucket 中的檔案複製,可以移除這個檔案和 bucket。請參閱 Cloud Storage 說明文件,瞭解如何刪除物件和刪除 bucket。

繼續複製

從外部伺服器啟動複製作業後,您需要監控複製作業,然後完成遷移。詳情請參閱「監控複製作業」。

疑難排解

問題 疑難排解
Lost connection to MySQL server during query when dumping table。 來源可能已無法使用,或傾印內容包含過大的封包。

確認外部主要執行個體可供連線。您也可以修改來源執行個體上的 net_read_timeout 和 net_write_timeout 旗標值,停止錯誤。如要進一步瞭解這些旗標允許的值,請參閱「設定資料庫旗標」。

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

初始轉儲失敗,並顯示逾時或連線中斷錯誤 (例如 Dump timeout 或 Lost connection to MySQL server)。 如果一或多個 DDL 陳述式與平行轉儲程序互動,導致程序無限期等待,就可能發生這項錯誤。

解決方法:在初始轉儲階段,請勿在來源資料庫上執行 DDL 陳述式。執行任何 DDL 陳述式之前,請重新啟動遷移作業,並等待初始轉儲階段完成。

初始資料遷移作業成功,但未複製任何資料。

可能原因之一是來源資料庫定義了複製標記,導致部分或所有資料庫變更未複製。

確認複製旗標 (例如 binlog-do-db、binlog-ignore-db、replicate-do-db 或 replicate-ignore-db) 的設定方式不會相互衝突。

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

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

建議做法:

  • 在 Cloud de Confiance 控制台的 Cloud Monitoring 部分,查看副本執行個體的複製指標。
  • MySQL IO 執行緒或 SQL 執行緒的錯誤,可在 Cloud Logging 的 mysql.err 記錄檔中找到。
  • 連線至副本執行個體時,也可能發生這項錯誤。 執行 SHOW REPLICA STATUS 指令,並檢查輸出內容中是否有下列欄位:
    • Replica_IO_Running
    • Replica_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error

如果看到 Unknown database DATABASE_NAME on query. Error_code: MY-001049 錯誤,表示複製的 SQL 陳述式嘗試參照未選取遷移的資料庫,導致複製失敗。如要復原複製作業,請根據訊息判斷錯誤是否由下列其中一個物件的 DDL 造成:

  • 事件或日常安排。您可以在副本上執行 CALL mysql.skipReplicationError(),防止事件或常式複製,並繼續複製。
  • 外鍵限制或檢視表。確定陳述式修改的物件位於哪個資料庫後,您可以選擇兩種復原方式。您可以從所選的遷移資料庫中移除該資料庫,也可以在副本上執行 CALL mysql.skipReplicationError(),略過檢視表的限制或傳播,繼續複製作業。
mysqld check failed: data disk is full。 副本執行個體的資料磁碟已滿。

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

查看複製記錄

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

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

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

    前往記錄檢視器

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

如果 Cloud SQL 副本無法連線至外部伺服器,請確認下列事項:

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

後續步驟