Cloud SQL から Spanner にインポートする

このページでは、Cloud SQL for MySQL から Spanner にデータをインポートする方法について説明します。

このプロセスでは、 Google Cloud コンソールの Cloud Shell を使用して、Cloud SQL から Spanner にデータベースをインポートする Dataflow ジョブを構成して実行するコマンドを実行します。

プロセスの概要

インポート プロセスには次の手順が含まれます。

  1. Google Cloud コンソール ワークフローを完了します。このワークフローでは、移行元データベースと移行先データベースに関する情報を提供します。
    • 移行元のデータベースの詳細: Cloud SQL インスタンス名、データベース名、認証情報。
    • Spanner の詳細: Spanner インスタンス名とデータベース名。このコマンドは、データベースが存在しない場合にデータベースを作成します。
    • 出力ストレージ: 出力ファイルを保存する Cloud Storage バケット名。
  2. 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 回限りの一括読み込みであり、継続的なレプリケーションはサポートされていません。

始める前に

データベースをインポートする前に、次の前提条件を満たしてください。

  1. Cloud SQL インスタンスでパブリック IP アドレスとプライベート IP アドレスが有効になっていることを確認します。詳細については、パブリック IP 接続を構成するプライベート IP を構成するをご覧ください。

  2. データベースのクエリに使用できる Cloud SQL インスタンスのユーザーとパスワードを作成します。

  3. パスワードを Secret Manager に保存します。Secret のバージョンの version ID が必要です。詳細については、シークレットの作成をご覧ください。

  4. Cloud Storage バケットがあることを確認します。Dataflow は、このバケットを使用して Dataflow ジョブの構成ファイルと出力を保存します。

  5. Spanner と Cloud SQL が同じ Google Cloudプロジェクトにあることを確認します。

  6. Dataflow、Cloud Storage、Spanner、Cloud SQL、Secret Manager の各 API を有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。詳しくは、ロールを付与する方法をご覧ください。

    API を有効にする

必要なロール

デフォルトの Compute Engine サービス アカウントに Dataflow ジョブを実行するために必要な権限があることを確認するには、プロジェクトのデフォルトの Compute Engine サービス アカウントに次の IAM ロールを付与するよう管理者に依頼します。

インポートの構成に必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

これらの事前定義ロールには、インポートの構成に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

インポートを構成するには、次の権限が必要です。

  • 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: インポートするデータの量をサポートできるだけの十分なコンピューティング容量が必要です。少なくとも 1 つの Spanner ノードから始めることをおすすめします。ジョブが妥当な時間内に終了するように、コンピューティング容量を追加する必要がある場合があります。データベース スキーマをインポートするために追加のコンピューティング容量は必要ありません。詳細については、自動スケーリングの概要をご覧ください。
  • 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 コンソールで次の操作を行います。

  1. [Spanner インスタンス] ページに移動します。

    インスタンス ページに移動

  2. データベースをインポートする必要があるインスタンスの名前をクリックします。

  3. [Cloud SQL からインポート] ボタンをクリックします。

  4. Spanner が必要な API がすべて有効になっていることを確認したら、[次へ] ボタンをクリックします。

  5. インポートする Cloud SQL for MySQL インスタンスを選択し、[次へ] ボタンをクリックします。

  6. インポートするデータベースを選択し、[次へ] ボタンをクリックします。Spanner は、Cloud SQL インスタンスのパブリック IP が有効になっているかどうかを確認します。

  7. ユーザー名とシークレットを入力し、[次へ] ボタンをクリックします。

  8. Cloud Storage バケットを参照して選択し、[次へ] ボタンをクリックします。

  9. Spanner データベース名を入力し、[インポート] ボタンをクリックします。Spanner は Cloud Shell を開き、コマンドを入力します。

  10. 自動入力されたコマンドを実行して、インポートを開始します。

    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 プロジェクト ID
    • SECRET_ID: パスワードを含むシークレットの ID
    • VERSION: シークレットのバージョン
    • SOURCE_PROJECT_ID: ソースの Cloud SQL インスタンスを含むプロジェクト ID
    • SOURCE_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 インスタンスを含むプロジェクト ID
    • SPANNER_INSTANCE_ID: ターゲット Spanner インスタンスの ID
    • SPANNER_DATABASE_ID: ターゲット Spanner データベースの ID。存在しない場合は Spanner によって作成されます。
    • BUCKET_NAME: Dataflow の出力ファイルと構成ファイルを保存する Cloud Storage バケットの名前

    このコマンドは、デフォルトのコンピューティング サービス アカウントに必要な権限があることを確認し、Spanner 移行ツールをインストールして、スキーマを移行し、Dataflow ジョブを開始します。

    コマンドが完了したら、提供されたリンクをたどって、 Google Cloud コンソールで Dataflow ジョブをモニタリングします。

次のステップ