本頁面說明如何將資料從 MySQL 適用的 Cloud SQL 匯入 Spanner。
這個程序會使用 Google Cloud 控制台上的 Cloud Shell 執行指令,設定及執行 Dataflow 工作,將資料庫從 Cloud SQL 匯入 Spanner。
流程總覽
匯入程序包括下列步驟:
- 您會完成 Google Cloud 管理中心工作流程,提供來源和目標資料庫的相關資訊:
- 來源資料庫詳細資料:Cloud SQL 執行個體名稱、資料庫名稱和您的憑證。
- Spanner 詳細資料:您的 Spanner 執行個體名稱和資料庫名稱。如果資料庫尚不存在,這項指令會加以建立。
- 輸出儲存空間:用來儲存輸出檔案的 Cloud Storage bucket 名稱。
- Spanner 會開啟 Cloud Shell 並填入指令。這個指令會執行下列動作:
- 遷移結構定義:這項指令會使用 Spanner 遷移工具遷移結構定義。這項遷移作業會在 Cloud Shell 中執行,並使用公開 IP 位址連線至 Cloud SQL 執行個體。由於 Cloud Shell 位於自己的網路上,因此需要使用公開 IP 位址存取 Cloud SQL;不過,您不需要針對公開 IP 位址將任何子網路加入許可清單。
- 開始遷移資料:工具遷移結構定義後,這項指令會啟動 Dataflow 工作,開始遷移資料。這項作業會透過來源資料庫的私人 IP 位址直接讀取資料,並寫入 Spanner。這項工作會使用預設的 Compute Engine 服務帳戶執行。最後,指令會列印 Dataflow 工作網址。
限制
限制如下:
- 這項資料匯入作業僅支援單一 MySQL 適用的 Cloud SQL 執行個體。
- 結構定義轉換是自動進行,您無法在匯入期間調整結構定義。
- 這項資料匯入作業是一次性大量載入,不支援持續複製。
事前準備
匯入資料庫前,請先完成下列必要條件:
確認 Cloud SQL 執行個體已啟用公開 IP 位址和私人 IP 位址。詳情請參閱「設定公開 IP 連線」和「設定私人 IP」。
為 Cloud SQL 執行個體建立使用者和密碼,可用於查詢資料庫。
將密碼儲存在 Secret Manager 中。您需要密鑰版本的
version ID。詳情請參閱「建立密鑰」。確認您有 Cloud Storage bucket。Dataflow 會使用這個值區儲存設定檔和 Dataflow 工作的輸出內容。
確認 Spanner 和 Cloud SQL 位於同一個 Google Cloud專案。
啟用 Dataflow、Cloud Storage、Spanner、Cloud SQL 和 Secret Manager API。
啟用 API 時所需的角色
如要啟用 API,您需要服務使用情形管理員 IAM 角色 (
roles/serviceusage.serviceUsageAdmin),其中包含serviceusage.services.enable權限。瞭解如何授予角色。
必要的角色
如要確保預設的 Compute Engine 服務帳戶具備執行 Dataflow 工作所需的權限,請要求系統管理員授予專案中預設的 Compute Engine 服務帳戶下列 IAM 角色:
-
Secret Manager 密鑰存取者 (
roles/secretmanager.secretAccessor) -
Cloud SQL 用戶端 (
roles/cloudsql.client) -
Cloud Spanner 資料庫管理員 (
roles/spanner.databaseAdmin) -
Storage 物件管理員 (
roles/storage.objectAdmin) -
Dataflow 工作者 (
roles/dataflow.worker)
如要取得設定匯入作業所需的權限,請要求系統管理員在專案中授予您下列 IAM 角色:
-
Cloud SQL 用戶端 (
roles/cloudsql.client) -
Cloud Spanner 資料庫管理員 (
roles/spanner.databaseAdmin) -
Secret Manager 密鑰存取者 (
roles/secretmanager.secretAccessor) - 儲存空間管理員 (
roles/storage.admin) -
Dataflow 開發人員 (
roles/dataflow.developer) -
服務帳戶使用者 (
roles/iam.serviceAccountUser)
這些預先定義的角色具備設定匯入作業所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
如要設定匯入作業,您必須具備下列權限:
-
cloudsql.instances.connect -
cloudsql.instances.get -
cloudsql.instances.login -
spanner.instances.list -
spanner.instances.get -
spanner.databases.create -
spanner.databases.list -
spanner.databases.get -
spanner.databases.getDdl -
spanner.databases.updateDdl -
spanner.databases.read -
spanner.databases.write -
spanner.databases.select -
secretmanager.versions.access -
storage.objects.create -
storage.objects.get -
storage.buckets.get -
dataflow.jobs.create -
dataflow.jobs.get -
dataflow.jobs.list -
iam.serviceAccounts.actAs
配額需求
配額規定如下:
- Spanner:您必須要有足夠的運算容量來支援匯入的資料量。建議您至少從一個 Spanner 節點開始。您可能需要增加運算容量,以便在合理的時間內完成工作。匯入資料庫結構定義不需要額外運算資源。 詳情請參閱「自動調度資源總覽」。
- Dataflow:匯入工作在 CPU、磁碟使用率和 IP 位址方面的 Compute Engine 配額限制與其他 Dataflow 工作相同。
Compute Engine:執行匯入工作前,您必須先為 Compute Engine 設定初始配額,以供 Dataflow 使用。這些配額代表您允許 Dataflow 為工作使用的資源數量「上限」。我們建議的起始值如下:
- CPU:200
- 使用中的 IP 位址:200
- 標準永久磁碟:50 TB
一般來說,您不需再進行其他調整。 Dataflow 會自動調度資源,因此您只要支付匯入期間實際用到的資源費用。如果您的工作可能會使用更多資源,Dataflow UI 將出現警告圖示,即使出現警告圖示,工作仍可順利完成。
從 Cloud SQL 匯入至 Spanner
如要將 MySQL 適用的 Cloud SQL 資料庫匯入 Spanner,請在 Google Cloud 控制台中執行下列操作:
前往 Spanner「Instances」(執行個體) 頁面。
按一下要匯入資料庫的執行個體名稱。
按一下「從 Cloud SQL 匯入」按鈕。
Spanner 確認已啟用所有必要的 API 後,請按一下「下一步」按鈕。
選取要匯入的 MySQL 適用的 Cloud SQL 執行個體,然後按一下「下一步」按鈕。
選取要匯入的資料庫,然後按一下「下一步」按鈕。 Spanner 會驗證 Cloud SQL 執行個體的公開 IP 是否已啟用。
輸入使用者名稱和密鑰,然後按一下「下一步」按鈕。
瀏覽並選取 Cloud Storage bucket,然後按一下「Next」(下一步)按鈕。
輸入 Spanner 資料庫名稱,然後按一下「匯入」按鈕。Spanner 會開啟 Cloud Shell,並填入指令。
執行自動填入的指令,開始匯入:
export SOURCE_PROJECT_NUMBER=$(gcloud projects describe \ "SOURCE_PROJECT_ID" \ --format="value(projectNumber)") && \ export GSA_EMAIL="${SOURCE_PROJECT_NUMBER}-compute@developer.gserviceaccount.com" && \ echo "Verifying permissions for ${GSA_EMAIL}..." && \ export CURRENT_ROLES=$(gcloud projects get-iam-policy \ "SOURCE_PROJECT_ID" \ --flatten="bindings[].members" \ --filter="bindings.members:serviceAccount:${GSA_EMAIL}" \ --format="value(bindings.role)") && \ ERR=0 && \ for ROLE in roles/secretmanager.secretAccessor \ roles/cloudsql.client roles/spanner.databaseAdmin \ roles/storage.objectAdmin roles/dataflow.worker; do \ if echo "${CURRENT_ROLES}" | awk -v r="$ROLE" '$1 == r {found=1} END {exit 1-found}'; then \ echo "[OK] $ROLE"; \ else \ echo "[MISSING] $ROLE. Run: gcloud projects add-iam-policy-binding SOURCE_PROJECT_ID --member='serviceAccount:${GSA_EMAIL}' --role='${ROLE}'"; \ ERR=1; \ fi; \ done && \ [[ "$ERR" -eq 0 ]] && \ export JOB_NAME="csql-to-spanner-$(date +%Y%m%d-%H%M%S)" && \ export OUTPUT_DIR="gs://BUCKET_NAME/output/${JOB_NAME}" && \ export SHARD_CONFIG_PATH="gs://BUCKET_NAME/config/${JOB_NAME}_shard_config.json" && \ export WORKER_MACHINE_TYPE="n2-highmem-8" && \ export TEMPLATE_PATH="gs://dataflow-templates/latest/flex/Sourcedb_to_Spanner_Flex" && \ export SHARD_CONFIG_JSON='{ "shardConfigurationBulk": { "dataShards": [ { "host": "SOURCE_PRIVATE_IP", "port": "3306", "user": "SOURCE_DATABASE_USER", "secretManagerUri": "projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION", "databases": [ { "dbName": "SOURCE_DATABASE_NAME", "databaseId": "SOURCE_DATABASE_NAME" } ] } ] } }' && \ echo "${SHARD_CONFIG_JSON}" | gcloud storage cp - "${SHARD_CONFIG_PATH}" && \ sudo apt-get update && \ sudo apt-get install google-cloud-cli-spanner-migration-tool -y && \ gcloud alpha spanner migrate schema \ --source=mysql \ --source-profile="project=SOURCE_PROJECT_ID,instance=SOURCE_INSTANCE_NAME,secretManagerUri=projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION,dbName=SOURCE_DATABASE_NAME,region=SOURCE_REGION,user=SOURCE_DATABASE_USER" \ --target-profile="instance=SPANNER_INSTANCE_ID,project=SPANNER_PROJECT_ID,dbName=SPANNER_DATABASE_ID" && \ JOB_OUTPUT=$(gcloud dataflow flex-template run "${JOB_NAME}" \ --project="SOURCE_PROJECT_ID" \ --region="SOURCE_REGION" \ --template-file-gcs-location="${TEMPLATE_PATH}" \ --network="NETWORK_NAME" \ --subnetwork="https://www.googleapis.com/compute/v1/projects/SOURCE_PROJECT_ID/regions/SOURCE_REGION/subnetworks/SUBNETWORK_NAME" \ --worker-machine-type="${WORKER_MACHINE_TYPE}" \ --parameters "instanceId=SPANNER_INSTANCE_ID" \ --parameters "databaseId=SPANNER_DATABASE_ID" \ --parameters "projectId=SPANNER_PROJECT_ID" \ --parameters "sourceConfigURL=${SHARD_CONFIG_PATH}" \ --parameters "sourceDbDialect=MYSQL" \ --parameters "jdbcDriverClassName=com.mysql.jdbc.Driver" \ --parameters "outputDirectory=${OUTPUT_DIR}" \ --format="get(job.id)") && \ echo "--------------------------------------------------------" && \ echo "Dataflow Job Submitted." && \ echo "Monitor: https://console.cloud.google.com/dataflow/jobs/SOURCE_REGION/${JOB_OUTPUT}?project=SOURCE_PROJECT_ID" && \ echo "--------------------------------------------------------"系統會從 Google Cloud 控制台提供下列參數給指令:
- :來源 Cloud SQL 資料庫的名稱
SOURCE_DATABASE_NAME SOURCE_DATABASE_USER:來源 Cloud SQL 資料庫的使用者名稱PROJECT_ID:您的 Google Cloud 專案 IDSECRET_ID:包含密碼的密碼金鑰 IDVERSION:密鑰版本SOURCE_PROJECT_ID:包含來源 Cloud SQL 執行個體的專案 IDSOURCE_REGION:來源 Cloud SQL 執行個體的區域SOURCE_INSTANCE_NAME:來源 Cloud SQL 執行個體的名稱SOURCE_PRIVATE_IP:Cloud SQL 執行個體的私人 IP 位址NETWORK_NAME:來源 Cloud SQL 執行個體的網路名稱SUBNETWORK_NAME:來源 Cloud SQL 執行個體的子網路名稱SPANNER_PROJECT_ID:包含目標 Spanner 執行個體的專案 IDSPANNER_INSTANCE_ID:目標 Spanner 執行個體的 IDSPANNER_DATABASE_ID:目標 Spanner 資料庫的 ID,如果不存在,Spanner 會建立該資料庫BUCKET_NAME:Cloud Storage bucket 的名稱,用於儲存 Dataflow 輸出檔案和設定檔
這項指令會驗證預設的運算服務帳戶是否具備必要權限、安裝 Spanner 遷移工具、遷移結構定義,並啟動 Dataflow 工作。
指令完成後,請按照提供的連結,在 Google Cloud 控制台中監控 Dataflow 工作。
- :來源 Cloud SQL 資料庫的名稱
後續步驟
- 瞭解如何更新結構定義。