Mengimpor dari Cloud SQL ke Spanner

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

Proses ini menggunakan konsol Google Cloud Cloud Shell 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 konsol Google Cloud dengan 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 dan nama database Anda. Perintah ini akan membuat database jika belum ada.
    • Penyimpanan output: Nama bucket Cloud Storage untuk menyimpan file output.
  2. Spanner akan membuka Cloud Shell dan mengisi perintah. Perintah 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 berada di jaringannya sendiri, Cloud Shell memerlukan akses ke Cloud SQL menggunakan alamat IP publik; namun, Anda tidak perlu memasukkan subnet ke dalam daftar yang diizinkan terhadap alamat IP publik.
    • Memulai migrasi data: Setelah alat memigrasikan skema, perintah akan memulai tugas Dataflow untuk migrasi data. Tugas 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 akan mencetak URL tugas Dataflow.

Batasan

Batasan berikut berlaku:

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

Sebelum memulai

Sebelum mengimpor database, selesaikan prasyarat berikut:

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

  2. Buat pengguna dan sandi untuk instance Cloud SQL yang dapat digunakan untuk membuat kueri database.

  3. Simpan sandi di Secret Manager. Anda memerlukan version ID dari versi rahasia. 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 project yang sama. Google Cloud

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

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan izin serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.

    Aktifkan API

Peran yang diperlukan

Untuk memastikan bahwa akun layanan Compute Engine default memiliki izin yang diperlukan untuk menjalankan tugas Dataflow, minta administrator 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 memberi Anda 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 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 CPU, penggunaan disk, dan kuota Compute Engine alamat IP yang sama dengan tugas Dataflow lainnya.
  • Compute Engine: Sebelum menjalankan tugas impor, Anda harus menyiapkan kuota awal untuk Compute Engine, yang digunakan oleh Dataflow. Kouta ini mewakili jumlah maksimum resource yang Anda izinkan Dataflow untuk digunakan bagi tugas Anda. Nilai awal yang direkomendasikan adalah:

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

    Umumnya, Anda tidak perlu melakukan penyesuaian lain. 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. Pekerjaan 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 konsol Google Cloud :

  1. Buka halaman Instances Spanner.

    Buka halaman instance

  2. Klik nama instance tempat database perlu diimpor.

  3. Klik tombol Impor dari Cloud SQL.

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

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

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

  7. Masukkan nama pengguna dan rahasia, lalu klik tombol Berikutnya.

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

  9. Masukkan nama database Spanner, lalu klik tombol Impor. Spanner akan 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 diberikan dari konsol Google Cloud ke perintah:

    • SOURCE_DATABASE_NAME: nama database Cloud SQL sumber
    • SOURCE_DATABASE_USER: nama pengguna untuk database Cloud SQL sumber
    • PROJECT_ID: Project ID 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 dan file konfigurasi Dataflow

    Perintah ini memverifikasi bahwa akun layanan default Compute Engine 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 konsol Google Cloud .

Langkah Berikutnya