Share via


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

Belangrijk

U wordt aangeraden de nieuwe migratieservice in Azure Database for PostgreSQL te gebruiken voor een meer gestroomlijnde en efficiënte migratie-ervaring. Deze service vereenvoudigt het proces door ondersteuning te bieden voor verschillende bronomgevingen, waardoor u probleemloos kunt overstappen naar Azure Database for PostgreSQL.

U kunt Azure Database Migration Service (DMS) gebruiken om de databases te migreren van een on-premises PostgreSQL-exemplaar naar Azure Database for PostgreSQL met minimale downtime. Met andere woorden, de migratie is mogelijk met minimale downtime van de toepassing. In deze zelfstudie migreert u de DVD Rental voorbeelddatabase van een on-premises exemplaar van PostgreSQL 9.6 naar Azure Database for PostgreSQL met behulp van de 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.

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).

    De doelversie van Azure Database for PostgreSQL moet gelijk zijn aan of hoger 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 - Flexibele 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.

    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.

  • Open uw Windows Firewall om Azure Database Migration Service toegang te geven tot de bronPostgreSQL-server, die standaard TCP-poort 5432 is.

  • Wanneer u een firewallapparaat voor uw brondatabases gebruikt, moet u mogelijk firewallregels toevoegen om de Azure Database Migration Service toegang te geven tot de brondatabases voor migratie.

  • 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:

      Schermopname van de knop Cloud Shell in 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 5.

    • max_wal_senders = [aantal gelijktijdige taken]. Met de max_wal_senders parameter wordt het aantal gelijktijdige taken ingesteld dat kan worden uitgevoerd. Aanbevolen instelling is 10.

Het voorbeeldschema migreren

Voor het voltooien van alle databaseobjecten, zoals tabelschema's, indexen en opgeslagen procedures, moeten we het schema uit de brondatabase extraheren en toepassen op de database.

  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 in uw doelomgeving. Dit is Azure Database for PostgreSQL - Flexibele server.

  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 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 u de extensie correct hebt 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 <SubscriptionID>
      
  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/<SubscriptionID>/resourceGroups/<ResourceGroupName>/providers/Microsoft.Network/virtualNetworks/<VirtualNetwork>/subnets/<SubnetName> –tags tagName1=tagValue1 tagWithNoValue
    

    Met de volgende opdracht maakt u bijvoorbeeld een service. Vervang <SubscriptionID>, <ResourceGroupName>en <VirtualNetwork> door geldige waarden.

    • Locatie: VS - oost2
    • Abonnement: <SubscriptionID>
    • Naam van resourcegroep: <ResourceGroupName>
    • DmS-servicenaam: PostgresCLI
    az dms create -l eastus2 -g <ResourceGroupName> -n PostgresCLI --subnet /subscriptions/<SubscriptionID>/resourceGroups/ERNetwork/providers/Microsoft.Network/virtualNetworks/<VirtualNetwork>/subnets/Subnet-1 --sku-name Premium_4vCores
    

    Het duurt ongeveer 10 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 deze kunt toevoegen aan het Postgres-bestand pg_hba.conf :

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

    Voorbeeld:

    az network nic list -g <resource-group> --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 pg_hba.conf het bestand 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 van resourcegroep: <ResourceGroupName>
    • Servicenaam: PostgresCLI
    • Projectnaam: PGMigration
    • Bronplatform: PostgreSQL
    • Doelplatform: AzureDbForPostgreSql
    az dms project create -l westcentralus -n PGMigration -g <ResourceGroupName> --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. Voor PostgreSQL wordt de indeling van het JSON-object met databaseopties als volgt weergegeven:

      [
          {
              "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 voor 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. Hier volgt een voorbeeldquery voor het genereren van de lijst met tabellen. 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 vorige SQL-query gebruiken om de selectedTables matrix te vullen.

        Notitie

        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 <ResourceGroupName> --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
      

    Op dit moment hebt u een migratietaak verzonden.

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

    • Als u de algemene taakstatus kort wilt weergeven:

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
      
    • U kunt de gedetailleerde taakstatus bekijken, inclusief de voortgangsgegevens van de migratie:

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

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --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 volgende 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 voor de database Inventaris gestart:

    az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --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 <ResourceGroupName> --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 <ResourceGroupName> --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 <ResourceGroupName> --name runnowtask
    
  3. Gebruik de volgende opdracht om een project te verwijderen:

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

    az dms delete -g <ResourceGroupName> -n PostgresCLI