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. A AdventureWorks vende bicicletas e peças de bicicletas diretamente ao consumidor final e distribuidores há mais de uma década. Seus sistemas armazenam informações em um banco de dados que atualmente é 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 do Azure. Você foi solicitado a executar essa migração.

Importante

O Serviço de Migração de Dados do Azure não é suportado no ambiente seguro gratuito do Azure. Você pode executar essas 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

Esses comandos levarão aproximadamente 5 minutos para serem concluídos. Você não precisa esperar, você pode continuar com as etapas abaixo.

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

  1. Usando um navegador da Web, abra uma nova guia e navegue até o portal do Azure.

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

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

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

    Property valor
    Grupo de recursos migrate-postgresql
    Nome do servidor AdventureWorksNNN, onde nnn é um sufixo de sua escolha para tornar o nome do servidor exclusivo
    Localização Selecione a localização mais próxima de si
    Versão do PostgreSQL 13
    Computação + armazenamento Selecione Configurar servidor, selecione o nível de preço Básico e, em seguida, selecione OK
    Nome de utilizador de administrador awadmin
    Palavra-passe Pa55w.rdDemo
    Confirme a palavra-passe Pa55w.rdDemo
  5. Na página Rever + criar, selecione Criar. Aguarde a criação do serviço antes de continuar.

  6. Quando o serviço tiver sido criado, selecione Ir para 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 START IP ADDRESS e o END IP ADDRESS como o endereço IP da máquina virtual que executa o servidor PostgreSQL criado anteriormente.

  10. Selecione Adicionar endereço IP do cliente atual para permitir que sua máquina cliente se conecte ao banco de dados.

  11. Guarde e aguarde até que as regras de firewall sejam atualizadas.

  12. No prompt do Cloud Shell, execute o seguinte comando para criar um novo banco de dados em seu serviço Banco de Dados do Azure para PostgreSQL. Substitua [nnn] pelo sufixo usado quando criou o Banco de Dados do Azure para o serviço 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ê 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á à sua VM PostgreSQL existente usando o Cloud Shell para exportar seu esquema de banco de dados.

  1. Execute este comando da CLI do Azure para ver o endereço IP da sua 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 seu antigo servidor de banco de dados usando SSH. Digite Pa55w.rdDemo para a senha.

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

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

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

  6. No prompt 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 seguinte comando 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 seguintes comandos para criar um usuário chamado azureuser e defina a senha para esse usuário como Pa55w.rd. A terceira instrução dá 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 serviço Banco de Dados do Azure para PostgreSQL. Você está executando a importação como azureuser, portanto, digite 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 é criado. O script deve ser concluído sem erros.

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

    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 seguinte comando. 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, à medida que as chaves estrangeiras são descartadas.

  8. Estabeleça o utilitário psql novamente 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 seguinte consulta para localizar os detalhes de quaisquer 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, para cada chave estrangeira, execute o seguinte comando:

    ALTER TABLE [table_schema].[table_name] DROP CONSTRAINT [constraint_name];
    
  10. Depois de remover todas 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 contivesse gatilhos, você teria que desativá-los antes de migrar os dados e reativá-los depois.

  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. Regresse ao portal do Azure.

  2. Selecione Todos os serviços, selecione Subscrições e, em seguida, selecione a sua subscrição.

  3. Na página da sua subscrição, em Definições, selecione Fornecedores de recursos.

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

  5. Se o Microsoft.DataMigration não estiver registrado, selecione Registrar e aguarde até que o Status mude para Registrado. Pode ser necessário selecionar Atualizar para ver a alteração de status.

  6. Selecione 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 página 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 selecione Avançar: Rede>>.

    Property valor
    Selecionar um grupo de recursos migrate-postgresql
    Service name adventureworks_migration_service
    Localização Selecione a localização mais próxima de si
    Modo de serviço Azure
    Escalão de preço Premium, com 4 vCores
  9. Na página Rede, selecione a rede virtual postgresqlvnet/posgresqlvmSubnet. Esta rede foi criada como parte da configuração.

  10. Selecione Rever + criar e, em seguida, selecione Criar. Aguarde enquanto o Serviço de Migração de Banco de Dados é criado. Esta operação irá demorar alguns minutos.

  11. Quando o serviço tiver sido criado, selecione Ir para recurso.

  12. Selecione Novo projeto de migração.

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

    Property valor
    Nome do projeto adventureworks_migration_project
    Tipo do servidor de origem PostgreSQL
    Banco de dados de destino para PostgreSQL Base de Dados do Azure para PostgreSQL
    Escolher tipo de atividade Migração de dados online
  14. Quando o Assistente de Migração for iniciado, na página Selecionar origem, insira os seguintes detalhes e selecione Avançar: Selecionar destino>>.

    Property valor
    Nome do servidor de origem nn.nn.nn.nn (O endereço IP da máquina virtual do Azure que executa o PostgreSQL)
    Porta do servidor 5432
    Base de dados Trabalhos de Aventura
    Nome de Utilizador azureuser
    Palavra-passe Pa55w.rd
    Certificado de servidor fidedigno Selecionados
    Encriptar ligação Selecionados
  15. Na página Selecionar destino, insira os seguintes detalhes e selecione Avançar: Selecionar bancos de dados>>.

    Property valor
    Azure PostgreSQL AdventureWorks[NNN]
    Base de dados AzureAdventureWorks
    Nome de Utilizador azureuser@adventureworks[nnn]
    Palavra-passe Pa55w.rd
  16. Na página Selecionar bancos de dados, selecione o banco de dados AdventureWorks e mapeie-o para o AzureAdventureWorks. Desmarque o banco de dados postgres . Selecione Avançar: Selecionar tabelas>>.

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

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

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

  20. Na página AdventureWorks_Migration_Activity, selecione Atualizar em intervalos de 15 segundos. Você verá o status da operação de migração à medida que ela progride. Aguarde até que a coluna DETALHES DA MIGRAÇÃO mude para Pronto para substituição.

  21. Volte para o Cloud Shell.

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

    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 são adicionadas. Você pode ver um erro em relação à tabela SpecialOfferProduct , que você pode ignorar por enquanto. Isso ocorre devido a uma restrição UNIQUE que não é transferida corretamente. No mundo real, 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';
    

    Em seguida, você pode restabelecer manualmente essa restrição no banco de dados de destino no Banco de Dados do Azure para PostgreSQL.

    Não deve haver outros erros.

Modificar dados e transferir para o novo banco de dados

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

  2. Selecione o banco de dados adventureworks .

  3. Na página adventureworks, verifique se o valor Carga completa concluída é 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, em seguida, remova 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. Retorne à página adventureworks no portal do Azure e selecione Atualizar. Verifique se 32 alterações foram aplicadas.

  9. Selecione Iniciar substituição.

  10. Na página Substituição completa, selecione Confirmar e, em seguida, selecione Aplicar. Aguarde até que o status mude para Concluído.

  11. Regresse ao Cloud Shell.

  12. Execute o seguinte comando para se conectar ao banco de dados azureadventureworks em execução usando seu serviço 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 detalhes do pedido no banco de dados. Feche após a primeira página de cada tabela. O objetivo destas 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 os pedidos e 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 linhas.

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

Limpe os recursos que você criou

Importante

Se você executou essas etapas em sua própria assinatura pessoal, poderá excluir os recursos individualmente ou excluir o grupo de recursos para excluir todo o conjunto de recursos. Os recursos que deixar em execução podem custar dinheiro.

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