Mengimpor dari Cloud SQL ke Spanner

Halaman ini menjelaskan cara mengimpor data dari Cloud SQL untuk MySQL ke Spanner.

Proses ini menggunakan Cloud Shell on Google Cloud console untuk menjalankan perintah yang mengonfigurasi dan menjalankan tugas Dataflow untuk mengimpor database dari Cloud SQL ke Spanner.

Ringkasan proses

Proses impor melibatkan hal berikut:

  1. Anda menyelesaikan alur kerja Google Cloud console tempat Anda memberikan informasi tentang database sumber dan target Anda:
    • Detail database sumber: Nama instance Cloud SQL, nama database, dan kredensial Anda.
    • Detail Spanner: Nama instance Spanner Anda, dan nama database. Perintah ini akan membuat database jika belum ada.
    • Penyimpanan output: Nama bucket Cloud Storage untuk menyimpan file output.
  2. Spanner membuka Cloud Shell dan mengisi perintah. Perintah ini melakukan tindakan berikut:
    • Memigrasikan skema: Perintah ini memigrasikan skema menggunakan alat migrasi Spanner. Migrasi ini berjalan di Cloud Shell dan menggunakan alamat IP publik untuk terhubung ke instance Cloud SQL Anda. Karena Cloud Shell berada di jaringannya sendiri, Cloud Shell memerlukan akses ke Cloud SQL menggunakan alamat IP publik; namun, Anda tidak perlu memberikan izin daftar ke subnet mana pun terhadap alamat IP publik.
    • Memulai migrasi data: Setelah alat memigrasikan skema, perintah akan memulai tugas Dataflow untuk migrasi data. Tugas ini membaca dari database sumber secara langsung melalui alamat IP pribadinya dan menulis ke Spanner. Tugas ini berjalan menggunakan akun layanan Compute Engine default. Terakhir, perintah ini akan mencetak URL tugas Dataflow.

Batasan

Batasan berikut berlaku:

  • Impor data ini hanya mendukung satu instance Cloud SQL untuk MySQL.
  • Konversi skema otomatis; Anda tidak dapat melakukan penyesuaian pada skema selama impor ini.
  • Impor data ini adalah pemuatan massal satu kali; impor ini tidak mendukung replikasi berkelanjutan.

Sebelum memulai

Sebelum mengimpor database, selesaikan prasyarat berikut:

  1. Pastikan instance Cloud SQL Anda memiliki alamat IP publik dan alamat IP pribadi yang diaktifkan. Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi konektivitas IP publik dan Mengonfigurasi IP pribadi.

  2. Buat nama pengguna dan sandi untuk instance Cloud SQL Anda yang dapat digunakan untuk mengkueri database.

  3. Simpan sandi di Secret Manager. Anda memerlukan version ID versi secret. Untuk mengetahui informasi selengkapnya, lihat Membuat secret.

  4. Pastikan Anda memiliki bucket Cloud Storage. Dataflow menggunakan bucket ini untuk menyimpan file konfigurasi dan output tugas Dataflow.

  5. Pastikan Spanner dan Cloud SQL berada dalam Google Cloud project yang sama.

  6. Aktifkan Dataflow, Cloud Storage, Spanner, Cloud SQL, dan Secret Manager API.

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (roles/serviceusage.serviceUsageAdmin), yang berisi izin serviceusage.services.enable. Pelajari cara memberikan peran.

    Aktifkan API

Peran yang diperlukan

Untuk memastikan akun layanan Compute Engine default memiliki izin yang diperlukan untuk menjalankan tugas Dataflow, minta administrator Anda untuk memberikan peran IAM berikut ke akun layanan Compute Engine default di project Anda:

Untuk mendapatkan izin yang Anda perlukan untuk mengonfigurasi impor, minta administrator Anda untuk memberikan peran IAM berikut di project Anda:

Peran bawaan ini berisi izin yang diperlukan untuk mengonfigurasi impor. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk mengonfigurasi impor:

  • 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

Persyaratan kuota

