Eseguire la migrazione di un database PostgreSQL locale in Azure

Completato

Quando una società decide di passare a Database di Azure per PostgreSQL, il passaggio successivo è quello di pianificare come eseguire la migrazione di database locali e scegliere gli strumenti per spostare i dati.

Dopo aver esplorato il modo in cui Database di Azure per PostgreSQL supporta e ridimensiona PostgreSQL in Azure, è ora necessario considerare come verrà eseguita la migrazione dei database locali esistenti.

In questa unità verrà illustrato come creare un'istanza del servizio Database di Azure per PostgreSQL usando il portale di Azure. Se è necessario creare molte istanze di questo servizio, è possibile creare uno script del processo tramite l'interfaccia della riga di comando di Azure.

Creare un server flessibile di Database di Azure per PostgreSQL

Nel portale di Azure, digitare server flessibili di Database di Azure per PostgreSQL nella casella di ricerca e selezionare server flessibili di Database di Azure per PostgreSQL.

Screenshot showing the Azure Database for PostgreSQL flexible servers item in the Azure portal.

Selezionare Crea nel riquadro principale Server flessibile e immettere i dettagli per il servizio. Tali dettagli includono:

  • Gruppo di risorse. Gruppo di risorse per il server.

  • Nome server. Deve essere un nome univoco con un numero di caratteri compreso tra 3 e 63, che contiene solo lettere minuscole, numeri e trattini.

  • Area. Area per il server.

  • Versione di PostgreSQL: selezionare la versione corrispondente al database locale di cui si eseguierà la migrazione.

  • Tipo di carico di lavoro. Selezionare l'opzione in base al carico di lavoro.

    • Calcolo e archiviazione. Selezionare Configura server per impostare il piano tariffario e specificare le risorse necessarie per il servizio. Le opzioni sono descritte nella lezione 1. Tenere presente che, se si selezionano i piani tariffari Utilizzo generico o Con ottimizzazione per la memoria, è possibile aumentare e ridurre il numero di core di processore virtuale in un secondo momento. Non è tuttavia possibile ridurre la quantità di risorse di archiviazione, che possono essere solo aumentate dopo la creazione del server.
  • Nome utente amministratore. Il nome di un account utente che verrà creato con privilegi amministrativi. Azure crea alcuni account per proprio uso. Non è possibile usare azure_superuser, azure_pg_admin, admin, administrator, root, guest, public o qualsiasi nome che inizia con pg_.

  • Password. Deve avere una lunghezza compresa tra 8 e 128 caratteri. Deve contenere una combinazione di lettere maiuscole e minuscole, numeri e caratteri non alfanumerici.

Screenshot showing a sample configuration for Azure Database for PostgreSQL flexible server in the Azure portal.

Fare clic su Rivedi e crea per distribuire il servizio. La distribuzione richiede alcuni minuti.

Dopo la distribuzione del servizio, selezionare l'opzione Sicurezza delle connessioni e aggiungere le regole del firewall appropriate per consentire ai client di connettersi, come descritto nell'argomento Connettività client della lezione 1. È anche necessario selezionare l'opzione Consenti l'accesso a Servizi di Azure.

Creare un'istanza di Database di Azure per PostgreSQL con l'interfaccia della riga di comando di Azure

È possibile creare un'istanza di Database di Azure per PostgreSQL usando il comando az postgres flexible-server create. L'istruzione seguente mostra un esempio che crea un'istanza del server flessibile. La maggior parte dei parametri è facilmente comprensibile, ad eccezione dei seguenti:

  • sku-name. Questo nome è il risultato della combinazione del piano tariffario (B per Basic, GP per Utilizzo generico e MO per Con ottimizzazione della memoria) con la generazione delle risorse di calcolo (Gen4 o Gen5) e il numero di core di CPU virtuale. Nell'esempio seguente il server viene creato usando il piano tariffario Utilizzo generico, con 4 core di CPU della generazione Gen5.
  • storage-size. Questa è la quantità di risorse di archiviazione su disco richiesta, specificata in megabyte. L'esempio seguente alloca 10 gigabyte:
    az postgres flexible-server create \
    --location northeurope --resource-group testGroup \
    --name testserver --admin-user username --admin-password password \
    --sku-name Standard_B1ms --tier Burstable --public-access 153.24.26.117 --storage-size 128 \
    --tags "key=value" --version 13 --high-availability Enabled --zone 1 \
    --standby-zone 3
    

Eseguire una migrazione online

È possibile eseguire una migrazione online da un'installazione di PostgreSQL locale a Database di Azure per PostgreSQL con il Servizio Migrazione del database di Azure.

