Exercício: migrar um banco de dados PostgreSQL local para o Banco de Dados do Azure para PostgreSQL

Concluído

Neste exercício, você migrará um banco de dados PostgreSQL para o Azure. Você migrará um banco de dados PostgreSQL existente em execução em uma máquina virtual para o Banco de Dados do Azure para PostgreSQL.

Você trabalha como desenvolvedor de banco de dados para a organização AdventureWorks. Há mais de uma década, a AdventureWorks vende bicicletas e peças diretamente para distribuidores e consumidores finais. Os sistemas dela armazenam informações em um banco de dados que, no momento, é executado usando o PostgreSQL em uma VM do Azure. Como parte de um exercício de racionalização de hardware, a AdventureWorks deseja mover o banco de dados para um banco de dados gerenciado pelo Azure. Você foi convidado a executar essa migração.

Importante

O Serviço de Migração de Dados do Azure não tem suporte no ambiente de área restrita gratuito do Azure. Você pode executar estas etapas em sua própria assinatura pessoal ou apenas acompanhar para entender como migrar seu banco de dados.

Configurar o ambiente

Execute esses comandos da CLI do Azure no Cloud Shell para criar uma máquina virtual, executando o PostgreSQL, com uma cópia do banco de dados adventureworks. Os últimos comandos imprimirão o endereço IP da nova máquina virtual.

az account list-locations -o table

az group create \
    --name migrate-postgresql \
    --location <CHOOSE A LOCATION FROM ABOVE NEAR YOU>

az vm create \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --admin-username azureuser \
    --admin-password Pa55w.rdDemo \
    --image Ubuntu2204 \
    --public-ip-address-allocation static \
    --public-ip-sku Standard \
    --vnet-name postgresqlvnet \
    --nsg ""

az vm run-command invoke \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --command-id RunShellScript \
    --scripts "
# Install PostgreSQL
sudo echo deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main > /etc/apt/sources.list.d/pgdg.list
sudo wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get -y update
sudo apt-get -y install postgresql-10
# Clone exercise code
sudo git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git /home/azureuser/workshop    
# Configure PostgreSQL
sudo service postgresql stop
sudo bash << EOF
    printf \"listen_addresses = '*'\nwal_level = logical\nmax_replication_slots = 5\nmax_wal_senders = 10\n\" >> /etc/postgresql/10/main/postgresql.conf
    printf \"host    all             all             0.0.0.0/0               md5\n\" >> /etc/postgresql/10/main/pg_hba.conf
EOF
sudo service postgresql start

# Add the azureuser role and adventure works
sudo bash << EOF
su postgres << EOC
printf \"create role azureuser with login;alter role azureuser createdb;alter role azureuser password 'Pa55w.rd';alter role azureuser superuser;create database adventureworks;grant all privileges on database adventureworks to azureuser; \" | psql
EOC
EOF

PGPASSWORD=Pa55w.rd psql -h localhost -U azureuser adventureworks -E -q -f /home/azureuser/workshop/migration_samples/setup/postgresql/adventureworks/adventureworks.sql
"

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 200 \
    --port '22'

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 300 \
    --port '5432'

echo Setup Complete

SQLIP="$(az vm list-ip-addresses \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
    --output tsv)"

echo $SQLIP

A execução desses comandos levará cerca de 5 minutos para ser concluída. Você não precisa esperar, pode continuar com as etapas abaixo.

