Esercitazione: Eseguire la migrazione di PostgreSQL a Database di Azure per PostgreSQL online tramite Servizio Migrazione del database (versione classica) tramite l'interfaccia della riga di comando di Azure

È possibile usare Servizio Migrazione del database di Azure per eseguire la migrazione dei database da un'istanza di PostgreSQL locale a Database di Azure per PostgreSQL con tempi di inattività minimi. In altre parole, la migrazione può essere eseguita con tempi di inattività minimi per l'applicazione. In questa esercitazione si esegue la migrazione del database di esempio DVD Rental da un'istanza locale di PostgreSQL 9.6 a Database di Azure per PostgreSQL usando l'attività di migrazione online in Servizio Migrazione del database di Azure.

In questa esercitazione apprenderai a:

  • Eseguire la migrazione dello schema di esempio con l'utilità pg_dump.
  • Creare un'istanza del Servizio Migrazione del database di Azure.
  • Creare un progetto di migrazione tramite il Servizio Migrazione del database di Azure.
  • Eseguire la migrazione.
  • Monitorare la migrazione.

Nota

L'uso del Servizio Migrazione del database di Azure per eseguire una migrazione online richiede la creazione di un'istanza basata sul piano tariffario Premium. Il disco viene crittografato per impedire il furto dei dati durante il processo di migrazione.

Importante

Per un'esperienza di migrazione ottimale, Microsoft consiglia di creare un'istanza del Servizio Migrazione del database di Azure nella stessa area di Azure del database di destinazione. Lo spostamento dei dati tra regioni o aree geografiche può rallentare il processo di migrazione e causare errori.

Prerequisiti

Per completare questa esercitazione, è necessario:

  • Scaricare e installare PostgreSQL community edition 9.4, 9.5, 9.6 o 10. La versione del server PostgreSQL di origine deve essere 9.4, 9.5, 9.6, 10, 11, 12 o 13. Per altre informazioni, vedere Versioni supportate del database PostgreSQL.

    Si noti anche che la versione del database di Azure per PostgreSQL di destinazione deve essere uguale o successiva alla versione locale di PostgreSQL. Ad esempio, per PostgreSQL 9.6 è possibile eseguire la migrazione a Database di Azure per PostgreSQL 9.6, 10 o 11 ma non a Database di Azure per PostgreSQL 9.5.

  • Creare un'istanza di Database di Azure per PostgreSQL o Creare un server di Database di Azure per PostgreSQL - Hyperscale (Citus).

  • Creare una rete virtuale di Microsoft Azure per il servizio Migrazione del database di Azure usando il modello di distribuzione Azure Resource Manager, che offre la connettività da sito a sito per i server di origine locali con ExpressRoute o VPN. Per altre informazioni sulla creazione di una rete virtuale, vedere la documentazione sulla rete virtuale e in particolare gli articoli di avvio rapido con istruzioni dettagliate.

    Nota

    Durante la configurazione della rete virtuale, se si usa ExpressRoute con il peering di rete per Microsoft, aggiungere gli endpoint servizio seguenti alla subnet in cui verrà effettuato il provisioning del servizio:

    • Endpoint del database di destinazione (ad esempio endpoint SQL, endpoint di Azure Cosmos DB e così via)
    • Endpoint di archiviazione
    • Endpoint bus di servizio

    Questa configurazione è necessaria perché il Servizio Migrazione del database di Azure non ha connettività Internet.

  • Assicurarsi che le regole del gruppo di sicurezza di rete virtuale non blocchino la porta in uscita 443 di ServiceTag per ServiceBus, Archiviazione e AzureMonitor. Per informazioni dettagliate sul filtro del traffico dei gruppi di sicurezza di rete della rete virtuale di Azure, vedere l'articolo Filtrare il traffico di rete con gruppi di sicurezza di rete.

  • Configurare Windows Firewall per l'accesso al motore di database.

  • Aprire Windows Firewall per consentire a Servizio Migrazione del database di Azure di accedere al server PostgreSQL di origine, per impostazione predefinita attraverso la porta TCP 5432.

  • Quando si usa un'appliance firewall all'ingresso dei database di origine, potrebbe essere necessario aggiungere regole del firewall per consentire al Servizio Migrazione del database di Azure di accedere ai database di origine per la migrazione.

  • Creare una regola del firewall a livello di server per Database di Azure per PostgreSQL per consentire a Servizio Migrazione del database di Azure di accedere ai database di destinazione. Specificare l'intervallo di subnet della rete virtuale usato per il Servizio Migrazione del database di Azure.

  • Esistono due metodi per richiamare l'interfaccia della riga di comando:

    • Nell'angolo superiore destro del portale di Azure selezionare il pulsante Cloud Shell:

      Pulsante Cloud Shell nel portale di Azure

    • Installare ed eseguire l'interfaccia della riga di comando. L'interfaccia della riga di comando 2.18 o versione successiva dello strumento da riga di comando è necessaria per gestire le risorse di Azure necessarie per questa migrazione.

      Per scaricare l'interfaccia della riga di comando, seguire le istruzioni nell'articolo Installare l'interfaccia della riga di comando di Azure. L'articolo elenca anche le piattaforme che supportano l'interfaccia della riga di comando di Azure.

      Per configurare il sottosistema Windows per Linux (WSL), seguire le istruzioni riportate nella Guida all'installazione di Windows 10

  • Abilitare la replica logica nel server di origine modificando il file postgresql.config e impostando i parametri seguenti:

    • wal_level = logical
    • max_replication_slots = [numero di slot]. È consigliabile impostare cinque slot
    • max_wal_senders = [numero di attività simultanee]: il parametro max_wal_senders imposta il numero di attività simultanee che è possibile eseguire, si consiglia di impostare il valore su 10 attività