Nello scenario online, il Servizio Migrazione del database di Azure copia tutti i dati esistenti in Azure e quindi esegue continuamente un'operazione di sincronizzazione dal database di origine. Le nuove transazioni eseguite nel sistema locale vengono copiate nel nuovo database in Azure. Questo processo continua fino a quando le applicazioni client non sono state riconfigurate in modo da usare il nuovo database in Azure. A questo punto, l'operazione di sincronizzazione ha termine.

Configurare il server di origine ed esportare lo schema

Il primo passaggio per eseguire una migrazione in linea consiste nel preparare il server di origine per il supporto della registrazione write-ahead completa. Nel server di origine modificare il file di postgresql.config e configurare i parametri di registrazione write-ahead seguenti. Per modificare questi parametri, riavviare il server. Eseguire questa operazione solo nei momenti in cui si prevede che l'attività del sistema sia minore:

wal_level = logical
max_replication_slots = 5
max_wal_senders = 10

Dopo aver riavviato il server, esportare lo schema per il database di origine tramite l'utilità pg_dump:

pg_dump -o -h [server host] -U [user name] -d [database name] -s > db_schema.sql

Creare infine un elenco di tutte le estensioni usate dal database. Sarà necessario abilitare queste estensioni nel database di destinazione. A tale scopo, è possibile usare il comando plsql \dx o eseguire la query seguente:

SELECT *
FROM pg_extension;

Creare un database di destinazione e importare lo schema

La fase successiva consiste nel creare un database di destinazione nel servizio Database di Azure per PostgreSQL. A tale scopo è possibile usare uno strumento con cui si ha familiarità, ad esempio pgAdmin, per connettersi al server, oppure usare l'interfaccia della riga di comando di Azure, come nell'esempio seguente:

az postgres db create \
  --name [database name] \
  --server-name [server name] \
  --resource-group [azure resource group]

Nel database di destinazione abilitare le estensioni usate dal database di origine.

Importare lo schema nel database di destinazione. Nel computer che contiene il file db_schema.sql eseguire il comando seguente:

psql -h [Azure Database for PostgreSQL host] -U [user name] -d [database name] -f db_schema.sql

Rimuovere tutti i riferimenti di chiave esterna nel database di destinazione. Questo passaggio è necessario perché la migrazione dei dati non verrà necessariamente eseguita in una sequenza specifica, con possibili segnalazioni di violazioni di integrità referenziale che comporteranno l'esito negativo del processo di migrazione. È tuttavia consigliabile creare un record di tutte le chiavi esterne, poiché sarà necessario ricrearle in un secondo momento. Eseguire l'istruzione SQL seguente usando l'utilità psql per trovare tutte le chiavi esterne nel database e generare uno script per rimuoverle:

SELECT Queries.tablename
       ,concat('alter table ', Queries.tablename, ' ', STRING_AGG(concat('DROP CONSTRAINT ', Queries.foreignkey), ',')) as DropQuery
            ,concat('alter table ', Queries.tablename, ' ',
                                            STRING_AGG(concat('ADD CONSTRAINT ', Queries.foreignkey, ' FOREIGN KEY (', column_name, ')', 'REFERENCES ', foreign_table_name, '(', foreign_column_name, ')' ), ',')) as AddQuery
    FROM
    (SELECT
    tc.table_schema,
    tc.constraint_name as foreignkey,
    tc.table_name as tableName,
    kcu.column_name,
    ccu.table_schema AS foreign_table_schema,
    ccu.table_name AS foreign_table_name,
    ccu.column_name AS foreign_column_name
FROM
    information_schema.table_constraints AS tc
    JOIN information_schema.key_column_usage AS kcu
      ON tc.constraint_name = kcu.constraint_name
      AND tc.table_schema = kcu.table_schema
    JOIN information_schema.constraint_column_usage AS ccu
      ON ccu.constraint_name = tc.constraint_name
      AND ccu.table_schema = tc.table_schema
WHERE constraint_type = 'FOREIGN KEY') Queries
  GROUP BY Queries.tablename;

Disabilitare tutti i trigger nel database di destinazione per i motivi seguenti:

  • Questa operazione consente di ottimizzare il processo di migrazione mentre i dati vengono copiati.
  • I trigger vengono spesso usati per implementare forme complesse di integrità referenziale e, per i motivi descritti in precedenza, questo tipo di controllo di integrità potrebbe avere esito negativo durante il trasferimento dei dati. Usare l'istruzione SQL seguente per trovare tutti i trigger nel database e generare uno script che li disabilita:
    SELECT concat ('alter table ', event_object_table, ' disable trigger ', trigger_name)
    FROM information_schema.triggers;
    

Nota

È possibile trovare il testo relativo a un trigger usando il comando \df+ in psql.

Creare un'istanza del Servizio Migrazione del database di Azure

Nel portale di Azure è ora possibile creare un'istanza del Servizio Migrazione del database di Azure.