Criar o servidor flexível do Banco de Dados do Azure para PostgreSQL

  1. Abra uma nova guia e navegue até o portal do Azure.

  2. Na barra de pesquisa, digite Servidores flexíveis do Banco de Dados do Azure para PostgreSQL.

  3. Na página Servidores flexíveis do Banco de Dados do Azure para PostgreSQL, selecione + Criar.

  4. Na página Servidor flexível, insira os seguintes detalhes e, em seguida, selecione Examinar + criar:

    Propriedade Valor
    Resource group migrate-postgresql
    Nome do servidor adventureworksnnn, em que nnn é um sufixo da sua escolha para que o nome do servidor seja exclusivo
    Localização Selecione sua localização mais próxima
    Versão do PostgreSQL 13
    Computação + armazenamento Selecione Configurar servidor, selecione o tipo de preço Básico e OK
    Nome de usuário do administrador awadmin
    Senha Pa55w.rdDemo
    Confirmar senha Pa55w.rdDemo
  5. Na página Examinar + criar escolha Criar. Aguarde a criação do serviço antes de continuar.

  6. Após a criação do serviço, escolha Ir para o recurso.

  7. Selecione Segurança da conexão.

  8. Na página Segurança da conexão, defina Permitir acesso aos serviços do Azure como Sim.

  9. Na lista de regras de firewall, adicione uma regra chamada VM e defina o ENDEREÇO IP INICIAL e o ENDEREÇO IP FINAL para o endereço IP da máquina virtual que está executando o servidor PostgreSQL que você criou antes.

  10. Escolha Adicionar endereço IP do cliente atual para habilitar o computador cliente para se conectar ao banco de dados.

  11. Salve e aguarde a atualização das regras de firewall.

  12. No prompt do Cloud Shell, execute o comando a seguir para criar um banco de dados no serviço de Banco de Dados do Azure para PostgreSQL. Substitua [nnn] pelo sufixo usado quando você criou o serviço Banco de Dados do Azure para PostgreSQL. Substitua [grupo de recursos] pelo nome do grupo de recursos especificado para o serviço:

    az postgres flexible-server create \
      --name azureadventureworks \
      --resource-group migrate-postgresql
    

    Se o banco de dados for criado com êxito, você deverá ver uma mensagem semelhante à seguinte:

    {
      "charset": "UTF8",
      "collation": "English_United States.1252",
      "name": "azureadventureworks",
      "resourceGroup": "migrate-postgresql",
      "type": "Microsoft.DBforPostgreSQL/servers/databases"
    }
    

Exportar o esquema a ser usado no banco de dados de destino

Agora você se conectará à VM PostgreSQL existente usando o Cloud Shell para exportar o esquema de banco de dados.

  1. Execute este comando da CLI do Azure para ver o endereço IP da VM existente.

    SQLIP="$(az vm list-ip-addresses \
        --resource-group migrate-postgresql \
        --name postgresqlvm \
        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
        --output tsv)"
    
    echo $SQLIP
    
  2. Conecte-se ao servidor de banco de dados antigo usando SSH. Na senha, insira Pa55w.rdDemo.

    ssh azureuser@$SQLIP
    
  3. Execute o comando a seguir para se conectar ao banco de dados na máquina virtual. A senha do usuário azureuser no servidor PostgreSQL em execução na máquina virtual é Pa55w.rd:

    psql adventureworks
    
  4. Conceda permissão de replicação para azureuser:

    ALTER ROLE azureuser REPLICATION;
    
  5. Feche o utilitário psql com o comando \q.

  6. No prompt do bash, execute o seguinte comando para exportar o esquema do banco de dados adventureworks para um arquivo chamado adventureworks_schema.sql

    pg_dump -o  -d adventureworks -s > adventureworks_schema.sql
    

