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

Du kan använda Azure Database Migration Service 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.

Kommentar

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.

    Observera också att 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 eller Skapa en Azure Database for PostgreSQL - Hyperskala-server (Citus).

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

    Kommentar

    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 kommer åt käll-PostgreSQL Server, som har standardinställningen TCP-port 5432.

  • När du använder en brandväggsinstallation framför dina källdatabaser kanske du måste lägga till brandväggsregler för att tillåta Azure Database Migration Service att 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-portalen väljer du knappen Cloud Shell:

      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] rekommenderar vi att du anger fem platser
    • max_wal_senders = [antalet samtidiga uppgifter] – parametern max_wal_senders anger antal samtidiga aktiviteter som kan köras, rekommenderad inställning är 10 uppgifter

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 det 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, vilken är Azure Database for PostgreSQL.

    Mer information om hur du ansluter och skapar en databas finns i artikeln Skapa en Azure Database for PostgreSQL-server i Azure-portalen eller Skapa en Azure Database for PostgreSQL - Hyperskala -server (Citus) i Azure-portalen.

  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 tillägget dms-synkronisering:

    • 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 har installerat tillägget tidigare 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 du har avinstallerat dms-preview tillägget på rätt sätt 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 97181df2-909d-420b-ab93-1bff15acb6b7
      
  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/{vnet subscription id}/resourceGroups/{vnet resource group}/providers/Microsoft.Network/virtualNetworks/{vnet name}/subnets/{subnet name} –tags tagName1=tagValue1 tagWithNoValue
    

    Till exempel skapar följande kommando en tjänst i:

    • Plats: USA, östra 2
    • Prenumeration: 97181df2-909d-420b-ab93-1bff15acb6b7
    • Resursgruppsnamn: PostgresDemo
    • DMS-tjänstnamn: 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
    

    Det tar cirka 10–12 minuter att skapa en instans av DMS-tjänsten.

  3. För att identifiera IP-adressen för DMS-agenten så att du kan lägga till den i filen Postgres pg_hba.conf, kör du följande kommando:

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

    Till exempel:

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

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

    [
      "172.16.136.18"
    ]
    
  4. Lägg till IP-adressen för DMS-agenten i Postgres pg_hba.conf-filen.

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

    • Lägg till IP-adressen till pg_hba.conf-filen på källan, på likande sätt 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
    • Resursgruppsnamn: PostgresDemo
    • Tjänstnamn: PostgresCLI
    • Projektnamn: PGMigration
    • Källplattform: PostgreSQL
    • Målplattform: AzureDbForPostgreSql
    az dms project create -l westcentralus -n PGMigration -g PostgresDemo --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-objekt för databasalternativet nedan:

      [
          {
              "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. En exempelfråga för att generera listan över tabeller anges nedan precis som ett exempel. 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 SQL-frågan ovan för att fylla i matrisen "selectedTables" . Observera att om listan över markerade tabeller är tom kommer tjänsten att innehålla 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 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    
      

    Du har nu har skickat en migreringsuppgift.

  7. Om du vill visa förloppet för uppgiften, kör du följande kommando:

    • Så här ser du den allmänna uppgiftsstatusen i kort

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
      
    • Om du vill se detaljerad uppgiftsstatus inklusive information om migreringsförlopp

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

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --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 utdata nedan:

      {
          "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 PostgresDemo --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 PostgresDemo --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 PostgresDemo --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 PostgresDemo --name runnowtask
    
  3. Om du vill ta bort ett projekt använder du följande kommando:

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

    az dms delete -g ProgresDemo -n PostgresCLI
    

Nästa steg