Esercizio - Eseguire la migrazione di un database PostgreSQL locale in Database di Azure per PostgreSQL

Completato

In questo esercizio si eseguirà la migrazione di un database PostgreSQL in Azure. Un database PostgreSQL esistente, in esecuzione su una macchina virtuale, verrà migrato in Database di Azure per PostgreSQL.

Si supponga di lavorare come sviluppatore di database per l'organizzazione AdventureWorks. Da oltre dieci anni, questa organizzazione si occupa della vendita di biciclette e di parti di biciclette direttamente ai clienti finali e ai distributori. I sistemi archiviano le informazioni in un database che attualmente viene eseguito usando PostgreSQL su una macchina virtuale di Azure. Nell'ambito di un progetto di razionalizzazione dell'hardware, AdventureWorks intende spostare il database in un database gestito di Azure. Si è ricevuto l'incarico di eseguire la migrazione.

Importante

Il Servizio Migrazione del database di Azure non è supportato nell'ambiente sandbox di Azure gratuito. È possibile eseguire questi passaggi nella propria sottoscrizione o semplicemente leggere la procedura per comprendere come eseguire la migrazione del database.

Configurare l'ambiente

Eseguire i comandi seguenti dell'interfaccia della riga di comando di Azure in Cloud Shell per creare una macchina virtuale, che esegue PostgreSQL, con una copia del database di AdventureWorks. Gli ultimi comandi mostreranno l'indirizzo IP della nuova macchina virtuale.

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

Il completamento di questi comandi richiederà circa 5 minuti. Non è necessario attendere. È possibile continuare con la procedura seguente.

Creare il server flessibile di Database di Azure per PostgreSQL

  1. Usando un Web browser, aprire una nuova scheda e passare al portale di Azure.

  2. Nella barra di ricerca digitare Server flessibili di Database di Azure per PostgreSQL.

  3. Nella pagina Server flessibili di Database di Azure per PostgreSQL selezionare + Crea.

  4. Nella pagina Server flessibile inserire i dettagli seguenti e quindi selezionare Rivedi e crea:

    Proprietà valore
    Gruppo di risorse migrate-postgresql
    Nome server adventureworksnnn, dove nnn è un suffisso di propria scelta per rendere univoco il nome del server
    Ufficio Selezionare la posizione più vicina
    Versione di PostgreSQL 13
    Calcolo e archiviazione Selezionare Configura server, quindi il piano tariffario Basic e infine OK
    Nome utente amministratore awadmin
    Password Pa55w.rdDemo
    Conferma password Pa55w.rdDemo
  5. Nella pagina Rivedi e crea selezionare Crea. Prima di continuare, attendere che il servizio sia stato creato.

  6. Una volta creato il servizio, selezionare Vai alla risorsa.

  7. Selezionare Sicurezza delle connessioni.

  8. Nella pagina Sicurezza delle connessioni impostare Consenti l'accesso a Servizi di Azure su .

  9. Nell'elenco delle regole del firewall aggiungere una regola denominata VM e quindi impostare INDIRIZZO IP INIZIALE e INDIRIZZO IP FINALE sull'indirizzo IP della macchina virtuale che esegue il server PostgreSQL creato in precedenza.

  10. Selezionare Aggiungi indirizzo IP client corrente per consentire al computer client di connettersi al database.

  11. Scegliere Salva e attendere l'aggiornamento delle regole del firewall.

  12. Al prompt di Cloud Shell eseguire il comando seguente per creare un nuovo database nel servizio Database di Azure per PostgreSQL. Sostituire [nnn] con il suffisso usato al momento della creazione del servizio Database di Azure per PostgreSQL. Sostituire [resource group] con il nome del gruppo di risorse specificato per il servizio:

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

    Se il database viene creato correttamente, dovrebbe essere visualizzato un messaggio simile al seguente:

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

Esportare lo schema da usare nel database di destinazione

A questo punto è possibile connettersi alla macchina virtuale PostgreSQL esistente usando Cloud Shell per esportare lo schema del database.

  1. Eseguire questo comando dell'interfaccia della riga di comando di Azure per visualizzare l'indirizzo IP relativo alla macchina virtuale esistente.

    SQLIP="$(az vm list-ip-addresses \
        --resource-group migrate-postgresql \
        --name postgresqlvm \
        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
        --output tsv)"
    
    echo $SQLIP
    
  2. Connettersi al server di database precedente usando SSH. Immettere Pa55w.rdDemo come password.

    ssh azureuser@$SQLIP
    
  3. Eseguire il comando seguente per connettersi al database nella macchina virtuale. La password per l'utente azureuser nel server PostgreSQL in esecuzione nella macchina virtuale è Pa55w.Rd:

    psql adventureworks
    
  4. Concedere l'autorizzazione di replica ad azureuser:

    ALTER ROLE azureuser REPLICATION;
    
  5. Chiudere l'utilità psql con il comando \q.

  6. Al prompt di Bash, eseguire il comando seguente per esportare lo schema del database adventureworks in un file denominato adventureworks_schema.sql

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

