このページでは、Cloud SQL for MySQL から Spanner にデータをインポートする方法について説明します。
このプロセスでは、 Google Cloud コンソールで Cloud Shell を使用して、 Cloud SQL から Spanner にデータベースをインポートする Dataflow ジョブを構成して実行するコマンドを実行します。
プロセスの概要
インポート プロセスには次の手順が含まれます。
- コンソール ワークフローを完了して、
ソース データベースとターゲット データベースに関する情報を提供します。
-
Google Cloud
- ソース データベースの詳細: Cloud SQL インスタンス名、データベース名、 認証情報。
- Spanner の詳細: Spanner インスタンス 名とデータベース名。データベースが存在しない場合は、コマンドによって作成されます。
- 出力ストレージ: 出力ファイルを保存する Cloud Storage バケット名。
- Spanner は Cloud Shell を開き、コマンドを入力します。このコマンドは次のアクションを実行します。
- スキーマを移行する: コマンドは、 Spanner 移行ツールを使用してスキーマを移行します。この移行は Cloud Shell で実行され、パブリック IP アドレスを使用して Cloud SQL インスタンスに接続します。Cloud Shell は独自のネットワーク上にあるため、パブリック IP アドレスを使用して Cloud SQL にアクセスする必要があります。ただし、パブリック IP アドレスに対してサブネットを許可リストに登録する必要はありません。
- データ移行を開始する: ツールがスキーマを移行すると、 コマンドはデータ移行の Dataflow ジョブを開始します。ジョブは、プライベート IP アドレスを介してソース データベースから直接読み取り、Spanner に書き込みます。このジョブは、デフォルトの Compute Engine サービス アカウントを使用して実行されます。最後に、コマンドは Dataflow ジョブの URL を出力します。
制限事項
次の制限が適用されます。
- このデータ インポートでは、単一の Cloud SQL for MySQL インスタンスのみがサポートされます。
- スキーマ変換は自動化されています。このインポート中にスキーマを調整することはできません。
- このデータ インポートは 1 回限りの一括ロードであり、継続的なレプリケーションはサポートされていません。
始める前に
データベースをインポートする前に、次の前提条件を満たしてください。
Cloud SQL インスタンスにパブリック IP アドレスとプライベート IP アドレスが有効になっていることを確認します。詳細については、 パブリック IP 接続を構成すると プライベート IP を構成するをご覧ください。
データベースのクエリに使用できる Cloud SQL インスタンスのユーザーとパスワードを作成します。
パスワードを Secret Manager に保存します。Secret のバージョンの
version IDが必要です。 詳細については、 シークレットの作成をご覧ください。Cloud Storage バケットがあることを確認します。Dataflow はこのバケットを使用して、構成ファイルと Dataflow ジョブの出力を保存します。
Spanner と Cloud SQL が同じ Google Cloud プロジェクトにあることを確認します。
Dataflow、Cloud Storage、Spanner、Cloud SQL、Secret Manager の各 API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。詳しくは、ロールを付与する方法をご覧ください。
必要なロール
デフォルトの Compute Engine サービス アカウントに Dataflow ジョブを実行するために必要な 権限があることを確認するには、 プロジェクトに対する次の IAM ロールをデフォルトの Compute Engine サービス アカウントに付与するよう管理者に依頼します:
正しいプリンシパルにロールを付与しないと、権限エラーが発生する可能性があります。- 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)
これらの事前定義ロールには インポートの構成に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
インポートを構成するには、次の権限が必要です。
-
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 ノードを 1 つ以上から始めることをおすすめします。ジョブが妥当な時間内に終了するように、コンピューティング容量を追加する必要がある場合があります。 データベース スキーマをインポートするために追加のコンピューティング容量は必要ありません。 詳細については、 自動スケーリングの概要をご覧ください。
- Dataflow: インポート ジョブは、他の Dataflow ジョブと同じ CPU、 ディスク使用量、IP アドレスの Compute Engine の割り当てに従います。
Compute Engine: インポート ジョブを実行する前に、Dataflow によって使用される Compute Engine の 初期割り当てを 設定する必要があります。これらの割り当ては、Dataflow でジョブに使用できる最大リソース数を表します。 推奨の開始値は次のとおりです。
- CPU: 200
- 使用中の IP アドレス: 200
- 標準永続ディスク: 50 TB
通常、他の調整は必要ありません。Dataflow では自動スケーリングが提供されているため、インポート中に実際に使用したリソースに対してのみ料金を支払います。ジョブでより多くのリソースが使用される可能性がある場合、Dataflow UI に警告アイコンが表示されます。警告アイコンが表示されてもジョブは完了します。
Cloud SQL から Spanner にインポートする
Cloud SQL for MySQL データベースを Spanner にインポートするには、 コンソールで次の操作を行います。 Google Cloud
[Spanner インスタンス] ページに移動します。
データベースをインポートするインスタンスの名前をクリックします。
[Cloud SQL からインポート] ボタンをクリックします。
Spanner が必要な API がすべて有効になっていることを確認したら、[次へ] ボタンをクリックします。
インポートする Cloud SQL for MySQL インスタンスを選択し、[次へ] ボタンをクリックします。
インポートするデータベースを選択し、[次へ] ボタンをクリックします。 Spanner は、Cloud SQL インスタンスのパブリック IP が有効になっているかどうかを確認します。
ユーザー名と Secret を入力し、[次へ] ボタンをクリックします。
Cloud Storage バケットを参照して選択し、[次へ] ボタンをクリックします。
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 コンソールから コマンドに提供されます。
SOURCE_DATABASE_NAME: ソース Cloud SQL データベースの名前SOURCE_DATABASE_USER: ソース Cloud SQL データベースのユーザー名PROJECT_ID: 実際の Google Cloud プロジェクト IDSECRET_ID: パスワードを含む Secret の IDVERSION: Secret のバージョン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: Dataflow 出力ファイルと構成ファイルを保存する Cloud Storage バケットの名前
このコマンドは、デフォルトの Compute サービス アカウントに必要な権限があることを確認し、Spanner 移行ツールをインストールして、スキーマを移行し、Dataflow ジョブを開始します。
コマンドが完了したら、提供されたリンクをクリックして、 コンソールで Dataflow ジョブをモニタリングします。 Google Cloud
次のステップ
- スキーマの更新方法を確認する。