Självstudie: Migrera PostgreSQL till Azure DB for PostgreSQL online med DMS 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 avbrottstid. Med andra ord kan migreringen ske med minimal avbrottstid för programmet. I den här självstudien migrerar du exempeldatabasen DVD-uthyrning 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 guiden får du lära dig att:
- Migrera exempelschemat med pg_dump verktyg.
- Skapa en instans av Azure Database Migration Service.
- Skapa ett migreringsprojekt med hjälp av Azure Database Migration Service.
- Köra migreringen.
- Övervaka migreringen.
Anteckning
Om Azure Database Migration Service för att utföra en onlinemigrering måste du skapa en instans som baseras på prisnivån Premium. Vi krypterar disken för att förhindra datastöld under migreringsprocessen.
Viktigt
För en optimal migreringsupplevelse rekommenderar Microsoft att du skapar en instans 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.5, 9.6 eller 10. PostgreSQL-källserverversionen måste vara 9.5.11, 9.6.7, 10 eller senare. Mer information finns i artikeln Versioner av PostgreSQL Database som stöds.
Observera också att Azure Database for PostgreSQL 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 (Citus) server.
Skapa en Microsoft Azure Virtual Network för Azure Database Migration Service med hjälp av Azure Resource Manager-distributionsmodellen, som ger plats-till-plats-anslutning till dina lokala källservrar med hjälp av ExpressRoute eller VPN. Mer information om hur du skapar ett virtuellt nätverk finns i Virtual Network-dokumentationenoch i synnerhet snabbstartsartiklarna med stegvisa detaljer.
Anteckning
Om du använder ExpressRoute med nätverks-peering till Microsoft under installationen av det virtuella nätverket lägger du till följande tjänstslutpunkter i det undernät där tjänsten ska etableras:
- Måldatabasslutpunkt (till exempel SQL-slutpunkt, Cosmos DB slutpunkt och så vidare)
- Lagringsslutpunkt
- Service Bus-slutpunkt
Den här konfigurationen är nödvändig Azure Database Migration Service saknar Internetanslutning.
Se till att dina regler för nätverkssäkerhetsgrupp för virtuellt nätverk (NSG) inte blockerar den utgående porten 443 för ServiceTag för ServiceBus, Storage och AzureMonitor. Mer information om filtrering av nätverkssäkerhetsgrupper för virtuella nätverk 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 åtkomst till PostgreSQL-källservern, som som standard är 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 att tillåta Azure Database Migration Service åtkomst till måldatabaserna. 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 Cloud Shell knappen:

Installera och kör CLI lokalt. CLI 2.18 eller senare av kommandoradsverktyget krävs för att hantera de Azure-resurser som behövs för migreringen.
Om du vill ladda ned CLI följer du anvisningarna i artikeln Installera Azure CLI. Artikeln visar ä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 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.
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.sqlTill exempel, för att dumpa en schemafil dvdrental databas:
pg_dump -o -h localhost -U postgres -d dvdrental -s > dvdrentalSchema.sqlMer information om hur du använder verktyget pg_dump finns i exemplen i självstudien pg-dump.
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 Portal eller Skapa en Azure Database for PostgreSQL – Hyperskala (Citus)-server i Azure Portal.
Importera schemat till måldatabasen som du skapade genom att återställa schemadumpfilen.
psql -h hostname -U db_username -d db_name < your_schema.sqlEtt exempel:
psql -h mypgserver-20170401.postgres.database.azure.com -U postgres -d dvdrental < dvdrentalSchema.sql
Anteckning
Migreringstjänsten hanterar internt aktivera/inaktivera 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
Installera tillägget dms-synkronisering:
Logga in på Azure genom att köra följande kommando:
az loginNär du uppmanas, öppna en webbläsare och ange en kod för att autentisera din enhet. Följ anvisningarna som anges.
Onlinemigrering för PostgreSQL är nu tillgänglig i det vanliga CLI-paketet (version 2.18.0 och senare) utan att tillägget
dms-previewbehövs. Om du har installerat tillägget tidigare kan du ta bort det med hjälp av följande steg:Kontrollera om du redan har
dms-previewinstallerat tillägget genom att köra följande kommando:az extension list -o tableOm
dms-previewtillägget är installerat kör du följande kommando för att avinstallera det:az extension remove --name dms-previewKontrollera att du har
dms-previewavinstallerat tillägget korrekt genom att köra följande kommando så bör du inte sedms-previewtillä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 den specifika migreringsvägen för att avgöra om tillägget behövs. Den här dokumentationen omfattar kravet på tillägg som är specifika för PostgreSQL för Azure Database for PostgreSQL online.Visa alla kommandon som stöds i DMS genom att köra:
az dms -hOm 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
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 tagWithNoValueTill 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_4vCoresDet tar cirka 10–12 minuter att skapa en instans av DMS-tjänsten.
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'Ett exempel:
az network nic list -g PostgresDemo --query '[].ipConfigurations | [].privateIpAddress'Du bör få ett resultat liknande följande adress:
[ "172.16.136.18" ]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
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 AzureDbForPostgreSqlSkapa 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 -hFö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 med 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 JSON-filen för källanslutningen öppnar du Anteckningar och kopierar följande json och klistrar in den i filen. Spara filen i C:\DMS\source.jsnär du har modifierat den enligt din källserver.
{ "userName": "postgres", "password": null, "serverName": "13.51.14.222", "databaseName": "dvdrental", "port": 5432 }Skapa målanslutnings-json genom att öppna Anteckningar, kopiera följande json och klistra in det i filen. Spara filen i C:\DMS\target.jsnär du har redigerat 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 databaserna som ska migreras:
Skapa en lista med 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 måste du komma ihåg att ta bort det sista kommatecken 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 valda 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 källanslutningen, målanslutningen och databasalternativen för 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.
Om du vill visa förloppet för uppgiften, kör du följande kommando:
Så här visar du allmän uppgiftsstatus i korthet
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtaskVisa detaljerad aktivitetsstatus, inklusive information om migreringens förlopp
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand outputDu kan också använda JMESPATH-frågeformat för att endast extrahera migrationState från expanderade utdata:
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
Utför den snabba migreringen för databasen med hjälp av följande kommando:
az dms project task cutover -hFö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 InventoryDu 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 runnowtaskNär status för databasmigrering visar Slutfört å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
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 runnowtaskOm 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 runnowtaskOm du vill avbryta ett pågående projekt använder du följande kommando:
az dms project task cancel -n runnowtask --project-name PGMigration -g PostgresDemo --service-name PostgresCLIOm du vill ta bort ett pågående projekt använder du följande kommando:
az dms project task delete -n runnowtask --project-name PGMigration -g PostgresDemo --service-name PostgresCLIOm du vill ta bort en DMS-tjänst använder du följande kommando:
az dms delete -g ProgresDemo -n PostgresCLI
Nästa steg
- Information om kända problem och begränsningar när du utför onlinemigreringar till Azure Database for PostgreSQL finns i artikeln Kända problem och lösningar för Azure Database for PostgreSQL-onlinemigreringar.
- Mer information om Azure Database Migration Service finns i artikeln What is the Azure Database Migration Service? (Vad är Azure Database Migration Service?).
- Information om Azure Database for PostgreSQL finns i artikeln Vad är Azure Database for PostgreSQL?.