Prima di eseguire questa operazione, è necessario registrare il provider di risorse Microsoft.DataMigration con la propria sottoscrizione. Procedere come segue:

  1. Nella barra dei menu a sinistra del portale di Azure selezionare Tutti i servizi.
  2. Nella pagina Tutti i servizi selezionare Sottoscrizioni.
  3. Nella pagina Sottoscrizioni selezionare la sottoscrizione.
  4. Nella pagina relativa alla sottoscrizione, in Impostazioni, selezionare Provider di risorse.
  5. Nella casella Filtra per nome digitare DataMigration e quindi selezionare Microsoft.DataMigration.
  6. Selezionare Registra e attendere che il valore di Stato diventi Registrato. Per visualizzare la modifica dello stato, potrebbe essere necessario selezionare Aggiorna.
    Image showing the Resource providers page. The user is registering the Microsoft.DataMigration resource provider

Quando il provider di risorse è registrato, è possibile creare il servizio. Selezionare il comando Crea una risorsa nella barra dei menu a sinistra e cercare Servizio Migrazione del database di Azure.

Image showing the initial page when creating the Azure Database Migration Service

Nella pagina Crea servizio Migrazione immettere un nome per l'istanza del servizio, specificare la sottoscrizione, che deve corrispondere a quella in cui è stato registrato il provider di risorse, il gruppo di risorse e la località. È necessario anche specificare una rete virtuale perché il Servizio Migrazione del database dipende da un firewall creato per consentire a questa rete virtuale di fornire la protezione necessaria. Se si esegue la migrazione di database da macchine virtuali di Azure, può essere possibile collocare il Servizio Migrazione del database nella stessa rete virtuale usata da tali macchine virtuali. Il piano tariffario determina il numero di core di processore virtuale disponibili per il servizio. Se si vuole eseguire una migrazione online, è necessario selezionare il livello Premium. Il livello Standard supporta solo la migrazione offline.

Image showing the configuration for the Azure Database Migration Service. The user has selected the Premium pricing tier

Prima di continuare, attendere che il servizio sia stato distribuito. Questa operazione può richiedere qualche minuto.

Creare un progetto di migrazione tramite il Servizio Migrazione del database

È ora possibile usare l'istanza del Servizio Migrazione del database per eseguire una migrazione online. A tale scopo, creare un nuovo progetto di Migrazione del database. Passare alla pagina relativa all'istanza del servizio di migrazione e selezionare Nuovo progetto di migrazione.

Image showing the newly created Azure Database Migration Service.

Nella pagina Nuovo progetto di migrazione impostare il tipo di server di origine su PostgreSQL e il tipo di server di destinazione su Database di Azure per PostgreSQL, quindi selezionare Migrazione dei dati online. Nella pagina Tipo di attività sono elencati i passaggi da eseguire nel server di origine per abilitare la migrazione online. Il testo nella parte inferiore della pagina Nuovo progetto di migrazione descrive il processo di migrazione dello schema nella destinazione.

Image showing the migration project properties and instructions.

Verificare di aver completato questi passaggi e quindi selezionare Crea ed esegui attività.

Creare ed eseguire un'attività di migrazione

Il nuovo progetto di migrazione avvia una procedura guidata che indica le operazioni da eseguire nel corso del processo. Specificare i dettagli seguenti:

  • Nella pagina Aggiungi dettagli origine immettere l'indirizzo del server di origine, il database di origine e un account in grado di connettersi al database e recuperare i dati. Per eseguire la migrazione, l'account deve avere i diritti di utente con privilegi avanzati.
  • Nella pagina Dettagli destinazione specificare l'indirizzo del servizio Database di Azure per PostgreSQL, il database in cui si vuole eseguire la migrazione dei dati e i dettagli di un account con diritti amministrativi.
  • Nella pagina Mappa ai database di destinazione selezionare il database di origine e quello di destinazione. È possibile eseguire la migrazione di uno o più database.
  • Nella pagina Impostazioni di migrazione specificare le impostazioni aggiuntive da configurare, ad esempio il numero massimo di tabelle da caricare in parallelo.
  • Nella pagina Riepilogo della migrazione immettere un nome per l'attività e quindi selezionare Esegui migrazione.
    Image showing the migration summary page.

Viene visualizzata la pagina relativa allo stato dell'attività che mostra lo stato di avanzamento della migrazione ed eventuali errori che si sono verificati. Se la migrazione non riesce, correggere i problemi e riprovare a eseguire l'attività. Se si esegue una migrazione online, dopo il trasferimento dei dati esistenti lo stato diventa Pronto per il cutover. Tuttavia, l'esecuzione dell'attività continua, in modo da trasferire le eventuali altre modifiche apportate mentre le applicazioni continuano a usare attivamente il database originale.