Eseguire la migrazione dello schema di esempio

Per completare tutti gli oggetti di database, ad esempio schemi di tabella, indici e stored procedure, è necessario estrarre lo schema dal database di origine e applicarlo al database.

  1. Usare il comando pg_dump -s per creare un file di dump dello schema per un database.

    pg_dump -O -h hostname -U db_username -d db_name -s > your_schema.sql
    

    Ad esempio, per eseguire il dump di un file di schema per il database dvdrental:

    pg_dump -O -h localhost -U postgres -d dvdrental -s  > dvdrentalSchema.sql
    

    Per altre informazioni sull'uso dell'utilità pg_dump, vedere gli esempi riportati nell'esercitazione su pg dump.

  2. Creare un database vuoto nell'ambiente di destinazione, ovvero il Database di Azure per PostgreSQL.

    Per informazioni dettagliate su come connettere e creare un database, vedere l'articolo Creare un server di Database di Azure per PostgreSQL nel portale di Azure o Creare un server di Database di Azure per PostgreSQL - Hyperscale (Citus) nel portale di Azure.

  3. Importare lo schema nel database di destinazione che è stato creato mediante il ripristino del file di dump dello schema.

    psql -h hostname -U db_username -d db_name < your_schema.sql 
    

    Ad esempio:

    psql -h mypgserver-20170401.postgres.database.azure.com  -U postgres -d dvdrental < dvdrentalSchema.sql
    

Nota

Il servizio di migrazione gestisce internamente l'abilitazione/disabilitazione di chiavi esterne e trigger per garantire una migrazione dei dati affidabile e affidabile. Di conseguenza, non è necessario preoccuparsi di apportare modifiche allo schema del database di destinazione.