Importare lo schema nel database di destinazione

  1. Eseguire il comando seguente per connettersi al server azureadventureworks[nnn]. Sostituire le due istanze di [nnn] con il suffisso relativo al servizio. Si noti che il nome utente ha il suffisso @adventureworks[nnn]. Quando viene richiesta la password, immettere Pa55w.rdDemo.

    psql -h adventureworks[nnn].postgres.database.azure.com -U awadmin@adventureworks[nnn] -d postgres
    
  2. Eseguire i comandi seguenti per creare un utente denominato azureuser e impostare la password corrispondente su Pa55w.rd. La terza istruzione concede all'utente azureuser i privilegi necessari per creare e gestire oggetti nel database azureadventureworks. Il ruolo azure_pg_admin consente all'utente azureuser di installare e usare estensioni nel database.

    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. Chiudere l'utilità psql con il comando \q.

  4. Importare lo schema per il database adventureworks nel database di azureadventureworks in esecuzione nel servizio Database di Azure per PostgreSQL. Si sta eseguendo l'importazione come azureuser, quindi immettere la password Pa55w.rd quando viene richiesta.

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

    Verrà visualizzata una serie di messaggi man mano che ogni elemento viene creato. Lo script dovrebbe essere completato senza errori.

  5. Esegui il comando seguente: Lo script findkeys.sql genera un altro script SQL denominato dropkeys.sql che rimuoverà tutte le chiavi esterne dalle tabelle nel database azureadventureworks. Si eseguirà lo script dropkeys.sql a 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. Esegui il comando seguente: Lo script createkeys.sql genera un altro script SQL denominato addkeys.sql che creerà nuovamente tutte le chiavi esterne. Si eseguirà lo script addKeys.sql dopo la migrazione del database:

    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. Eseguire lo script dropkeys.sql:

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

    Verrà visualizzata una serie di messaggi ALTER TABLE mentre le chiavi esterne vengono eliminate.

  8. Avviare nuovamente l'utilità psql e connettersi al database azureadventureworks.

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    
  9. Eseguire la query seguente per cercare i dettagli delle chiavi esterne rimanenti:

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

    La query dovrebbe restituire un set di risultati vuoto. Se tuttavia sono ancora presenti chiavi esterne, eseguire il comando seguente per ogni chiave:

    ALTER TABLE [table_schema].[table_name] DROP CONSTRAINT [constraint_name];
    
  10. Dopo aver rimosso le chiavi esterne rimanenti, eseguire l'istruzione SQL seguente per visualizzare i trigger nel database:

    SELECT trigger_name
    FROM information_schema.triggers;
    

    Anche questa query dovrebbe restituire un set di risultati vuoto, indicando così che il database non contiene trigger. Se tuttavia risulta che il database contenga trigger, sarà necessario disabilitarli prima di eseguire la migrazione dei dati e successivamente riabilitarli.

  11. Chiudere l'utilità psql con il comando \q.

