Dela via


Självstudie: Migrera PostgreSQL till Azure Database for PostgreSQL online med DMS (klassisk) via Azure CLI

Viktigt!

Vi rekommenderar att du använder den nya migreringstjänsten i Azure Database for PostgreSQL för en mer effektiviserad och effektiv migreringsupplevelse. Den här tjänsten förenklar processen genom att stödja en mängd olika källmiljöer, vilket säkerställer en problemfri övergång till Azure Database for PostgreSQL.

Du kan använda Azure Database Migration Service (DMS) för att migrera databaserna från en lokal PostgreSQL-instans till Azure Database for PostgreSQL med minimal stilleståndstid. Med andra ord kan migrering uppnås med minimal stilleståndstid för programmet. I den här självstudien migrerar du exempeldatabasen DVD Rental från en lokal instans av PostgreSQL 9.6 till Azure Database for PostgreSQL med hjälp av onlinemigreringsaktiviteten i Azure Database Migration Service.

I den här självstudien lär du dig att:

  • Migrera exempelschemat med hjälp av verktyget pg_dump.
  • Skapa en instans av Azure Database Migration Service.
  • Skapa ett migreringsprojekt med hjälp av Azure Database Migration Service.
  • Köra migreringen.
  • Övervaka migreringen.

Att använda Azure Database Migration Service för att utföra en onlinemigrering kräver att du skapar en instans baserat på premiumprisnivån. Vi krypterar disken för att förhindra datastöld under migreringsprocessen.

Viktigt!

För en optimal migrering rekommenderar Microsoft att du skapar en instans av Azure Database Migration Service i samma Azure-region som måldatabasen. Att flytta data mellan regioner eller geografiska områden kan göra migreringsprocessen långsammare och leda till fel.

Förutsättningar

För att slutföra den här kursen behöver du:

  • Ladda ned och installera PostgreSQL community edition 9.4, 9.5, 9.6 eller 10. PostgreSQL-källserverversionen måste vara 9.4, 9.5, 9.6, 10, 11, 12 eller 13. Mer information finns i PostgreSQL-databasversioner som stöds.

    Azure Database for PostgreSQL-målversionen måste vara lika med eller senare än den lokala PostgreSQL-versionen. PostgreSQL 9.6 kan till exempel bara migrera till Azure Database for PostgreSQL 9.6, 10 eller 11, men inte till Azure Database for PostgreSQL 9.5.

  • Skapa en instans i Azure Database for PostgreSQL – flexibel server.

  • Skapa ett virtuellt Azure-nätverk för Azure Database Migration Service genom att använda Azure Resource Manager-distributionsmodellen, som ger plats-till-plats-anslutning för dina lokala källservrar genom att använda antingen ExpressRoute eller VPN. Mer information om hur du skapar ett virtuellt nätverk finns i dokumentationen för virtuellt nätverk, och särskilt snabbstartsartiklarna med stegvis information.

    Om du använder ExpressRoute med nätverkspeering till Microsoft under konfigurationen av virtuella nätverk lägger du till följande tjänstslutpunkter i det undernät där tjänsten ska etableras:

    • Måldatabasslutpunkt (till exempel SQL-slutpunkt, Azure Cosmos DB-slutpunkt och så vidare)
    • Lagringsslutpunkt
    • Service Bus-slutpunkt

    Den här konfigurationen är nödvändig eftersom Azure Database Migration Service saknar Internetanslutning.

  • Se till att dina regler för nätverkssäkerhetsgruppen (NSG) inte blockerar utgående port 443 för ServiceTag för ServiceBus, Storage och AzureMonitor. Mer information om trafikfiltrering för virtuella nätverk NSG finns i artikeln Filtrera nätverkstrafik med nätverkssäkerhetsgrupper.

  • Konfigurera din Windows-brandvägg för databasmotoråtkomst.

  • Öppna Windows-brandväggen så att Azure Database Migration Service får åtkomst till PostgreSQL-källservern, som som standard är TCP-port 5432.

  • När du använder en brandväggsinstallation framför källdatabaserna kan du behöva lägga till brandväggsregler så att Azure Database Migration Service kan komma åt källdatabaserna för migrering.

  • Skapa en brandväggsregel på servernivå för Azure Database for PostgreSQL för att tillåta åtkomst till måldatabaserna för Azure Database Migration Service. Ange undernätsintervallet för det virtuella nätverk som används för Azure Database Migration Service.

  • Det finns två metoder för att anropa CLI:

    • I det övre högra hörnet av Azure Portal väljer du knappen Cloud Shell:

      Skärmbild av cloud shell-knappen i Azure Portal.

    • Installera och kör CLI lokalt. CLI 2.18 eller senare version av kommandoradsverktyget krävs för att hantera de Azure-resurser som behövs för den här migreringen.

      Om du vill ladda ned CLI följer du anvisningarna i artikeln Installera Azure CLI. I artikeln visas även de plattformar som stöder Azure CLI.

      Om du vill konfigurera Windows-undersystem för Linux (WSL), följer du anvisningarna i Installationsguide för Windows 10

  • Aktivera logisk replikering på källservern genom att redigera postgresql.config filen och ange följande parametrar:

    • wal_level = logical

    • max_replication_slots = [antal platser]. Rekommenderad inställning är 5.

    • max_wal_senders = [antal samtidiga uppgifter]. Parametern max_wal_senders anger antalet samtidiga aktiviteter som kan köras. Rekommenderad inställning är 10.

