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:
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.
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.
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.
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
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 sedms-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
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.
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" ]
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 AzureDbForPostgreSql
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.
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
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
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
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
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
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
Om du vill ta bort ett projekt använder du följande kommando:
az dms project delete -n PGMigration -g PostgresDemo --service-name PostgresCLI
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
- 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?.