Zelfstudie: PostgreSQL online migreren naar Azure Database for PostgreSQL met behulp van DMS (klassiek) via de Azure CLI

U kunt de Azure Database Migration Service gebruiken om de databases met minimale downtime te migreren van een on-premises PostgreSQL-exemplaar naar Azure Database for PostgreSQL. Met andere woorden, de migratie is mogelijk met minimale downtime van de toepassing. In deze zelfstudie migreert u de voorbeelddatabase DVD Rental van een on-premises exemplaar van PostgreSQL 9.6 naar Azure Database for PostgreSQL met behulp van een onlinemigratieactiviteit in Azure Database Migration Service.

In deze zelfstudie leert u het volgende:

  • Het voorbeeldschema migreren met behulp van het hulpprogramma pg_dump.
  • De Azure-portal gebruiken om een Azure Database Migration Service-exemplaar te maken.
  • Een migratieproject maken met behulp van de Azure Database Migration Service.
  • De migratie uitvoeren.
  • Houd de migratie in de gaten.

Notitie

Als Azure Database Migration Service gebruikt om een onlinemigratie uit te voeren, is het vereist dat u een exemplaar maakt op basis van de prijscategorie Premium. De schijf wordt versleuteld om diefstal van gegevens tijdens het migratieproces te voorkomen.

Belangrijk

Voor een optimale migratie-ervaring raadt Microsoft u aan een exemplaar van Azure Database Migration Service te maken in dezelfde Azure-regio als de doeldatabase. Het verplaatsen van gegevens naar regio's of geografieën kan het migratieproces vertragen en fouten veroorzaken.

Vereisten

Voor het voltooien van deze zelfstudie hebt u het volgende nodig:

  • Download en installeer PostgreSQL community edition 9.4, 9.5, 9.6 of 10. De bronversie van PostgreSQL Server moet 9.4, 9.5, 9.6, 10, 11, 12 of 13 zijn. Zie voor meer informatie Supported PostgreSQL database versions (Ondersteunde versies van de PostgreSQL-database).

    Houd er ook rekening mee dat de doelversie van Azure Database for PostgreSQL gelijk moet zijn aan of hoger moet zijn dan de on-premises PostgreSQL-versie. PostgreSQL 9.6 kan bijvoorbeeld alleen worden gemigreerd naar Azure Database for PostgreSQL 9.6, 10 of 11 maar niet naar Azure Database for PostgreSQL 9.5.

  • Maak een exemplaar in Azure Database for PostgreSQL of maak een Azure Database for PostgreSQL - Hyperscale (Citus)-server.

  • Maak een Microsoft Azure Virtual Network voor Azure Database Migration Service met behulp van het Azure Resource Manager-implementatiemodel. Dit geeft site-naar-site-verbinding met uw on-premises bronservers met behulp van ExpressRoute of VPN. Voor meer informatie over het maken van een virtueel netwerk raadpleegt u de Documentatie over virtuele netwerken en dan met name de quickstart-artikelen met stapsgewijze informatie.

    Notitie

    Als u bij de installatie van een virtueel netwerk gebruikmaakt van ExpressRoute met netwerkpeering voor Microsoft, voegt u de volgende service-eindpunten toe aan het subnet waarin de service wordt ingericht:

    • Eindpunt van de doeldatabase (bijvoorbeeld SQL-eindpunt, Azure Cosmos DB-eindpunt, enzovoort)
    • Opslageindpunt
    • Service Bus-eindpunt

    Deze configuratie is noodzakelijk omdat Azure Database Migration Service geen internetverbinding biedt.

  • Zorg ervoor dat de regels van uw virtuele netwerkbeveiligingsgroep (NSG) de uitgaande poort 443 van ServiceTag voor ServiceBus, Storage en AzureMonitor niet blokkeren. Zie het artikel Netwerkverkeer filteren met netwerkbeveiligingsgroepen voor meer informatie over verkeer filteren van verkeer via de netwerkbeveiligingsgroep voor virtuele netwerken.

  • Configureer uw Windows Firewall voor toegang tot de database-engine.

  • Stel uw Windows-firewall open voor toegang van Azure Database Migration Service tot de oorspronkelijke PostgreSQL Server. Standaard verloopt dit via TCP-poort 5432.

  • Wanneer u een firewallapparaat gebruikt voor de brondatabase(s), moet u mogelijk firewallregels toevoegen om voor de Azure Database Migration Service toegang tot de brondatabase(s) voor de migratie toe te staan.

  • Maak een firewallregel op serverniveau voor Azure Database for PostgreSQL om Azure Database Migration Service toegang te bieden tot de doeldatabases. Geef het subnetbereik van het virtuele netwerk op dat wordt gebruikt voor Azure Database Migration Service.

  • Er zijn twee methoden voor het aanroepen van de CLI:

    • Klik in de rechterbovenhoek van de Azure-portal en selecteer de knop Cloud Shell:

      Knop Cloud Shell in de Azure Portal

    • Installeer de CLI lokaal en voer deze uit. CLI 2.18 of hoger van het opdrachtregelprogramma is vereist voor het beheren van de Azure-resources die nodig zijn voor deze migratie.

      Volg de instructies in het artikel Azure CLI installeren om de CLI te downloaden. In het artikel worden ook de platforms vermeld die Ondersteuning bieden voor Azure CLI.

      Volg als u Windows-subsysteem voor Linux (WSL) wilt instellen de instructies in de installatiehandleiding voor Windows 10

  • Schakel logische replicatie op de bronserver in door het postgresql.config-bestand te bewerken en de volgende parameters in te stellen:

    • wal_level = logical
    • max_replication_slots = [aantal sleuven], aanbevolen instelling is vijf sleuven
    • max_wal_senders = [aantal gelijktijdige taken]: met de parameter max_wal_senders stelt u het aantal taken in dat gelijktijdig kan worden uitgevoerd. De aanbevolen instelling is 10 taken

