Esercizio: Eseguire la migrazione di un database PostgreSQL locale a Database di Azure per PostgreSQL
In questo esercizio si eseguirà la migrazione di un database PostgreSQL in Azure. Si eseguirà la migrazione di un database PostgreSQL esistente in esecuzione in una macchina virtuale 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 questi comandi dell'interfaccia della riga di comando di Azure in Cloud Shell per creare una macchina virtuale, eseguendo PostgreSQL, con una copia del database 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
Usando un Web browser, aprire una nuova scheda e passare al portale di Azure.
Nella barra di ricerca digitare server flessibili di Database di Azure per PostgreSQL.
Nella pagina server flessibili di Database di Azure per PostgreSQL selezionare + Crea.
Nella pagina server flessibile immettere i dettagli seguenti e quindi selezionare Rivedi e crea:
Proprietà Valore Gruppo di risorse migrate-postgresql Nome del server adventureworksnnn, dove nnn è un suffisso di propria scelta per rendere univoco il nome del server Posizione 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 parola chiave Pa55w.rdDemo Conferma la password Pa55w.rdDemo Nella pagina Rivedi e crea selezionare Crea. Prima di continuare, attendere che il servizio sia stato creato.
Una volta creato il servizio, selezionare Vai alla risorsa.
Selezionare Sicurezza delle connessioni.
Nella pagina Sicurezza delle connessioni impostare Consenti l'accesso a Servizi di Azure su Sì.
Nell'elenco delle regole del firewall aggiungere una regola denominata VMe impostare il indirizzo IP iniziale e INDIRIZZO IP FINALE all'indirizzo IP della macchina virtuale che esegue il server PostgreSQL creato in precedenza.
Selezionare Aggiungi indirizzo IP client correnteper consentire al computer client di connettersi al database.
Scegliere Salva e attendere l'aggiornamento delle regole del firewall.
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 durante la 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 ci si connetterà alla macchina virtuale PostgreSQL esistente usando Cloud Shell per esportare lo schema del database.
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
Connettersi al server di database precedente usando SSH. Immettere Pa55w.rdDemo come password.
ssh azureuser@$SQLIP
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
Concedere l'autorizzazione di replica ad azureuser:
ALTER ROLE azureuser REPLICATION;
Chiudere l'utilità psql con il comando \q.
Al prompt di bash eseguire il comando seguente per esportare lo schema per il 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
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
Eseguire i comandi seguenti per creare un utente denominato azureuser e impostare la password corrispondente su Pa55w.rd. La terza istruzione fornisce 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 le 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;
Chiudere l'utilità psql con il comando \q.
Importare lo schema per il database di adventureworks nel azureadventureworks database 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 durante la creazione di ogni elemento. Lo script deve essere completato senza errori.
Esegui il comando seguente: Lo script findkeys.sql genera un altro script SQL denominato dropkeys.sql che rimuoverà tutte le chiavi esterne dalle tabelle nella azureadventureworks database. Lo script di dropkeys.sql verrà eseguito 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
Esegui il comando seguente: Lo script createkeys.sql genera un altro script SQL denominato addkeys.sql che ricrea tutte le chiavi esterne. Dopo aver eseguito la migrazione del database, si eseguirà lo script addkeys.sql:
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
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 messaggi ALTER TABLE, man mano che vengono eliminate le chiavi esterne.
Stat di nuovo l'utilità psql e connettersi al database azureadventureworks.
psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
Eseguire la query seguente per trovare 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';
Questa query deve restituire un set di risultati vuoto. Tuttavia, se esistono ancora chiavi esterne, per ogni chiave esterna, eseguire il comando seguente:
ALTER TABLE [table_schema].[table_name] DROP CONSTRAINT [constraint_name];
Dopo aver rimosso tutte le chiavi esterne rimanenti, eseguire l'istruzione SQL seguente per visualizzare i trigger nel database:
SELECT trigger_name FROM information_schema.triggers;
Questa query deve restituire anche un set di risultati vuoto, a indicare che il database non contiene trigger. Se il database contiene trigger, è necessario disabilitarli prima di eseguire la migrazione dei dati e riabilitarli in seguito.
Chiudere l'utilità psql con il comando \q.
Eseguire una migrazione online con il Servizio Migrazione del database
Tornare al portale di Azure.
Selezionare Tutti i servizi, selezionare Sottoscrizionie quindi selezionare la sottoscrizione.
Nella pagina relativa alla sottoscrizione, in Impostazioni, selezionare Provider di risorse.
Nella casella Filtra per nome digitare DataMigration e quindi selezionare Microsoft.DataMigration.
Se il Microsoft.DataMigration non è registrato, selezionare Registrae attendere che il Stato cambi in Registrato. Potrebbe essere necessario selezionare Aggiorna per visualizzare la modifica dello stato.
Selezionare Crea una risorsa, nella casella Cerca nel Marketplace digitare Servizio Migrazione del database di Azure e quindi premere INVIO.
Nella pagina Servizio Migrazione del database di Azure selezionare Crea.
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 Posizione Selezionare la posizione più vicina Modalità di servizio Azure Piano tariffario Premium, con 4 vCore Nella pagina Rete selezionare la rete virtuale postgresqlvnet/posgresqlvmSubnet. Questa rete è stata creata durante la fase di configurazione.
Selezionare Rivedi e crea e quindi Crea. Attendere che il Servizio Migrazione del database venga creato. L'operazione richiederà qualche minuto.
Una volta creato il servizio, selezionare Vai alla risorsa.
Selezionare Nuovo progetto di migrazione.
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 All'avvio della migrazione guidata, nella pagina Selezionare il di origine immettere i dettagli seguenti e quindi selezionare Avanti: Selezionare la destinazione>>.
Proprietà Valore Nome del server di origine nn.nn.nn.nn (indirizzo IP della macchina virtuale di Azure che esegue PostgreSQL) Porta server 5432 Banca dati adventureworks Nome utente azureuser parola chiave Pa55w.rd Considera attendibile il certificato del server selezionato Crittografare la connessione selezionato Nella pagina Seleziona di destinazione immettere i dettagli seguenti e quindi selezionare Avanti: Selezionare i database>>.
Proprietà Valore Azure PostgreSQL adventureworks[nnn] Banca dati azureadventureworks Nome utente azureuser@adventureworks[nnn] parola chiave Pa55w.rd nella pagina Selezionare i database selezionare il database adventureworks e mapparlo a azureadventureworks. Deselezionare il database postgres. Selezionare Avanti: selezionare le tabelle>>.
Nella pagina Selezionare tabelle selezionare Avanti: Configurare le impostazioni di migrazione>>.
Nella pagina Configura impostazioni di migrazione espandere l'elenco a discesa adventureworks, espandere l'elenco a discesa Impostazioni di migrazione online avanzate, verificare che Numero massimo di istanze da caricare in parallelo sia impostato su 5 e quindi selezionare Avanti: Riepilogo>>.
Nella pagina Riepilogo digitare nome attività digitare AdventureWorks_Migration_Activitye quindi selezionare Avvia migrazione.
Nella pagina AdventureWorks_Migration_Activity selezionare Aggiorna a intervalli di 15 secondi. Lo stato dell'operazione di migrazione verrà visualizzato man mano che procede. Attendere che la colonna DETTAGLI DELLA MIGRAZIONE risulti impostata su Pronto per il cutover.
Tornare a Cloud Shell.
Eseguire il comando seguente per ricreare le chiavi esterne nel database azureadventureworks. Lo script di addkeys.sql è stato generato in precedenza:
psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f addkeys.sql
Verrà visualizzata una serie di istruzioni ALTER TABLE man mano che vengono aggiunte le chiavi esterne. È possibile che venga visualizzato un errore relativo alla tabella SpecialOfferProduct, che è possibile ignorare per il momento. Ciò è dovuto a un vincolo UNIQUE che non viene trasferito correttamente. Nel mondo reale è 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';
È quindi possibile ripristinare manualmente questo vincolo nel database di destinazione in Database di Azure per PostgreSQL.
Non dovrebbero esserci altri errori.
Modificare i dati e passare al nuovo database
Tornare alla pagina AdventureWorks_Migration_Activity nel portale di Azure.
Selezionare il database adventureworks.
Nella pagina adventureworks verificare che il valore caricamento completo completato sia 66 e che tutti gli altri valori siano 0.
Tornare a Cloud Shell.
Eseguire il comando seguente per connettersi al database adventureworks in esecuzione usando PostgreSQL nella macchina virtuale:
psql adventureworks
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, che elimina 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);
Chiudere l'utilità psql con il comando \q.
Tornare alla pagina adventureworks nel portale di Azure e selezionare Aggiorna. Verificare che siano state applicate 32 modifiche.
Selezionare Avvia cutover.
Nella pagina Completa cutover selezionare Conferma e quindi Applica. Attendere finché lo stato non diventa Completato.
Tornare a Cloud Shell.
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.
Eseguire le istruzioni SQL seguenti per visualizzare gli ordini e i dettagli dell'ordine 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;
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.
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 lasciate in esecuzione possono finire per costarti denaro.
- Usando Cloud Shell, eseguire il comando seguente per eliminare il gruppo di risorse:
az group delete --name migrate-postgresql