Nesta página, descrevemos como importar dados do Cloud SQL para MySQL para o Spanner.
O processo usa o Cloud Shell on Google Cloud console para executar comandos que configuram e executam um job do Dataflow para importar um banco de dados do Cloud SQL para o Spanner.
Visão geral do processo
O processo de importação envolve o seguinte:
- Você conclui um Google Cloud fluxo de trabalho doconsole em que fornece informações sobre
os bancos de dados de origem e destino:
- Detalhes do banco de dados de origem: nome da instância do Cloud SQL, nome do banco de dados, e suas credenciais.
- Detalhes do Spanner: nome da instância do Spanner e nome do banco de dados. O comando cria o banco de dados se ele ainda não existir.
- Armazenamento de saída: um nome de bucket do Cloud Storage para armazenar arquivos de saída.
- O Spanner abre o Cloud Shell e preenche um comando. O comando executa as seguintes ações:
- Migra o esquema: o comando migra o esquema usando a ferramenta de migração do Spanner. Essa migração é executada no Cloud Shell e usa um endereço IP público para se conectar à instância do Cloud SQL. Como o Cloud Shell está na própria rede, ele precisa de acesso ao Cloud SQL usando o endereço IP público. No entanto, não é necessário permitir nenhuma sub-rede em relação ao endereço IP público.
- Inicia uma migração de dados: depois que a ferramenta migra o esquema, o comando inicia um job do Dataflow para migração de dados. O job lê diretamente do banco de dados de origem pelo endereço IP particular e grava no Spanner. Esse job é executado usando a conta de serviço padrão do Compute Engine. Por fim, o comando imprime o URL do job do Dataflow.
Limitações
Considere as seguintes limitações:
- Essa importação de dados só oferece suporte a uma única instância do Cloud SQL para MySQL.
- A conversão de esquema é automatizada. Não é possível fazer ajustes no esquema durante essa importação.
- Essa importação de dados é um carregamento em massa único. Ela não oferece suporte à replicação contínua.
Antes de começar
Antes de importar o banco de dados, conclua os seguintes pré-requisitos:
Verifique se a instância do Cloud SQL tem um endereço IP público e um endereço IP particular ativados. Para mais informações, consulte Configurar a conectividade de IP público e Configurar o IP particular.
Crie um usuário e uma senha para a instância do Cloud SQL que possam ser usados para consultar o banco de dados.
Armazene a senha no Secret Manager. Você precisa do
version IDda versão do secret. Para mais informações, consulte Criar um secret.Verifique se você tem um bucket do Cloud Storage. O Dataflow usa esse bucket para armazenar arquivos de configuração e saídas dos jobs do Dataflow.
Verifique se o Spanner e o Cloud SQL estão no mesmo Google Cloud projeto.
Ative as APIs Dataflow, Cloud Storage, Spanner, Cloud SQL e Secret Manager.
Funções necessárias para ativar APIs
Para ativar as APIs, é necessário ter o papel do IAM de administrador de uso do serviço (
roles/serviceusage.serviceUsageAdmin), que contém a permissãoserviceusage.services.enable. Saiba como conceder papéis.
Funções exigidas
Para garantir que a conta de serviço padrão do Compute Engine tenha as permissões necessárias para executar o job do Dataflow, peça ao administrador para conceder os seguintes papéis do IAM à conta de serviço padrão do Compute Engine no projeto:
-
Acessador de secrets do Secret Manager (
roles/secretmanager.secretAccessor) -
Cliente do Cloud SQL (
roles/cloudsql.client) -
Administrador do banco de dados do Cloud Spanner (
roles/spanner.databaseAdmin) -
Administrador de objetos do Storage (
roles/storage.objectAdmin) -
Worker do Dataflow (
roles/dataflow.worker)
Para receber as permissões necessárias para configurar a importação, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:
-
Cliente do Cloud SQL (
roles/cloudsql.client) -
Administrador do banco de dados do Cloud Spanner (
roles/spanner.databaseAdmin) -
Acessador de secrets do Secret Manager (
roles/secretmanager.secretAccessor) -
Administrador de armazenamento (
roles/storage.admin) -
Desenvolvedor do Dataflow (
roles/dataflow.developer) -
Usuário da conta de serviço (
roles/iam.serviceAccountUser)
Esses papéis predefinidos contêm as permissões necessárias para configurar a importação. Para acessar as permissões exatas que são necessárias, expanda a seção Permissões necessárias:
Permissões necessárias
As permissões a seguir são necessárias para configurar a importação:
-
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
Requisitos de cota
Os requisitos de cota são os seguintes:
- Spanner: é preciso ter capacidade de computação suficiente para aceitar a quantidade de dados que você está importando. Recomendamos começar com um mínimo de um nó do Spanner. Talvez seja necessário adicionar mais capacidade de computação para que o job seja concluído em um período razoável. Nenhuma capacidade de computação extra é necessária para importar um esquema de banco de dados. Para mais informações, consulte Visão geral do escalonamento automático.
- Dataflow: os jobs de importação estão sujeitos às mesmas cotas do Compute Engine para endereço IP, uso da CPU e do disco aplicadas a outros jobs do Dataflow.
Compute Engine: antes de executar um job de importação, é necessário configurar cotas iniciais para o Compute Engine, que serão usadas pelo Dataflow. Essas cotas representam o número máximo de recursos que você permite que o Dataflow use para seu job. Os valores iniciais recomendados são:
- CPUs: 200
- Endereços IP em uso: 200
- Disco permanente padrão: 50 TB
Geralmente, não é necessário fazer outros ajustes. O Dataflow fornece escalonamento automático para que você pague apenas pelos recursos efetivamente utilizados durante a importação. Se seu job puder usar mais recursos, a IU do Dataflow exibirá um ícone de aviso. O job pode ser concluído mesmo que haja um ícone de aviso.
Importar do Cloud SQL para o Spanner
Para importar um banco de dados do Cloud SQL para MySQL para o Spanner, faça o seguinte no Google Cloud console:
Acesse a página Instâncias do Spanner.
Clique no nome da instância em que o banco de dados precisa ser importado.
Clique no botão Importar do Cloud SQL.
Depois que o Spanner verificar se todas as APIs necessárias estão ativadas, clique no botão Próximo.
Selecione a instância do Cloud SQL para MySQL a ser importada e clique no botão Próximo.
Selecione o banco de dados a ser importado e clique no botão Próximo. O Spanner verifica se o IP público da instância do Cloud SQL está ativado.
Insira o nome de usuário e o secret e clique no botão Próximo.
Navegue e selecione o bucket do Cloud Storage e clique no botão Próximo.
Insira o nome do banco de dados do Spanner e clique no botão Importar. O Spanner abre o Cloud Shell e preenche um comando.
Execute o comando preenchido automaticamente para iniciar a importação:
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 "--------------------------------------------------------"Os parâmetros a seguir são fornecidos pelo Google Cloud console ao comando:
SOURCE_DATABASE_NAME: o nome do banco de dados de origem do Cloud SQLSOURCE_DATABASE_USER: o nome de usuário do banco de dados de origem do Cloud SQLPROJECT_ID: o ID do seu Google Cloud projetoSECRET_ID: o ID do secret que contém a senhaVERSION: a versão do secretSOURCE_PROJECT_ID: o ID do projeto que contém a instância de origem do Cloud SQLSOURCE_REGION: a região da instância de origem do Cloud SQLSOURCE_INSTANCE_NAME: o nome da instância de origem do Cloud SQLSOURCE_PRIVATE_IP: o endereço IP particular da instância do Cloud SQLNETWORK_NAME: o nome da rede da instância de origem do Cloud SQLSUBNETWORK_NAME: o nome da sub-rede da instância de origem do Cloud SQLSPANNER_PROJECT_ID: o ID do projeto que contém a instância de destino do SpannerSPANNER_INSTANCE_ID: o ID da instância de destino do SpannerSPANNER_DATABASE_ID: o ID do banco de dados de destino do Spanner, que o Spanner cria se ele não existirBUCKET_NAME: o nome do bucket do Cloud Storage para armazenar arquivos de saída e de configuração do Dataflow
O comando verifica se a conta de serviço de computação padrão tem as permissões necessárias, instala a ferramenta de migração do Spanner, migra o esquema e inicia o job do Dataflow.
Depois que o comando terminar, siga o link fornecido para monitorar o job do Dataflow no Google Cloud console.
A seguir
- Saiba como fazer atualizações de esquema.