Zelfstudie: PostgreSQL online migreren naar Azure Database for PostgreSQL met behulp van DMS (klassiek) via de Azure CLI
Belangrijk
U wordt aangeraden de nieuwe migratieservice in Azure Database for PostgreSQL te gebruiken voor een meer gestroomlijnde en efficiënte migratie-ervaring. Deze service vereenvoudigt het proces door ondersteuning te bieden voor verschillende bronomgevingen, waardoor u probleemloos kunt overstappen naar Azure Database for PostgreSQL.
U kunt Azure Database Migration Service (DMS) gebruiken om de databases te migreren van een on-premises PostgreSQL-exemplaar naar Azure Database for PostgreSQL met minimale downtime. Met andere woorden, de migratie is mogelijk met minimale downtime van de toepassing. In deze zelfstudie migreert u de DVD Rental
voorbeelddatabase van een on-premises exemplaar van PostgreSQL 9.6 naar Azure Database for PostgreSQL met behulp van de 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.
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).
De doelversie van Azure Database for PostgreSQL moet gelijk zijn aan of hoger 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 - Flexibele 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.
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.
Open uw Windows Firewall om Azure Database Migration Service toegang te geven tot de bronPostgreSQL-server, die standaard TCP-poort 5432 is.
Wanneer u een firewallapparaat voor uw brondatabases gebruikt, moet u mogelijk firewallregels toevoegen om de Azure Database Migration Service toegang te geven tot de brondatabases voor migratie.
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 is5
.max_wal_senders
= [aantal gelijktijdige taken]. Met demax_wal_senders
parameter wordt het aantal gelijktijdige taken ingesteld dat kan worden uitgevoerd. Aanbevolen instelling is10
.
Het voorbeeldschema migreren
Voor het voltooien van alle databaseobjecten, zoals tabelschema's, indexen en opgeslagen procedures, moeten we het schema uit de brondatabase extraheren en toepassen op de database.
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 in uw doelomgeving. Dit is Azure Database for PostgreSQL - Flexibele server.
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 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 u de extensie correct hebt 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 <SubscriptionID>
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/<SubscriptionID>/resourceGroups/<ResourceGroupName>/providers/Microsoft.Network/virtualNetworks/<VirtualNetwork>/subnets/<SubnetName> –tags tagName1=tagValue1 tagWithNoValue
Met de volgende opdracht maakt u bijvoorbeeld een service. Vervang
<SubscriptionID>
,<ResourceGroupName>
en<VirtualNetwork>
door geldige waarden.- Locatie: VS - oost2
- Abonnement:
<SubscriptionID>
- Naam van resourcegroep:
<ResourceGroupName>
- DmS-servicenaam:
PostgresCLI
az dms create -l eastus2 -g <ResourceGroupName> -n PostgresCLI --subnet /subscriptions/<SubscriptionID>/resourceGroups/ERNetwork/providers/Microsoft.Network/virtualNetworks/<VirtualNetwork>/subnets/Subnet-1 --sku-name Premium_4vCores
Het duurt ongeveer 10 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 deze kunt toevoegen aan het Postgres-bestand
pg_hba.conf
:az network nic list -g <ResourceGroupName> --query '[].ipConfigurations | [].privateIpAddress'
Voorbeeld:
az network nic list -g <resource-group> --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
pg_hba.conf
het bestand 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 van resourcegroep:
<ResourceGroupName>
- Servicenaam: PostgresCLI
- Projectnaam: PGMigration
- Bronplatform: PostgreSQL
- Doelplatform: AzureDbForPostgreSql
az dms project create -l westcentralus -n PGMigration -g <ResourceGroupName> --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. Voor PostgreSQL wordt de indeling van het JSON-object met databaseopties als volgt weergegeven:
[ { "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 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.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. Hier volgt een voorbeeldquery voor het genereren van de lijst met tabellen. 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 vorige SQL-query gebruiken om de
selectedTables
matrix te vullen.Notitie
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 <ResourceGroupName> --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
Op dit moment hebt u een migratietaak verzonden.
Voer de volgende opdrachten uit om de voortgang van de taak weer te geven.
Als u de algemene taakstatus kort wilt weergeven:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
U kunt de gedetailleerde taakstatus bekijken, inclusief de voortgangsgegevens van de migratie:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask --expand output
U kunt ook de JMESPath-queryindeling gebruiken om alleen de
migrationState
uit de uitgevouwen uitvoer te extraheren:az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --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 volgende 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 voor de database Inventaris gestart:
az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --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 <ResourceGroupName> --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 <ResourceGroupName> --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 <ResourceGroupName> --name runnowtask
Gebruik de volgende opdracht om een project te verwijderen:
az dms project delete -n PGMigration -g <ResourceGroupName> --service-name PostgresCLI
Gebruik de volgende opdracht als u een DMS-service wilt verwijderen:
az dms delete -g <ResourceGroupName> -n PostgresCLI