Eseguire una migrazione online con il Servizio Migrazione del database

  1. Tornare al portale di Azure.

  2. Selezionare Tutti i servizi, quindi Sottoscrizioni e infine selezionare la sottoscrizione.

  3. Nella pagina relativa alla sottoscrizione, in Impostazioni, selezionare Provider di risorse.

  4. Nella casella Filtra per nome digitare DataMigration e quindi selezionare Microsoft.DataMigration.

  5. Se il provider di risorse Microsoft.DataMigration non è registrato, selezionare Registra e attendere che il valore di Stato diventi Registrato. Per visualizzare la modifica dello stato, potrebbe essere necessario selezionare Aggiorna.

  6. Selezionare Crea una risorsa, nella casella Cerca nel Marketplace digitare Servizio Migrazione del database di Azure e quindi premere INVIO.

  7. Nella pagina Servizio Migrazione del database di Azure selezionare Crea.

  8. Nella pagina Crea servizio migrazione immettere i dettagli seguenti e quindi selezionare Avanti: Rete>>.

    Proprietà valore
    Selezionare un gruppo di risorse migrate-postgresql
    Nome servizio adventureworks_migration_service
    Ufficio Selezionare la posizione più vicina
    Modalità servizio Azure
    Piano tariffario Premium, con 4 vCore
  9. Nella pagina Rete selezionare la rete virtuale postgresqlvnet/posgresqlvmSubnet. Questa rete è stata creata durante la fase di configurazione.

  10. Selezionare Rivedi e crea e quindi Crea. Attendere che il Servizio Migrazione del database venga creato. L'operazione richiederà qualche minuto.

  11. Una volta creato il servizio, selezionare Vai alla risorsa.

  12. Selezionare Nuovo progetto di migrazione.

  13. Nella pagina Nuovo progetto di migrazione immettere i dettagli seguenti e quindi selezionare Crea ed esegui attività.

    Proprietà valore
    Nome progetto adventureworks_migration_project
    Tipo del server di origine PostgreSQL
    Database di destinazione per PostgreSQL Database di Azure per PostgreSQL
    Scegli il tipo di attività Migrazione dei dati online
  14. Quando viene avviata la Migrazione guidata, nella pagina Seleziona origine immettere i dettagli seguenti e quindi selezionare Avanti: Seleziona la destinazione>>.

    Proprietà valore
    Nome del server di origine nn.nn.nn.nn (l'indirizzo IP della macchina virtuale di Azure che esegue PostgreSQL)
    Porta server 5432
    Database adventureworks
    Nome utente azureuser
    Password Pa55w.rd
    Considera attendibile il certificato del server Selected
    Crittografa connessione Selected
  15. Nella pagina Seleziona la destinazione immettere i dettagli seguenti e quindi selezionare Avanti: Seleziona database>>.

    Proprietà valore
    PostgreSQL di Azure adventureworks[nnn]
    Database azureadventureworks
    Nome utente azureuser@adventureworks[nnn]
    Password Pa55w.rd
  16. Nella pagina Seleziona database selezionare il database adventureworks ed eseguirne il mapping ad azureadventureworks. Deselezionare il database postgres. Selezionare Avanti: Seleziona tabelle >>.

  17. Nella pagina Seleziona tabelle selezionare Avanti: Configura le impostazioni di migrazione>>.

  18. Nella pagina Configura le impostazioni di migrazione espandere l'elenco a discesa adventureworks, quindi espandere l'elenco a discesa Impostazioni avanzate per la migrazione online, verificare che il campo Numero massimo di tabelle da caricare in parallelo sia impostato su 5 e infine selezionare Avanti: Riepilogo>>.

  19. Nella pagina Riepilogo, nella casella Nome attività, digitare AdventureWorks_Migration_Activity e quindi selezionare Avvia migrazione.

  20. Nella pagina AdventureWorks_Migration_Activity selezionare Aggiorna a intervalli di 15 secondi. Durante la migrazione verrà visualizzato lo stato di avanzamento dell'operazione. Attendere che la colonna DETTAGLI DELLA MIGRAZIONE risulti impostata su Pronto per il cutover.

  21. Tornare a Cloud Shell.

  22. Eseguire il comando seguente per creare nuovamente le chiavi esterne nel database azureadventureworks. Lo script addkeys.sql è stato generato in precedenza:

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

    Man mano che le chiavi esterne vengono aggiunte, verrà visualizzata una serie di istruzioni ALTER TABLE. Se viene visualizzato un errore relativo alla tabella SpecialOfferProduct, è possibile ignorarlo per il momento. L'errore è dovuto a un vincolo UNIQUE che non viene trasferito correttamente. In un ambiente reale, sarà necessario recuperare i dettagli di questo vincolo dal database di origine usando la query seguente:

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

    Sarà quindi possibile ripristinare il vincolo manualmente nel database di destinazione in Database di Azure per PostgreSQL.

    Non dovrebbero essere visualizzati altri errori.

Modificare i dati e completare la migrazione al nuovo database

  1. Tornare alla pagina AdventureWorks_Migration_Activity nel portale di Azure.

  2. Selezionare il database adventureworks.

  3. Nella pagina adventureworks verificare che il valore di Caricamento completo completato sia 66 e che tutti gli altri valori siano 0.

  4. Tornare a Cloud Shell.

  5. Eseguire il comando seguente per connettersi al database adventureworks in esecuzione usando PostgreSQL nella macchina virtuale:

    psql adventureworks
    
  6. Eseguire le istruzioni SQL seguenti per visualizzare e quindi rimuovere gli ordini 43659, 43660 e 43661 dal database. Si noti che il database implementa un'eliminazione a catena nella tabella salesorderheader, eliminando automaticamente le righe corrispondenti dalla tabella 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. Chiudere l'utilità psql con il comando \q.

  8. Tornare alla pagina adventureworks nel portale di Azure e selezionare Aggiorna. Verificare che siano state applicate 32 modifiche.

  9. Selezionare Avvia cutover.

  10. Nella pagina Completa cutover selezionare Conferma e quindi Applica. Attendere finché lo stato non diventa Completato.

  11. Tornare a Cloud Shell.

  12. Eseguire il comando seguente per connettersi al database azureadventureworks in esecuzione usando il servizio Database di Azure per PostgreSQL:

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

    La password è Pa55w.rd.

  13. Eseguire le istruzioni SQL seguenti per visualizzare gli ordini e i relativi dettagli nel database. Uscire dopo la prima pagina di ogni tabella. Lo scopo di queste query è mostrare che i dati sono stati trasferiti:

    SELECT * FROM sales.salesorderheader;
    SELECT * FROM sales.salesorderdetail;
    
  14. Eseguire le istruzioni SQL seguenti per visualizzare gli ordini 43659, 43660 e 43661 e i relativi dettagli.

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

    Entrambe le query devono restituire 0 righe.

  15. Chiudere l'utilità psql con il comando \q.

Eseguire la pulizia delle risorse create

Importante

Se questi passaggi sono stati eseguiti nella sottoscrizione personale, è possibile eliminare le singole risorse oppure il gruppo, per rimuovere l'intero set di risorse. Le risorse che rimangono in esecuzione hanno un costo.

  1. Usando Cloud Shell, eseguire il comando seguente per eliminare il gruppo di risorse:
az group delete --name migrate-postgresql