Provisioning di un'istanza del Servizio Migrazione del database con l'interfaccia della riga di comando di Azure

  1. Installare l'estensione di sincronizzazione del Servizio Migrazione del database:

    • Accedere ad Azure mediante il comando seguente:

      az login
      
    • Quando richiesto, aprire un Web browser e immettere un codice per autenticare il dispositivo. Seguire le istruzioni indicate.

    • La migrazione online di PostgreSQL è ora disponibile all'interno del normale pacchetto dell'interfaccia della riga di comando (versione 2.18.0 e successive) senza la necessità dell'estensione dms-preview . Se l'estensione è stata installata in passato, è possibile rimuoverla seguendo questa procedura:

      • Per verificare se l'estensione è dms-preview già installata, eseguire il comando seguente:

        az extension list -o table
        
      • Se dms-preview l'estensione è installata, eseguire il comando seguente per disinstallarlo:

        az extension remove --name dms-preview
        
      • Per verificare che l'estensione sia stata disinstallata dms-preview correttamente, eseguire il comando seguente e non visualizzare l'estensione dms-preview nell'elenco:

        az extension list -o table
        

      Importante

      dms-preview l'estensione potrebbe comunque essere necessaria per altri percorsi di migrazione supportati dal Servizio Migrazione del database di Azure. Controllare la documentazione di un percorso di migrazione specifico per determinare se l'estensione è necessaria. Questa documentazione illustra il requisito dell'estensione, specifico di PostgreSQL per Database di Azure per PostgreSQL online.

    • È possibile visualizzare in qualsiasi momento tutti i comandi supportati nel Servizio Migrazione del database eseguendo:

      az dms -h
      
    • Se si hanno più sottoscrizioni di Azure, eseguire questo comando per impostare la sottoscrizione che si vuole usare per eseguire il provisioning di un'istanza del Servizio Migrazione del database.

      az account set -s 97181df2-909d-420b-ab93-1bff15acb6b7
      
  2. Eseguire il provisioning di un'istanza del Servizio Migrazione del database eseguendo il comando seguente:

    az dms create -l <location> -n <newServiceName> -g <yourResourceGroupName> --sku-name Premium_4vCores --subnet/subscriptions/{vnet subscription id}/resourceGroups/{vnet resource group}/providers/Microsoft.Network/virtualNetworks/{vnet name}/subnets/{subnet name} –tags tagName1=tagValue1 tagWithNoValue
    

    Ad esempio il comando seguente creerà un servizio in:

    • Posizione: Stati Uniti orientali 2
    • Sottoscrizione: 97181df2-909d-420b-ab93-1bff15acb6b7
    • Nome del gruppo di risorse: PostgresDemo
    • Nome del Servizio Migrazione del database: PostgresCLI
    az dms create -l eastus2 -g PostgresDemo -n PostgresCLI --subnet /subscriptions/97181df2-909d-420b-ab93-1bff15acb6b7/resourceGroups/ERNetwork/providers/Microsoft.Network/virtualNetworks/AzureDMS-CORP-USC-VNET-5044/subnets/Subnet-1 --sku-name Premium_4vCores
    

    Sono necessari circa 10-12 minuti per creare l'istanza del Servizio Migrazione del database.

  3. Per identificare l'indirizzo IP dell'agente Servizio Migrazione del database in modo che sia possibile aggiungerlo al file Postgres pg_hba.conf, eseguire il comando seguente:

    az network nic list -g <ResourceGroupName>--query '[].ipConfigurations | [].privateIpAddress'
    

    Ad esempio:

    az network nic list -g PostgresDemo --query '[].ipConfigurations | [].privateIpAddress'
    

    Si ottiene un risultato simile all'indirizzo seguente:

    [
      "172.16.136.18"
    ]
    
  4. Aggiungere l'indirizzo IP dell'agente Servizio Migrazione del database al file Postgres pg_hba.conf.

    • Prendere nota dell'indirizzo IP del Servizio Migrazione del database dopo aver completato il provisioning nel Servizio Migrazione del database.

    • Aggiungere l'indirizzo IP al file pg_hba.conf nell'origine; la voce è simile alla seguente:

      host     all            all        172.16.136.18/10    md5
      host     replication    postgres   172.16.136.18/10    md5
      
  5. Quindi creare un progetto di migrazione PostgreSQL eseguendo il comando seguente:

    az dms project create -l <location> -g <ResourceGroupName> --service-name <yourServiceName> --source-platform PostgreSQL --target-platform AzureDbforPostgreSQL -n <newProjectName>
    

    Ad esempio, il comando seguente crea un progetto usando questi parametri:

    • Località: Stati Uniti centro-occidentali
    • Nome del gruppo di risorse: PostgresDemo
    • Nome del servizio: PostgresCLI
    • Nome del progetto: PGMigration
    • Piattaforma di origine: PostgreSQL
    • Piattaforma di destinazione: AzureDbForPostgreSql
    az dms project create -l westcentralus -n PGMigration -g PostgresDemo --service-name PostgresCLI --source-platform PostgreSQL --target-platform AzureDbForPostgreSql
    
  6. Creare un'attività di migrazione di PostgreSQL usando la procedura seguente.

    Questo passaggio include l'uso dell'indirizzo IP, l'ID utente e la password di origine nonché l'IP, l'ID utente, la password e il tipo di attività di destinazione per stabilire la connessione.

    • Per visualizzare l'elenco completo delle opzioni eseguire il comando seguente:

      az dms project task create -h
      

      Sia per la connessione di origine che per quella di destinazione il parametro di input fa riferimento a un file json che contiene l'elenco di oggetti.

      Il formato dell'oggetto connessione JSON per le connessioni PostgreSQL.

      {
          // if this is missing or null, you will be prompted
          "userName": "user name",
          // if this is missing or null (highly recommended) you will  be prompted  
          "password": null,
          "serverName": "server name",
          // if this is missing, it will default to the 'postgres' database
          "databaseName": "database name",
          // if this is missing, it will default to 5432 
          "port": 5432                
      }
      

      È disponibile anche un file json di opzioni di database con l'elenco degli oggetti JSON. Il formato dell'oggetto JSON delle opzioni di database per PostgreSQL è illustrato di seguito:

      [
          {
              "name": "source database",
              "target_database_name": "target database",
              "selectedTables": [
                  "schemaName1.tableName1",
                  ...n
              ]
          },
          ...n
      ]
      
    • Per creare il codice JSON di connessione di origine, aprire Blocco note e copiare il codice JSON seguente e incollarlo nel file. Salvare il file in C:\DMS\source.json dopo averlo modificato in base al server di origine.

      {
          "userName": "postgres",    
          "password": null,
          "serverName": "13.51.14.222",
          "databaseName": "dvdrental", 
          "port": 5432                
      }
      
    • Per creare il codice JSON della connessione di destinazione, aprire Blocco note e copiare il codice JSON seguente e incollarlo nel file. Salvare il file in C:\DMS\target.json dopo averlo modificato in base al server di destinazione.

      {
          "userName": " dms@builddemotarget",    
          "password": null,           
          "serverName": " builddemotarget.postgres.database.azure.com",
          "databaseName": "inventory", 
          "port": 5432                
      }
      
    • Creare un file JSON di opzioni di database che elenca l'inventario e il mapping dei database di cui eseguire la migrazione:

      • Creare un elenco di tabelle di cui eseguire la migrazione oppure usare una query SQL per generare l'elenco dal database di origine. Di seguito è riportata una query di esempio per generare l'elenco di tabelle come esempio. Se si usa questa query, ricordarsi di rimuovere l'ultima virgola alla fine dell'ultimo nome della tabella per renderla una matrice JSON valida.

        SELECT
            FORMAT('%s,', REPLACE(FORMAT('%I.%I', schemaname, tablename), '"', '\"')) AS SelectedTables
        FROM 
            pg_tables
        WHERE 
            schemaname NOT IN ('pg_catalog', 'information_schema');
        
      • Creare il file JSON delle opzioni di database con una voce per ogni database con i nomi di database di origine e di destinazione e l'elenco delle tabelle selezionate di cui eseguire la migrazione. È possibile usare l'output della query SQL precedente per popolare la matrice "selectedTables". Si noti che se l'elenco di tabelle selezionate è vuoto, il servizio includerà tutte le tabelle per la migrazione con nomi di schema e tabella corrispondenti.

        [
            {
                "name": "dvdrental",
                "target_database_name": "dvdrental",
                "selectedTables": [
                    "schemaName1.tableName1",
                    "schemaName1.tableName2",                    
                    ...
                    "schemaNameN.tableNameM"
                ]
            },
            ... n
        ]
        
    • Eseguire il comando seguente, che accetta la connessione di origine, la connessione di destinazione e i file JSON delle opzioni del database.

      az dms project task create -g PostgresDemo --project-name PGMigration --source-connection-json c:\DMS\source.json --database-options-json C:\DMS\option.json --service-name PostgresCLI --target-connection-json c:\DMS\target.json --task-type OnlineMigration -n runnowtask    
      

    L'attività di migrazione è stata inviata correttamente.

  7. Per visualizzare lo stato di avanzamento dell'attività, eseguire il comando seguente:

    • Per visualizzare lo stato generale dell'attività in breve

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
      
    • Per visualizzare lo stato dettagliato dell'attività, incluse le informazioni sullo stato di avanzamento della migrazione

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand output
      
    • È anche possibile usare il formato di query JMESPath per estrarre solo migrationState dall'output di espansione:

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand output --query 'properties.output[].migrationState'
      

      Nell'output sono disponibili diversi parametri che indicano lo stato di avanzamento di passaggi di migrazione diversi. Ad esempio, vedere l'output seguente:

      {
          "output": [
              // Database Level
              {
                  "appliedChanges": 0, // Total incremental sync applied after full load
                  "cdcDeleteCounter": 0, // Total delete operation  applied after full load
                  "cdcInsertCounter": 0, // Total insert operation applied after full load
                  "cdcUpdateCounter": 0, // Total update operation applied after full load
                  "databaseName": "inventory",
                  "endedOn": null,
                  "fullLoadCompletedTables": 2, //Number of tables completed full load
                  "fullLoadErroredTables": 0, //Number of tables that contain migration error
                  "fullLoadLoadingTables": 0, //Number of tables that are in loading status
                  "fullLoadQueuedTables": 0, //Number of tables that are in queued status
                  "id": "db|inventory",
                  "incomingChanges": 0, //Number of changes after full load
                  "initializationCompleted": true,
                  "latency": 0,
                  //Status of migration task
                  "migrationState": "READY_TO_COMPLETE", //READY_TO_COMPLETE => the database is ready for cutover
                  "resultType": "DatabaseLevelOutput",
                  "startedOn": "2018-07-05T23:36:02.27839+00:00"
              }, {
                  "databaseCount": 1,
                  "endedOn": null,
                  "id": "dd27aa3a-ed71-4bff-ab34-77db4261101c",
                  "resultType": "MigrationLevelOutput",
                  "sourceServer": "138.91.123.10",
                  "sourceVersion": "PostgreSQL",
                  "startedOn": "2018-07-05T23:36:02.27839+00:00",
                  "state": "PENDING",
                  "targetServer": "builddemotarget.postgres.database.azure.com",
                  "targetVersion": "Azure Database for PostgreSQL"
              },
              // Table 1
              {
                  "cdcDeleteCounter": 0,
                  "cdcInsertCounter": 0,
                  "cdcUpdateCounter": 0,
                  "dataErrorsCount": 0,
                  "databaseName": "inventory",
                  "fullLoadEndedOn": "2018-07-05T23:36:20.740701+00:00", //Full load completed time
                  "fullLoadEstFinishTime": "1970-01-01T00:00:00+00:00",
                  "fullLoadStartedOn": "2018-07-05T23:36:15.864552+00:00", //Full load started time
                  "fullLoadTotalRows": 10, //Number of rows loaded in full load
                  "fullLoadTotalVolumeBytes": 7056, //Volume in Bytes in full load
                  "id": "or|inventory|public|actor",
                  "lastModifiedTime": "2018-07-05T23:36:16.880174+00:00",
                  "resultType": "TableLevelOutput",
                  "state": "COMPLETED", //State of migration for this table
                  "tableName": "public.catalog", //Table name
                  "totalChangesApplied": 0 //Total sync changes that applied after full load
              },
              //Table 2
              {
                  "cdcDeleteCounter": 0,
                  "cdcInsertCounter": 50,
                  "cdcUpdateCounter": 0,
                  "dataErrorsCount": 0,
                  "databaseName": "inventory",
                  "fullLoadEndedOn": "2018-07-05T23:36:23.963138+00:00",
                  "fullLoadEstFinishTime": "1970-01-01T00:00:00+00:00",
                  "fullLoadStartedOn": "2018-07-05T23:36:19.302013+00:00",
                  "fullLoadTotalRows": 112,
                  "fullLoadTotalVolumeBytes": 46592,
                  "id": "or|inventory|public|address",
                  "lastModifiedTime": "2018-07-05T23:36:20.308646+00:00",
                  "resultType": "TableLevelOutput",
                  "state": "COMPLETED",
                  "tableName": "public.orders",
                  "totalChangesApplied": 0
              }
          ],
          // DMS migration task state
          "state": "Running", //Running => service is still listening to any changes that might come in
          "taskType": null
      }
      