Het voorbeeldschema migreren

Om alle databaseobjecten zoals tabelschema’s, indexen en opgeslagen procedures te voltooien, moeten we het schema uit de brondatabase extraheren en op de database toepassen.

  1. Gebruik de opdracht pg_dump -s om een dumpbestand van het schema te maken voor een database.

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

    Ga bijvoorbeeld als volgt te werk als u een dump wilt maken van het schemabestand van de dvdrental-database:

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

    Zie voor meer informatie over het gebruik van het hulpprogramma pg_dump de voorbeelden in de zelfstudie pg-dump.

  2. Maak een lege database maken in uw doelomgeving, dit is Azure Database for PostgreSQL.

    Raadpleeg het artikel Create an Azure Database for PostgreSQL server in the Azure portal (Een Azure Database for PostgreSQL-server maken in Azure Portal) of Create an Azure Database for PostgreSQL - Hyperscale (Citus) server in the Azure portal (Een Azure Database for PostgreSQL - Hyperscale (Citus)-server maken in de Azure-portal) voor meer informatie over hoe u een database maakt en verbindt.

  3. Importeer het schema in de doeldatabase die u hebt gemaakt, door het dumpbestand van het schema te herstellen.

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

    Bijvoorbeeld:

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

Notitie

De migratieservice verwerkt intern de in-/uitschakelen van refererende sleutels en triggers om een betrouwbare en robuuste gegevensmigratie te garanderen. Als gevolg hiervan hoeft u zich geen zorgen te maken over het aanbrengen van wijzigingen in het doeldatabaseschema.