Importar o esquema para o banco de dados de destino

  1. Execute o comando a seguir para se conectar ao servidor azureadventureworks[nnn]. Substitua as duas instâncias de [nnn] pelo sufixo do seu serviço. Observe que o nome de usuário tem o sufixo @adventureworks[nnn]. No prompt de senha, digite Pa55w.rdDemo.

    psql -h adventureworks[nnn].postgres.database.azure.com -U awadmin@adventureworks[nnn] -d postgres
    
  2. Execute os comandos a seguir para criar um usuário chamado azureuser e defina a senha desse usuário como Pa55w.rd. A terceira instrução fornece ao usuário azureuser os privilégios necessários para criar e gerenciar objetos no banco de dados azureadventureworks. A função azure_pg_admin permite que o usuário azureuser instale e use extensões no banco de dados.

    CREATE ROLE azureuser WITH LOGIN;
    ALTER ROLE azureuser PASSWORD 'Pa55w.rd';
    GRANT ALL PRIVILEGES ON DATABASE azureadventureworks TO azureuser;
    GRANT azure_pg_admin TO azureuser;
    
  3. Feche o utilitário psql com o comando \q.

  4. Importe o esquema do banco de dados adventureworks para o banco de dados azureadventureworks em execução no seu serviço do Banco de Dados do Azure para PostgreSQL. Você está executando a importação como azureuser, portanto, insira a senha Pa55w.rd quando solicitado.

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -E -q -f adventureworks_schema.sql
    

    Você verá uma série de mensagens à medida que cada item for criado. O script deve ser concluído sem erros.

  5. Execute o comando a seguir. O script findkeys.sql gera outro script SQL chamado dropkeys.sql, que removerá todas as chaves estrangeiras das tabelas no banco de dados azureadventureworks. Em breve, você executará o script dropkeys.sql:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/findkeys.sql -o dropkeys.sql -t
    
  6. Execute o comando a seguir. O script createkeys.sql gera outro script SQL chamado addkeys.sql, que recriará todas as chaves estrangeiras. Você executará o script addkeys.sql depois de migrar o banco de dados:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/createkeys.sql -o addkeys.sql -t
    
  7. Execute o script dropkeys.sql:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f dropkeys.sql
    

    Você verá uma série de mensagens ALTER TABLE exibidas, pois as chaves estrangeiras serão removidas.

  8. Reinicie o utilitário psql e conecte-se ao banco de dados azureadventureworks.

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    
  9. Execute a consulta a seguir para encontrar os detalhes de todas as chaves estrangeiras restantes:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'FOREIGN KEY';
    

    Essa consulta deve retornar um conjunto de resultados vazio. No entanto, se ainda existirem chaves estrangeiras, execute o seguinte comando para cada chave estrangeira:

    ALTER TABLE [table_schema].[table_name] DROP CONSTRAINT [constraint_name];
    
  10. Depois de ter removido as chaves estrangeiras restantes, execute a seguinte instrução SQL para exibir os gatilhos no banco de dados:

    SELECT trigger_name
    FROM information_schema.triggers;
    

    Essa consulta também deve retornar um conjunto de resultados vazio, indicando que o banco de dados não contém gatilhos. Se o banco de dados contiver disparadores, você precisará desabilitá-los antes de migrar e reabilitá-los posteriormente.

  11. Feche o utilitário psql com o comando \q.

Executar uma migração online usando o Serviço de Migração de Banco de Dados

  1. Alterne novamente para o portal do Azure.

  2. Escolha Todos os serviços e Assinaturase depois escolha sua assinatura.

  3. Na página da sua assinatura, em Configurações, escolha Provedores de recursos.

  4. Na caixa Filtrar por nome, digite DataMigration e escolha Microsoft.DataMigration.

  5. Se o Microsoft.DataMigration não estiver registrado, escolha Registrar e aguarde o Status ser alterado para Registrado. Pode ser necessário escolher Atualizar para ver a mudança do status.

  6. Escolha Criar um recurso, na caixa Pesquisar no Marketplace, digite Serviço de Migração de Banco de Dados do Azure e pressione Enter.

  7. Na tela Serviço de Migração de Banco de Dados do Azure, selecione Criar.

  8. Na página Criar serviço de migração, insira os seguintes detalhes e escolha Avançar: Rede>>.

    Propriedade Valor
    Selecionar um grupo de recursos migrate-postgresql
    Nome do serviço adventureworks_migration_service
    Localização Selecione sua localização mais próxima
    Modo de serviço Azure
    Tipo de preço Premium, com 4 vCores
  9. Na página Rede, escolha a rede virtual postgresqlvnet/posgresqlvmSubnet. Essa rede foi criada como parte da instalação.

  10. Selecione Examinar + criar e Criar. Aguarde a criação do Serviço de Migração de Banco de Dados. Isto pode levar alguns minutos.

  11. Após a criação do serviço, escolha Ir para o recurso.

  12. Selecione Novo projeto de migração.

  13. Na página Novo projeto de migração, insira os detalhes a seguir e selecione Criar e executar atividade.

    Propriedade Valor
    Nome do projeto adventureworks_migration_project
    Tipo do servidor de origem PostgreSQL
    Banco de Dados do Azure para PostgreSQL de destino Banco de Dados do Azure para PostgreSQL
    Escolher o tipo de atividade Migração de dados online
  14. Quando o Assistente de migração for iniciado, na página Selecionar origem, insira os detalhes a seguir e escolha Avançar: Selecionar o destino>>.

    Propriedade Valor
    Nome do servidor de origem nn.nn.nn.nn (O endereço IP da máquina virtual do Azure que está executando o PostgreSQL)
    Porta do servidor 5432
    Banco de dados adventureworks
    Nome do Usuário azureuser
    Senha Pa55w.rd
    Confiar em certificado do servidor Selected
    Criptografar conexão Selected
  15. Na página Selecionar destino, insira os seguintes detalhes e, em seguida, escolha Avançar: Selecionar os bancos de dados>>.

    Propriedade Valor
    PostgreSQL do Azure adventureworks[nnn]
    Banco de dados azureadventureworks
    Nome do Usuário azureuser@adventureworks[nnn]
    Senha Pa55w.rd
  16. na página Selecionar bancos de dados, escolha o banco de dados adventureworks e mapeie-o para azureadventureworks. Desmarque o banco de dados postgres. Escolha Avançar: Selecionar as tabelas>>.

  17. Na página Selecionar tabelas, escolha Avançar: Definir configurações de migração>>.

  18. Na página Definir configurações de migração, expanda a lista suspensa adventureworks, expanda a lista suspensa de configurações avançadas de migração online, verifique se o Número máximo de instâncias a serem carregadas em paralelo está definido como 5 e, em seguida, escolha Avançar: Resumo >>.

  19. Na página Resumo, na caixa Nome da atividade, digite AdventureWorks_Migration_Activity e escolha Iniciar migração.

  20. Na página AdventureWorks_Migration_Activity, escolha Atualizar em intervalos de 15 segundos. Você verá o status da operação de migração conforme ela avança. Aguarde a coluna DETALHES DA MIGRAÇÃO mudar para Pronto para substituição.

  21. Volte para o Cloud Shell.

  22. Execute o comando a seguir para recriar as chaves estrangeiras no banco de dados azureadventureworks. Você gerou o script addkeys.sql anterior:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f addkeys.sql
    

    Você verá uma série de instruções ALTER TABLE à medida que as chaves estrangeiras forem adicionadas. Talvez você veja um erro em relação à tabela SpecialOfferProduct, que você pode ignorar por enquanto. Isso se deve a uma restrição exclusiva que não é transferida corretamente. Na prática, você deve recuperar os detalhes dessa restrição do banco de dados de origem usando a seguinte consulta:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'UNIQUE';
    

    Você pode reabilitar manualmente essa restrição no banco de dados de destino no Banco de Dados do Azure para PostgreSQL.

    Não deve haver nenhum outro erro.