Migrera exempelschemat

För att slutföra alla databasobjekt som tabellscheman, index och lagrade procedurer måste vi extrahera schemat från källdatabasen och tillämpa på databasen.

  1. Använd pg_dump -s-kommandot för att skapa en schemadumpfil för en databas.

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

    Till exempel, för att dumpa en schemafil dvdrental databas:

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

    Mer information om hur du använder verktyget pg_dump finns i exemplen i självstudien pg-dump.

  2. Skapa en tom databas i målmiljön, som är Azure Database for PostgreSQL – flexibel server.

  3. Importera schemat till måldatabasen som du skapade genom att återställa schemadumpfilen.

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

    Till exempel:

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

    Kommentar

    Migreringstjänsten hanterar internt aktivering/inaktivering av externa nycklar och utlösare för att säkerställa en tillförlitlig och robust datamigrering. Därför behöver du inte bekymra dig om att göra några ändringar i måldatabasschemat.

Etablera en instans av DMS med hjälp av Azure CLI

  1. Installera DMS-synkroniseringstillägget:

    • Logga in på Azure genom att köra följande kommando:

      az login
      
    • När du uppmanas, öppna en webbläsare och ange en kod för att autentisera din enhet. Följ anvisningarna som anges.

    • PostgreSQL-onlinemigrering är nu tillgängligt i det vanliga CLI-paketet (version 2.18.0 och senare) utan att tillägget behövs dms-preview . Om du tidigare har installerat tillägget kan du ta bort det med hjälp av följande steg:

      • Kontrollera om tillägget redan är dms-preview installerat genom att köra följande kommando:

        az extension list -o table
        
      • Om dms-preview tillägget är installerat kör du följande kommando för att avinstallera det:

        az extension remove --name dms-preview
        
      • Kontrollera att tillägget har avinstallerats dms-preview korrekt genom att köra följande kommando och du bör inte se dms-preview tillägget i listan:

        az extension list -o table
        

      Viktigt!

      dms-preview tillägg kan fortfarande behövas för andra migreringsvägar som stöds av Azure DMS. Kontrollera dokumentationen för en specifik migreringssökväg för att avgöra om tillägget behövs. Den här dokumentationen beskriver kravet på tillägg, specifikt för PostgreSQL till Azure Database for PostgreSQL online.

    • Visa alla kommandon som stöds i DMS genom att köra:

      az dms -h
      
    • Om du har flera Azure-prenumerationer kör du följande kommando för att välja den prenumeration du vill använda för att etablera en instans av DMS-tjänsten.

      az account set -s <SubscriptionID>
      
  2. Etablera en instans av DMS genom att köra följande kommando:

    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
    

    Följande kommando skapar till exempel en tjänst. Ersätt <SubscriptionID>, <ResourceGroupName>och <VirtualNetwork> med giltiga värden.

    • Plats: USA, östra 2
    • Prenumeration: <SubscriptionID>
    • Namn på resursgrupp: <ResourceGroupName>
    • DMS-tjänstnamn: 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
    

    Det tar ungefär 10 minuter att skapa instansen av DMS-tjänsten.

  3. Kör följande kommando för att identifiera DMS-agentens IP-adress så att du kan lägga till den i Postgres-filen pg_hba.conf :

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

    Till exempel:

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

    Du bör få ett resultat liknande följande adress:

    [
      "172.16.136.18"
    ]
    
  4. Lägg till DMS-agentens IP-adress i Postgres-filen pg_hba.conf .

    • Anteckna DMS IP-adressen när du har slutfört etablering i DMS.

    • Lägg till IP-adressen i pg_hba.conf filen på källan, ungefär som följande post:

      host     all            all        172.16.136.18/10    md5
      host     replication    postgres   172.16.136.18/10    md5
      
  5. Skapa sedan ett PostgreSQL-migreringsprojekt genom att köra följande kommando:

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

    Till exempel skapar följande kommando ett projekt med dessa parametrar:

    • Plats: USA, västra centrala
    • Namn på resursgrupp: <ResourceGroupName>
    • Tjänstnamn: PostgresCLI
    • Projektnamn: PGMigration
    • Källplattform: PostgreSQL
    • Målplattform: AzureDbForPostgreSql
    az dms project create -l westcentralus -n PGMigration -g <ResourceGroupName> --service-name PostgresCLI --source-platform PostgreSQL --target-platform AzureDbForPostgreSql
    
  6. Skapa en uppgift för migrering av PostgreSQL med följande steg.

    Det här steget inkluderar användning av käll-IP, användar-ID och lösenord, mål-IP-, användar-ID, lösenord och aktivitetstyp för att upprätta en anslutning.

    • Om du vill se en fullständig lista över alternativ, kör du kommandot:

      az dms project task create -h
      

      För både käll- och målanslutning refererar indataparametern till en json-fil som har objektlistan.

      Formatet för anslutning till JSON-objekt för PostgreSQL-anslutningar.

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

      Det finns också en json-fil för databasalternativ som visar json-objekten. För PostgreSQL visas formatet för JSON-objektet för databasalternativen på följande sätt:

      [
          {
              "name": "source database",
              "target_database_name": "target database",
              "selectedTables": [
                  "schemaName1.tableName1",
                  ...n
              ]
          },
          ...n
      ]
      
    • Om du vill skapa källanslutnings-json öppnar du Anteckningar och kopierar följande json och klistrar in den i filen. Spara filen i C:\DMS\source.json när du har modifierat den enligt källservern.

      {
          "userName": "postgres",
          "password": null,
          "serverName": "13.51.14.222",
          "databaseName": "dvdrental",
          "port": 5432
      }
      
    • Om du vill skapa målanslutnings-json öppnar du Anteckningar och kopierar följande json och klistrar in den i filen. Spara filen i C:\DMS\target.json när du har modifierat den enligt målservern.

      {
          "userName": " dms@builddemotarget",
          "password": null,
          "serverName": " builddemotarget.postgres.database.azure.com",
          "databaseName": "inventory",
          "port": 5432
      }
      
    • Skapa en json-fil med databasalternativ som visar inventering och mappning av de databaser som ska migreras:

      • Skapa en lista över tabeller som ska migreras, eller så kan du använda en SQL-fråga för att generera listan från källdatabasen. Här är en exempelfråga för att generera listan över tabeller. Om du använder den här frågan bör du komma ihåg att ta bort det senaste kommatecknet i slutet av det sista tabellnamnet för att göra det till en giltig JSON-matris.

        SELECT FORMAT('%s,', REPLACE(FORMAT('%I.%I', schemaname, tablename), '"', '\"')) AS SelectedTables
        FROM pg_tables
        WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
        
      • Skapa JSON-filen med databasalternativ med en post för varje databas med käll- och måldatabasnamnen och listan över valda tabeller som ska migreras. Du kan använda utdata från den tidigare SQL-frågan för att fylla i matrisen selectedTables .

        Kommentar

        Om listan över markerade tabeller är tom innehåller tjänsten alla tabeller för migrering som har matchande schema- och tabellnamn.

        [
            {
                "name": "dvdrental",
                "target_database_name": "dvdrental",
                "selectedTables": [
                    "schemaName1.tableName1",
                    "schemaName1.tableName2",
                    ...
                    "schemaNameN.tableNameM"
                ]
            },
            ... n
        ]
        
    • Kör följande kommando, som tar in källanslutningen, målanslutningen och databasalternativen json-filer.

      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
      

    Nu har du skickat en migreringsuppgift.

  7. Om du vill visa förloppet för aktiviteten kör du följande kommandon.

    • Så här ser du den allmänna aktivitetsstatusen kort och kort:

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
      
    • Så här ser du den detaljerade uppgiftsstatusen, inklusive information om migreringsförloppet:

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask --expand output
      
    • Du kan också använda JMESPath-frågeformatet för att endast extrahera migrationState från de expanderade utdata:

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

      I utdata finns det flera parametrar som anger förloppet för olika migreringssteg. Se till exempel följande utdata:

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