Attività di migrazione cutover

Quando il caricamento completo termina, il database è pronto per il cutover. A seconda di quanto il server di origine è occupato con le nuove transazioni in ingresso, l'attività Servizio Migrazione del database potrebbe comunque applicare modifiche dopo il termine del caricamento completo.

Per assicurarsi che tutti i dati siano aggiornati, verificare i conteggi delle righe tra i database di origine e di destinazione. Ad esempio, è possibile convalidare i dettagli seguenti dall'output dello stato:

Database Level
"migrationState": "READY_TO_COMPLETE" => Status of migration task. READY_TO_COMPLETE means database is ready for cutover
"incomingChanges": 0 => Check for a period of 5-10 minutes to ensure no new incoming changes need to be applied to the target server

Table Level (for each table)
"fullLoadTotalRows": 10    => The row count matches the initial row count of the table
"cdcDeleteCounter": 0      => Number of deletes after the full load
"cdcInsertCounter": 50     => Number of inserts after the full load
"cdcUpdateCounter": 0      => Number of updates after the full load
  1. Eseguire l'attività di migrazione del database cutover usando il comando seguente:

    az dms project task cutover -h
    

    Ad esempio, il comando seguente avvierà il cut-over per il database 'Inventory':

    az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask  --object-name Inventory
    
  2. Per monitorare l'avanzamento del cutover, eseguire il comando seguente:

    az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  3. Quando lo stato della migrazione del database è Completato, ricreare le sequenze (se applicabile) e connettere le applicazioni alla nuova istanza di destinazione di Database di Azure per PostgreSQL.

Pulizia di servizi, progetti e attività

Se è necessario annullare o eliminare qualsiasi attività, progetto o servizio del Servizio Migrazione del database, eseguire l'annullamento nella sequenza seguente:

  • Annullare qualsiasi attività in esecuzione
  • Eliminare l'attività
  • Eliminare il progetto
  • Eliminare il Servizio Migrazione del database
  1. Per annullare un'attività in esecuzione, usare il comando seguente:

    az dms project task cancel --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  2. Per eliminare un'attività in esecuzione, usare il comando seguente:

    az dms project task delete --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  3. Per eliminare un progetto, usare il comando seguente:

    az dms project delete -n PGMigration -g PostgresDemo --service-name PostgresCLI
    
  4. Per eliminare il Servizio Migrazione del database di Azure, usare il comando seguente:

    az dms delete -g ProgresDemo -n PostgresCLI
    

Passaggi successivi