Een exemplaar van DMS inrichten met behulp van de Azure CLI

  1. Installeer als volgt de DMS-synchronisatie-extensie:

    • Meld u aan bij Azure door de volgende opdracht uit te voeren:

      az login
      
    • Wanneer dit wordt gevraagd, opent u een webbrowser en voert u een code in om uw apparaat te verifiëren. Volg de aanwijzingen.

    • Onlinemigratie van PostgreSQL is nu beschikbaar in het reguliere CLI-pakket (versie 2.18.0 en hoger) zonder dat de dms-preview extensie nodig is. Als u de extensie in het verleden hebt geïnstalleerd, kunt u deze verwijderen met behulp van de volgende stappen:

      • Voer de volgende opdracht uit om te controleren of u de extensie al hebt dms-preview geïnstalleerd:

        az extension list -o table
        
      • Als dms-preview de extensie is geïnstalleerd, voert u de volgende opdracht uit om deze te verwijderen:

        az extension remove --name dms-preview
        
      • Als u wilt controleren of de extensie juist is verwijderd dms-preview , voert u de volgende opdracht uit en ziet u de dms-preview extensie niet in de lijst:

        az extension list -o table
        

      Belangrijk

      dms-preview extensie is mogelijk nog steeds nodig voor andere migratiepaden die worden ondersteund door Azure DMS. Raadpleeg de documentatie van een specifiek migratiepad om te bepalen of de extensie nodig is. Deze documentatie heeft betrekking op de vereiste van uitbreiding, specifiek voor PostgreSQL naar Azure Database for PostgreSQL online.

    • U kunt op elk gewenst moment alle opdrachten bekijken die in DMS worden ondersteund door de volgende opdracht uit te voeren:

      az dms -h
      
    • Als u meerdere Azure-abonnementen hebt, voert u de volgende opdracht uit om het abonnement in te stellen waarmee u een exemplaar van de DMS-service wilt inrichten.

      az account set -s 97181df2-909d-420b-ab93-1bff15acb6b7
      
  2. Voer de volgende opdracht uit om een exemplaar van DMS in te richten:

    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
    

    Met de volgende opdracht bijvoorbeeld maakt u een service in:

    • Locatie: VS - oost 2
    • Abonnement: 97181df2-909d-420b-ab93-1bff15acb6b7
    • Naam resourcegroep: PostgresDemo
    • Naam DMS-service: 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
    

    Het duurt ongeveer 10-12 minuten om het exemplaar van de DMS-service te maken.

  3. Voer de volgende opdracht uit om het IP-adres van de DMS-agent te identificeren, zodat u het kunt toevoegen aan het Postgres-bestand pg_hba.conf:

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

    Voorbeeld:

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

    Als het goed is, lijkt het resultaat op het volgende adres:

    [
      "172.16.136.18"
    ]
    
  4. Voeg het IP-adres van de DMS-agent toe aan het Postgres-bestand pg_hba.conf.

    • Noteer het IP-adres in DMS wanneer u klaar bent met het inrichten in DMS.

    • Voeg het IP-adres toe aan het bestand pg_hba.conf op de bron, vergelijkbaar met de volgende vermelding:

      host     all            all        172.16.136.18/10    md5
      host     replication    postgres   172.16.136.18/10    md5
      
  5. Voer vervolgens de volgende opdracht uit om een PostgreSQL-migratieproject te maken:

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

    Zo maakt u met de volgende opdracht een project met deze parameters:

    • Locatie: VS - west-centraal
    • Naam resourcegroep: PostgresDemo
    • Servicenaam: PostgresCLI
    • Projectnaam: PGMigration
    • Bronplatform: PostgreSQL
    • Doelplatform: AzureDbForPostgreSql
    az dms project create -l westcentralus -n PGMigration -g PostgresDemo --service-name PostgresCLI --source-platform PostgreSQL --target-platform AzureDbForPostgreSql
    
  6. Voer de volgende stappen uit om een PostgreSQL-migratietaak te maken.

    Deze stap omvat het gebruik van de bron-IP, gebruikers-id en -wachtwoord, doel-IP, gebruikers-id en -wachtwoord en taaktype om verbinding te maken.

    • Voer de volgende opdracht uit als u een volledige lijst van opties wilt bekijken:

      az dms project task create -h
      

      Voor zowel de bron- als de doelverbinding verwijst de invoerparameter naar een json-bestand dat de lijst met objecten bevat.

      De indeling van het JSON-object van de verbinding voor PostgreSQL-verbindingen.

      {
          // 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                
      }
      

      Er is ook een database-variant van het JSON-bestand dat een lijst met JSON-objecten bevat. Hieronder ziet u de indeling van het JSON-object van de database-optie voor PostgreSQL:

      [
          {
              "name": "source database",
              "target_database_name": "target database",
              "selectedTables": [
                  "schemaName1.tableName1",
                  ...n
              ]
          },
          ...n
      ]
      
    • Als u de json voor de bronverbinding wilt maken, opent u Kladblok en kopieert u de volgende json en plakt u deze in het bestand. Sla het bestand op in C:\DMS\source.json nadat u het hebt gewijzigd op basis van uw bronserver.

      {
          "userName": "postgres",    
          "password": null,
          "serverName": "13.51.14.222",
          "databaseName": "dvdrental", 
          "port": 5432                
      }
      
    • Als u de json van de doelverbinding wilt maken, opent u Kladblok en kopieert u de volgende json en plakt u deze in het bestand. Sla het bestand op in C:\DMS\target.json nadat u het hebt gewijzigd op basis van uw doelserver.

      {
          "userName": " dms@builddemotarget",    
          "password": null,           
          "serverName": " builddemotarget.postgres.database.azure.com",
          "databaseName": "inventory", 
          "port": 5432                
      }
      
    • Maak een JSON-bestand met databaseopties waarin de inventaris en toewijzing van de databases worden vermeld die moeten worden gemigreerd:

      • Maak een lijst met tabellen die moeten worden gemigreerd of u kunt een SQL-query gebruiken om de lijst te genereren vanuit de brondatabase. Hieronder ziet u een voorbeeldquery voor het genereren van de lijst met tabellen, net als een voorbeeld. Als u deze query gebruikt, moet u de laatste komma aan het einde van de achtertabelnaam verwijderen om deze een geldige JSON-matrix te maken.

        SELECT
            FORMAT('%s,', REPLACE(FORMAT('%I.%I', schemaname, tablename), '"', '\"')) AS SelectedTables
        FROM 
            pg_tables
        WHERE 
            schemaname NOT IN ('pg_catalog', 'information_schema');
        
      • Maak het JSON-bestand met databaseopties met één vermelding voor elke database met de namen van de bron- en doeldatabase en de lijst met geselecteerde tabellen die moeten worden gemigreerd. U kunt de uitvoer van de bovenstaande SQL-query gebruiken om de matrix selectedTables te vullen. Als de lijst met geselecteerde tabellen leeg is, bevat de service alle tabellen voor migratie met overeenkomende schema- en tabelnamen.

        [
            {
                "name": "dvdrental",
                "target_database_name": "dvdrental",
                "selectedTables": [
                    "schemaName1.tableName1",
                    "schemaName1.tableName2",                    
                    ...
                    "schemaNameN.tableNameM"
                ]
            },
            ... n
        ]
        
    • Voer de volgende opdracht uit, waarbij de bronverbinding, de doelverbinding en de JSON-bestanden voor databaseopties worden gebruikt.

      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    
      

    U hebt nu een migratietaak ingediend.

  7. Voer de volgende opdracht uit om de voortgang van de taak weer te geven:

    • De algemene taakstatus kort weergeven

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
      
    • De gedetailleerde taakstatus weergeven, inclusief de voortgangsgegevens van de migratie

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand output
      
    • U kunt ook de JMESPath-queryindeling gebruiken om alleen de migrationState uit de uitvoer uit te extraheren:

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

      In de uitvoer zijn er verschillende parameters die de voortgang van verschillende migratiestappen aangeven. Zie bijvoorbeeld de onderstaande uitvoer:

      {
          "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
      }
      