Snabb migreringsuppgift

Databasen är klar för snabb migrering när fullständig inläsning är klar. Beroende på hur upptagen källservern är med nya transaktioner som kommer, kan DMS-aktiviteten fortfarande tillämpa ändringar när hela inläsningen är klar.

För att säkerställa att alla data har samlats in, verifiera radantal mellan käll- och måldatabaser. Du kan till exempel verifiera följande information från statusutdata:

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. Utför den snabba migreringen för databasen med hjälp av följande kommando:

    az dms project task cutover -h
    

    Följande kommando initierar till exempel cut-over för databasen "Inventory":

    az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask  --object-name Inventory
    
  2. Du kan övervaka förloppet för den snabba migreringen med följande kommando:

    az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
    
  3. När databasmigreringsstatusen visar Slutförd återskapar du sekvenser (om tillämpligt) och ansluter dina program till den nya målinstansen av Azure Database for PostgreSQL.

Rensa tjänst, projekt, aktivitet

Om du vill avbryta eller ta bort en DMS-aktivitet, ett projekt eller en tjänst, utför du avbrottet i följande ordning:

  • Avbryt den pågående uppgiften
  • Ta bort uppgiften
  • Ta bort projektet
  • Ta bort DMS-tjänst
  1. Om du vill avbryta en pågående aktivitet använder du följande kommando:

    az dms project task cancel --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
    
  2. Om du vill ta bort en pågående aktivitet använder du följande kommando:

    az dms project task delete --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
    
  3. Om du vill ta bort ett projekt använder du följande kommando:

    az dms project delete -n PGMigration -g <ResourceGroupName> --service-name PostgresCLI
    
  4. Om du vill ta bort en DMS-tjänst använder du följande kommando:

    az dms delete -g <ResourceGroupName> -n PostgresCLI