이 페이지에서는 MySQL용 Cloud SQL에서 Spanner로 데이터를 가져오는 방법을 설명합니다.
이 프로세스에서는 콘솔의 Cloud Shell을 사용하여 Cloud SQL에서 Spanner로 데이터베이스를 가져오는 Dataflow 작업을 구성하고 실행하는 명령어를 실행합니다. Google Cloud
프로세스 개요
가져오기 프로세스에는 다음이 포함됩니다.
- 소스 및 대상 데이터베이스에 관한 정보를 제공하는 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을 출력합니다.
제한사항
다음과 같은 제한사항이 적용됩니다.
- 이 데이터 가져오기는 단일 MySQL용 Cloud SQL 인스턴스만 지원합니다.
- 스키마 변환은 자동화되어 있으며 이 가져오기 중에 스키마를 조정할 수 없습니다.
- 이 데이터 가져오기는 일회성 대량 로드이며 지속적인 복제를 지원하지 않습니다.
시작하기 전에
데이터베이스를 가져오기 전에 다음 기본 요건을 완료하세요.
Cloud SQL 인스턴스에 공개 IP 주소와 비공개 IP 주소가 사용 설정되어 있는지 확인합니다. 자세한 내용은 공개 IP 연결 구성 및 비공개 IP 구성을 참고하세요.
데이터베이스를 쿼리하는 데 사용할 수 있는 Cloud SQL 인스턴스의 사용자 및 비밀번호를 만듭니다.
Secret Manager에 비밀번호를 저장합니다. 보안 비밀 버전의
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권한이 포함된 서비스 사용량 관리자 IAM 역할(roles/serviceusage.serviceUsageAdmin)이 필요합니다. 역할 부여 방법 알아보기
필요한 역할
기본 Compute Engine 서비스 계정에 Dataflow 작업을 실행하는 데 필요한 권한이 있는지 확인하려면 관리자에게 프로젝트의 기본 Compute Engine 서비스 계정에 다음 IAM 역할을 부여해 달라고 요청하세요.
-
Secret Manager 보안 비밀 접근자(
roles/secretmanager.secretAccessor) -
Cloud SQL 클라이언트 (
roles/cloudsql.client) -
Cloud Spanner 데이터베이스 관리자 (
roles/spanner.databaseAdmin) -
스토리지 객체 관리자(
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: 가져올 데이터 양을 지원할 수 있는 충분한 컴퓨팅 용량이 있어야 합니다. 최소 1개의 Spanner 노드로 시작하는 것이 좋습니다. 적당한 시간 안에 작업을 마치려면 컴퓨팅 용량을 더 추가해야 할 수도 있습니다. 데이터베이스 스키마를 가져오는 데 추가 컴퓨팅 용량이 필요하지는 않습니다. 자세한 내용은 자동 확장 개요를 참고하세요.
- Dataflow: 가져오기 작업에는 다른 Dataflow 작업과 동일한 CPU, 디스크 사용량, IP 주소 Compute Engine 할당량이 적용됩니다.
Compute Engine: 가져오기 작업을 실행하기 전에 Dataflow가 사용하는 Compute Engine에 초기 할당량을 설정해야 합니다. 이 할당량은 Dataflow가 작업에 사용할 수 있는 최대 리소스 수를 나타냅니다. 권장되는 시작 값은 다음과 같습니다.
- CPU: 200
- 사용 중인 IP 주소: 200
- 표준 영구 디스크: 50TB
일반적으로 다른 조정은 수행할 필요가 없습니다. Dataflow는 자동 확장을 제공하므로 가져오기 중에 사용된 실제 리소스에 대해서만 비용을 지불하면 됩니다. 작업에 더 많은 리소스가 사용될 수 있으면 Dataflow UI에 경고 아이콘이 표시됩니다. 경고 아이콘이 표시되더라도 작업은 완료됩니다.
Cloud SQL에서 Spanner로 가져오기
MySQL용 Cloud SQL 데이터베이스를 Spanner로 가져오려면 Google Cloud 콘솔에서 다음 단계를 따르세요.
Spanner 인스턴스 페이지로 이동합니다.
데이터베이스를 가져올 인스턴스의 이름을 클릭합니다.
Cloud SQL에서 가져오기 버튼을 클릭합니다.
Spanner에서 필요한 모든 API가 사용 설정되었는지 확인한 후 다음 버튼을 클릭합니다.
가져올 MySQL용 Cloud SQL 인스턴스를 선택한 다음 다음 버튼을 클릭합니다.
가져올 데이터베이스를 선택한 다음 다음 버튼을 클릭합니다. Spanner는 Cloud SQL 인스턴스의 공개 IP가 사용 설정되어 있는지 확인합니다.
사용자 이름과 비밀번호를 입력한 다음 다음 버튼을 클릭합니다.
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: 비밀번호가 포함된 보안 비밀의 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: Dataflow 출력 파일 및 구성 파일을 저장할 Cloud Storage 버킷의 이름
이 명령어는 기본 Compute 서비스 계정에 필요한 권한이 있는지 확인하고, Spanner 마이그레이션 도구를 설치하고, 스키마를 이전하고, Dataflow 작업을 시작합니다.
명령어가 완료되면 제공된 링크를 따라 Google Cloud 콘솔에서 Dataflow 작업을 모니터링합니다.
다음 단계
- 스키마를 업데이트하는 방법 알아보기