Zelfstudie: PostgreSQL online migreren naar Azure Database for PostgreSQL met behulp van DMS (klassiek) via de 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.4, 9.5, 9.6 of 10. De bronversie van PostgreSQL Server moet 9.4, 9.5, 9.6, 10, 11, 12 of 13 zijn. Zie voor meer informatie 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, Azure 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 van uw virtuele netwerkbeveiligingsgroep (NSG) 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-bestand 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.sql
Ga 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.sql
Zie 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.sql
Bijvoorbeeld:
psql -h mypgserver-20170401.postgres.database.azure.com -U postgres -d dvdrental < dvdrentalSchema.sql
Notitie
De migratieservice verwerkt intern de in-/uitschakelen van refererende 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 login
Wanneer 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
dms-preview
extensie nodig is. Als u de extensie in het verleden hebt geïnstalleerd, kunt u deze verwijderen met behulp van de volgende stappen:Voer de volgende opdracht uit om te controleren of u de extensie al hebt
dms-preview
geïnstalleerd:az extension list -o table
Als
dms-preview
de extensie is geïnstalleerd, voert u de volgende opdracht uit om deze te verwijderen:az extension remove --name dms-preview
Als u wilt controleren of de extensie juist is verwijderd
dms-preview
, voert u de volgende opdracht uit en ziet u dedms-preview
extensie niet 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. Deze documentatie heeft betrekking op de vereiste van uitbreiding, specifiek voor PostgreSQL naar 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 -h
Als 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 tagWithNoValue
Met 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_4vCores
Het 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'
Voorbeeld:
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 AzureDbForPostgreSql
Voer 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 -h
Voor 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.json nadat u het hebt gewijzigd op basis van uw bronserver.
{ "userName": "postgres", "password": null, "serverName": "13.51.14.222", "databaseName": "dvdrental", "port": 5432 }
Als u de json van 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.json nadat 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 worden vermeld die moeten worden gemigreerd:
Maak een lijst met tabellen die moeten worden gemigreerd of u kunt een SQL-query gebruiken om de lijst te genereren vanuit de brondatabase. Hieronder ziet u een voorbeeldquery 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 achtertabelnaam verwijderen om deze een geldige JSON-matrix 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 met overeenkomende schema- en tabelnamen.
[ { "name": "dvdrental", "target_database_name": "dvdrental", "selectedTables": [ "schemaName1.tableName1", "schemaName1.tableName2", ... "schemaNameN.tableNameM" ] }, ... n ]
Voer de volgende opdracht uit, waarbij de bronverbinding, de doelverbinding en de JSON-bestanden voor 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 kort weergeven
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
De gedetailleerde taakstatus weergeven, inclusief de voortgangsgegevens van de migratie
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand output
U kunt ook de JMESPath-queryindeling gebruiken om alleen de migrationState uit de uitvoer uit 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 -h
Met de volgende opdracht wordt bijvoorbeeld de cut-over gestart voor de database Inventaris:
az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --object-name Inventory
Voer 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 runnowtask
Wanneer de databasemigratie de status Voltooid heeft, maakt u de reeksen opnieuw (indien van toepassing) en verbindt u uw toepassingen met de nieuwe doelinstantie 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 runnowtask
Gebruik 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 runnowtask
Gebruik de volgende opdracht om een project te verwijderen:
az dms project delete -n PGMigration -g PostgresDemo --service-name PostgresCLI
Gebruik 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.
- Zie 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.