Zelfstudie: PostgreSQL online migreren naar Azure DB for PostgreSQL met behulp van DMS en Azure CLI
U kunt de Azure Database Migration Service gebruiken om de databases met minimale downtime te migreren van een on-premises PostgreSQL-exemplaar naar Azure Database for PostgreSQL. Met andere woorden, de migratie is mogelijk met minimale downtime van de toepassing. In deze zelfstudie migreert u de voorbeelddatabase DVD Rental van een on-premises exemplaar van PostgreSQL 9.6 naar Azure Database for PostgreSQL met behulp van een 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.
Notitie
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.5, 9.6 of 10. De bronversie van PostgreSQL Server moet versie 9.5.11, 9.6.7, 10 of hoger zijn. Zie voor meer informatie het artikel Supported PostgreSQL Database Versions (Ondersteunde versies van de PostgreSQL-database).
Houd er ook rekening mee dat de doelversie van Azure Database for PostgreSQL gelijk moet zijn aan of hoger moet 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 of maak een Azure Database for PostgreSQL - Hyperscale (Citus)-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.
Notitie
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, 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 voor de netwerkbeveiligingsgroep (NSG) van uw virtuele netwerk 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.
Stel uw Windows-firewall open voor toegang van Azure Database Migration Service tot de oorspronkelijke PostgreSQL Server. Standaard verloopt dit via TCP-poort 5432.
Wanneer u een firewallapparaat gebruikt voor de brondatabase(s), moet u mogelijk firewallregels toevoegen om voor de Azure Database Migration Service toegang tot de brondatabase(s) voor de migratie toe te staan.
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:

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 te bewerken en de volgende parameters in te stellen:
- wal_level = logical
- max_replication_slots = [aantal sleuven], aanbevolen instelling is vijf sleuven
- max_wal_senders = [aantal gelijktijdige taken]: met de parameter max_wal_senders stelt u het aantal taken in dat gelijktijdig kan worden uitgevoerd. De aanbevolen instelling is 10 taken
Het voorbeeldschema migreren
Om alle databaseobjecten zoals tabelschema’s, indexen en opgeslagen procedures te voltooien, moeten we het schema uit de brondatabase extraheren en op de database toepassen.
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.sqlGa 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.sqlZie voor meer informatie over het gebruik van het hulpprogramma pg_dump de voorbeelden in de zelfstudie pg-dump.
Maak een lege database maken in uw doelomgeving, dit is Azure Database for PostgreSQL.
Raadpleeg het artikel Create an Azure Database for PostgreSQL server in the Azure portal (Een Azure Database for PostgreSQL-server maken in Azure Portal) of Create an Azure Database for PostgreSQL - Hyperscale (Citus) server in the Azure portal (Een Azure Database for PostgreSQL - Hyperscale (Citus)-server maken in de Azure-portal) voor meer informatie over hoe u een database maakt en verbindt.
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.sqlBijvoorbeeld:
psql -h mypgserver-20170401.postgres.database.azure.com -U postgres -d dvdrental < dvdrentalSchema.sql
Notitie
De migratieservice verwerkt intern het in-/uitschakelen van externe 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
Installeer als volgt de DMS-synchronisatie-extensie:
Meld u aan bij Azure door de volgende opdracht uit te voeren:
az loginWanneer 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 extensie nodig
dms-previewis. Als u de extensie in het verleden hebt geïnstalleerd, kunt u deze verwijderen door de volgende stappen uit te voeren:Voer de volgende opdracht uit om te controleren of
dms-previewde extensie al is geïnstalleerd:az extension list -o tableAls
dms-previewde extensie is geïnstalleerd, moet u deze verwijderen door de volgende opdracht uit te voeren:az extension remove --name dms-previewVoer de volgende opdracht uit om te controleren of u de extensie correct hebt verwijderd. U ziet de extensie
dms-previewdms-previewniet 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. In deze documentatie wordt de vereiste van extensies bestrijkt, specifiek voor PostgreSQL voor 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 -hAls 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 97181df2-909d-420b-ab93-1bff15acb6b7
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/{vnet subscription id}/resourceGroups/{vnet resource group}/providers/Microsoft.Network/virtualNetworks/{vnet name}/subnets/{subnet name} –tags tagName1=tagValue1 tagWithNoValueMet de volgende opdracht bijvoorbeeld maakt u een service in:
- Locatie: VS - oost 2
- Abonnement: 97181df2-909d-420b-ab93-1bff15acb6b7
- Naam resourcegroep: PostgresDemo
- Naam DMS-service: 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_4vCoresHet duurt ongeveer 10-12 minuten om het exemplaar van de DMS-service te maken.
Voer de volgende opdracht uit om het IP-adres van de DMS-agent te identificeren, zodat u het kunt toevoegen aan het Postgres-bestand pg_hba.conf:
az network nic list -g <ResourceGroupName>--query '[].ipConfigurations | [].privateIpAddress'Bijvoorbeeld:
az network nic list -g PostgresDemo --query '[].ipConfigurations | [].privateIpAddress'Als het goed is, lijkt het resultaat op het volgende adres:
[ "172.16.136.18" ]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 het bestand pg_hba.conf 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
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 resourcegroep: PostgresDemo
- Servicenaam: PostgresCLI
- Projectnaam: PGMigration
- Bronplatform: PostgreSQL
- Doelplatform: AzureDbForPostgreSql
az dms project create -l westcentralus -n PGMigration -g PostgresDemo --service-name PostgresCLI --source-platform PostgreSQL --target-platform AzureDbForPostgreSqlVoer 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 -hVoor 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. Hieronder ziet u de indeling van het JSON-object van de database-optie voor PostgreSQL:
[ { "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.jsnadat u het hebt gewijzigd op basis van de 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.jsnadat 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 die moeten worden gemigreerd, worden vermeld:
Maak een lijst met tabellen die moeten worden gemigreerd of u kunt een SQL-query gebruiken om de lijst te genereren op basis van de brondatabase. Hieronder wordt een voorbeeldquery gegeven voor het genereren van de lijst met tabellen, net als een voorbeeld. Als u deze query gebruikt, moet u de laatste komma aan het einde van de naam van de laatste tabel verwijderen om er een geldige JSON-matrix van 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 bovenstaande SQL-query gebruiken om de matrix selectedTables te vullen. Als de lijst met geselecteerde tabellen leeg is, bevat de service alle tabellen voor migratie die overeenkomende schema- en tabelnamen hebben..
[ { "name": "dvdrental", "target_database_name": "dvdrental", "selectedTables": [ "schemaName1.tableName1", "schemaName1.tableName2", ... "schemaNameN.tableNameM" ] }, ... n ]
Voer de volgende opdracht uit, waarbij de JSON-bestanden voor de bronverbinding, de doelverbinding en de databaseopties worden gebruikt.
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
U hebt nu een migratietaak ingediend.
Voer de volgende opdracht uit om de voortgang van de taak weer te geven:
De algemene taakstatus in het kort weergeven
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtaskDe gedetailleerde taakstatus bekijken, inclusief informatie over de voortgang van de migratie
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand outputU kunt ook de JMESPATH-queryindeling gebruiken om alleen de migrationState uit de uitbreidbare uitvoer te extraheren:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --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 onderstaande 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
Voer de cutover-databasemigratietaak uit met behulp van de volgende opdracht:
az dms project task cutover -hMet 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 PostgresDemo --name runnowtask --object-name InventoryVoer 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 PostgresDemo --name runnowtaskWanneer de databasemigratie de status Voltooid heeft, maakt u de reeksen opnieuw (indien van toepassing) en verbindt u uw toepassingen met het nieuwe doelexemplaar 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
Gebruik de volgende opdracht als u een actieve taak wilt annuleren:
az dms project task cancel --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtaskGebruik de volgende opdracht als u een actieve taak wilt verwijderen:
az dms project task delete --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtaskGebruik de volgende opdracht als u een actief project wilt annuleren:
az dms project task cancel -n runnowtask --project-name PGMigration -g PostgresDemo --service-name PostgresCLIGebruik de volgende opdracht als u een actief project wilt verwijderen:
az dms project task delete -n runnowtask --project-name PGMigration -g PostgresDemo --service-name PostgresCLIGebruik de volgende opdracht als u een DMS-service wilt verwijderen:
az dms delete -g ProgresDemo -n PostgresCLI
Volgende stappen
- Raadpleeg het artikel Bekende problemen/beperkingen met online migraties naar Azure Database for PostgreSQL voor informatie over bekende problemen en beperkingen bij het uitvoeren van online migraties naar Azure Database for PostgreSQL.
- Raadpleeg het artikel Wat is de Azure Database Migration Service? voor informatie over de Azure Database Migration Service.
- Raadpleeg het artikel Wat is Azure Database for PostgreSQL? voor informatie over Azure Database for PostgreSQL.