Mudar dados e fazer a substituição para o novo banco de dados

  1. Retorne à página AdventureWorks_Migration_Activity no portal do Azure.

  2. Escolha o banco de dados adventureworks.

  3. Na página adventureworks, verifique se o valor de Carregamento completo concluído é 66 e se todos os outros valores são 0.

  4. Volte para o Cloud Shell.

  5. Execute o seguinte comando para se conectar ao banco de dados adventureworks em execução usando o PostgreSQL na máquina virtual:

    psql adventureworks
    
  6. Execute as seguintes instruções SQL para exibir e depois remover as ordens 43659, 43660 e 43661 do banco de dados. Observe que o banco de dados implementa uma exclusão em cascata na tabela salesorderheader, que exclui automaticamente as linhas correspondentes da tabela salesorderdetail.

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    DELETE FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    
  7. Feche o utilitário psql com o comando \q.

  8. Volte para a página adventureworks no portal do Azure e escolha Atualizar. Verifique se 32 alterações foram aplicadas.

  9. Escolha Iniciar substituição.

  10. Na página Concluir a substituição, escolha Confirmar e Aplicar. Aguarde o status mudar para Concluído.

  11. Retorne ao Cloud Shell.

  12. Execute o seguinte comando para se conectar ao banco de dados azureadventureworks em execução usando seu serviço de Banco de Dados do Azure para PostgreSQL:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    

    A senha é Pa55w.rd.

  13. Execute as seguintes instruções SQL para exibir os pedidos e os detalhes do pedido no banco de dados. Encerrar após a primeira página de cada tabela. A finalidade dessas consultas é mostrar que os dados foram transferidos:

    SELECT * FROM sales.salesorderheader;
    SELECT * FROM sales.salesorderdetail;
    
  14. Execute as instruções SQL a seguir para exibir as ordens e os detalhes dos pedidos 43659, 43660 e 43661.

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    

    Ambas as consultas devem retornar 0 linha.

  15. Feche o utilitário psql com o comando \q.

Limpar os recursos que você criou

Importante

Se você tiver executado essas etapas em sua assinatura pessoal, poderá excluir os recursos individualmente ou excluir o grupo de recursos para eliminar o conjunto inteiro de recursos. Recursos deixados em execução podem custar dinheiro.

  1. No Cloud Shell, execute o seguinte comando para excluir o grupo de recursos:
az group delete --name migrate-postgresql