Cutover-migratietaak

De database is gereed voor cutover wanneer de database volledig is geladen. Afhankelijk van hoe druk de bronserver is met de nieuwe transacties die binnenkomen, is het mogelijk dat de DMS-taak nog steeds wijzigingen toepast nadat het volledig laden is voltooid.

Valideer het aantal rijen in de bron- en doeldatabases om te controleren of alle gegevens zijn bijgewerkt. U kunt bijvoorbeeld de volgende gegevens uit de statusuitvoer valideren:

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. Voer de cutover-databasemigratietaak uit met behulp van de volgende opdracht:

    az dms project task cutover -h
    

    Met de volgende opdracht wordt bijvoorbeeld de cut-over gestart voor de database Inventaris:

    az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask  --object-name Inventory
    
  2. Voer de volgende opdracht uit als u de voortgang van de cutover wilt bijhouden:

    az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  3. Wanneer de databasemigratie de status Voltooid heeft, maakt u de reeksen opnieuw (indien van toepassing) en verbindt u uw toepassingen met de nieuwe doelinstantie van Azure Database for PostgreSQL.

Service, project, taak opschonen

Als u een DMS-taak, -project of -service wilt annuleren of verwijderen, voert u de annulering uit in de volgende volgorde:

  • Een actieve taak annuleren
  • De taak verwijderen
  • Het project verwijderen
  • De DMS-service verwijderen
  1. Gebruik de volgende opdracht als u een actieve taak wilt annuleren:

    az dms project task cancel --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  2. Gebruik de volgende opdracht als u een actieve taak wilt verwijderen:

    az dms project task delete --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  3. Gebruik de volgende opdracht om een project te verwijderen:

    az dms project delete -n PGMigration -g PostgresDemo --service-name PostgresCLI
    
  4. Gebruik de volgende opdracht als u een DMS-service wilt verwijderen:

    az dms delete -g ProgresDemo -n PostgresCLI
    

Volgende stappen