Persyaratan kuota adalah sebagai berikut:

  • Spanner: Anda harus memiliki kapasitas komputasi yang cukup untuk mendukung jumlah data yang Anda impor. Sebaiknya mulai dengan minimal satu node Spanner. Anda mungkin perlu menambahkan lebih banyak kapasitas komputasi agar tugas Anda selesai dalam waktu yang wajar. Tidak diperlukan kapasitas komputasi tambahan untuk mengimpor skema database. Untuk mengetahui informasi selengkapnya, lihat Ringkasan penskalaan otomatis
  • Dataflow: Tugas impor tunduk pada kuota Compute Engine yang sama untuk CPU, penggunaan disk, dan alamat IP seperti tugas Dataflow lainnya.
  • Compute Engine: Sebelum menjalankan tugas impor, Anda harus menyiapkan kuota awal untuk Compute Engine, yang digunakan Dataflow. Kuota ini mewakili jumlah maksimum resource yang Anda izinkan untuk digunakan Dataflow bagi tugas Anda. Nilai awal yang direkomendasikan adalah:

    • CPU: 200
    • Alamat IP yang digunakan: 200
    • Persistent disk standar: 50 TB

    Umumnya, Anda tidak perlu melakukan penyesuaian lainnya. Dataflow menyediakan penskalaan otomatis sehingga Anda hanya membayar resource aktual yang digunakan selama impor. Jika tugas Anda dapat menggunakan lebih banyak resource, UI Dataflow akan menampilkan ikon peringatan. Tugas dapat selesai meskipun ada ikon peringatan.

Mengimpor dari Cloud SQL ke Spanner

Untuk mengimpor database Cloud SQL untuk MySQL ke Spanner, lakukan hal berikut di Google Cloud console:

  1. Buka halaman Instances Spanner.

    Buka halaman instance

  2. Klik nama instance tempat database perlu diimpor.

  3. Klik tombol Import from Cloud SQL.

  4. Setelah Spanner memverifikasi bahwa semua API yang diperlukan diaktifkan, klik tombol Next.

  5. Pilih instance Cloud SQL untuk MySQL yang akan diimpor, lalu klik tombol Next.

  6. Pilih database yang akan diimpor, lalu klik tombol Next. Spanner memverifikasi apakah IP publik untuk instance Cloud SQL Anda diaktifkan.

  7. Masukkan nama pengguna dan secret, lalu klik tombol Next.

  8. Telusuri dan pilih bucket Cloud Storage, lalu klik tombol Next.

  9. Masukkan nama database Spanner, lalu klik tombol Import. Spanner membuka Cloud Shell dan mengisi perintah.

  10. Jalankan perintah yang otomatis terisi untuk memulai impor:

    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 "--------------------------------------------------------"
    

    Parameter berikut disediakan dari Google Cloud console ke perintah:

    • SOURCE_DATABASE_NAME: nama database Cloud SQL sumber
    • SOURCE_DATABASE_USER: nama pengguna untuk database Cloud SQL sumber
    • PROJECT_ID: ID proyek Google Cloud Anda
    • SECRET_ID: ID secret yang berisi sandi
    • VERSION: versi secret
    • SOURCE_PROJECT_ID: project ID yang berisi instance Cloud SQL sumber
    • SOURCE_REGION: region instance Cloud SQL sumber
    • SOURCE_INSTANCE_NAME: nama instance Cloud SQL sumber
    • SOURCE_PRIVATE_IP: alamat IP pribadi instance Cloud SQL
    • NETWORK_NAME: nama jaringan instance Cloud SQL sumber
    • SUBNETWORK_NAME: nama subnetwork instance Cloud SQL sumber
    • SPANNER_PROJECT_ID: project ID yang berisi instance Spanner target
    • SPANNER_INSTANCE_ID: ID instance Spanner target
    • SPANNER_DATABASE_ID: ID database Spanner target, yang dibuat Spanner jika tidak ada
    • BUCKET_NAME: nama bucket Cloud Storage untuk menyimpan file output Dataflow dan file konfigurasi

    Perintah ini memverifikasi bahwa akun layanan komputasi default memiliki izin yang diperlukan, menginstal alat migrasi Spanner, memigrasikan skema, dan memulai tugas Dataflow.

    Setelah perintah selesai, ikuti link yang diberikan untuk memantau tugas Dataflow di console Google Cloud .

Langkah Berikutnya