Image showing the activity status page for the migration activity. The migration has transferred all the current data, and is ready to cutover to the new database.

Ripristinare le chiavi esterne e i trigger

A questo punto, i dati sono stati trasferiti e le applicazioni possono iniziare a usarli. È necessario ricreare le chiavi esterne, che sono state rimosse prima di eseguire la migrazione dei dati, e ripristinare eventuali trigger. Se alcune applicazioni sono ancora connesse al database originale, la registrazione write-ahead garantisce che il database di destinazione in Azure rimanga sempre aggiornato. Le chiavi esterne e i trigger non comprometteranno la registrazione write-ahead.

Completare la migrazione al nuovo database

Quando tutte le applicazioni sono passate al nuovo database, si completa la migrazione con il processo di cutover al nuovo database. Nella pagina relativa allo stato dell'attività selezionare il nome del database di cui si esegue la migrazione per visualizzare un riepilogo delle operazioni eseguite.

Image showing the statistics for the migration activity.

Selezionare Avvia cutover. Verrà visualizzata una pagina in cui viene chiesto di confermare che l'operazione è stata completata. A questo punto, le eventuali voci rimanenti nel log write-ahead per il database di origine verranno eliminate e gli aggiornamenti verranno interrotti. Le modifiche apportate successivamente al database di origine non verranno propagate.

Image of the Complete cutover page.

Eseguire una migrazione offline

Una migrazione offline acquisisce uno "snapshot" del database di origine in un determinato momento e copia i dati nel database di destinazione. Tutte le modifiche apportate ai dati di origine dopo l'acquisizione dello snapshot non verranno riflesse nel database di destinazione.

Sono disponibili almeno due opzioni per eseguire una migrazione offline a Database di Azure per PostgreSQL o a un server PostgreSQL in esecuzione altrove, ad esempio in una macchina virtuale di Azure:

  • Esportare lo schema e i dati dal database di origine tramite l'utilità pg_dump e importare lo schema e i dati nel database di destinazione tramite l'utilità psql. Questa tecnica consente di modificare, riformattare e pulire lo schema e i dati, se necessario, prima di trasferirli al database di destinazione.
  • Eseguire il dump dei dati dal database di origine, anche in questo caso con l'utilità pg_dump, e ripristinare i dati nel database di destinazione usando pg_restore. Questa tecnica è più rapida rispetto all'uso delle funzionalità di esportazione e importazione, ma i dati vengono scaricati in un formato che non è facilmente modificabile. Usare questo approccio se non è necessario perfezionare lo schema o i dati.

Nota

Al momento non è possibile usare il Servizio Migrazione del database di Azure per eseguire una migrazione offline di un database PostgreSQL.

Eseguire la migrazione con le funzionalità di esportazione e importazione

Per eseguire la migrazione di un database usando l'approccio di esportazione e importazione, seguire questa procedura.

  1. Esportare lo schema usando il comando pg_dump da un prompt di Bash:

    pg_dump -o -h [source database server] -U [user name] -d [database] -s > db_schema.sql
    
  2. Esportare i dati in un altro file con il comando pg_dump:

    pg_dump -o -h [source database server] -U [user name] -d [database] -a > db_data.sql
    

    A questo punto, db_schema.sql e db_data.sql sono script SQL modificabili con un editor di testo.

  3. Creare il database di destinazione in Database di Azure per PostgreSQL. Per effettuare questa operazione, usare l'interfaccia della riga di comando di Azure:

    az postgres db create \
        --name [database name] \
        --server-name [server name] \
        --resource-group [azure resource group]
    
  4. Importare lo schema nel database di destinazione con il comando psql:

    psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_schema.sql
    
  5. Importare i dati nel database di destinazione con il comando psql:

    psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_data.sql
    

Eseguire la migrazione con le funzionalità di backup e ripristino

La procedura seguente illustra il processo di migrazione di un database tramite le funzionalità di backup e ripristino.

  1. Eseguire il backup del database. Da un prompt di Bash eseguire il comando seguente. Specificare il nome di un utente con i privilegi necessari per eseguire il backup del database:

    pg_dump [database name] -h [source database server] -U [user name] -Fc > database_backup.bak
    
  2. Creare il database di destinazione in Database di Azure per PostgreSQL:

    az postgres db create \
        --name [database name] \
        --server-name [server name] \
        --resource-group [azure resource group] \
    
  3. Ripristinare il backup nel nuovo database con il comando pg_restore da un prompt di Bash. Specificare il nome di un utente con diritti amministrativi nel servizio Database di Azure per PostgreSQL:

    pg_restore -d [target database name] -h [server name in Azure Database for PostgreSQL] -Fc -U [user name] database_backup.bak