Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wichtig
Es wird empfohlen, den neuen Migrationsdienst in Azure Database für PostgreSQL für eine optimierte und effizientere Migrationserfahrung zu verwenden. Dieser Dienst vereinfacht den Prozess, indem mehrere Quellumgebungen unterstützt werden, wodurch ein problemloser Übergang zu Azure Database for PostgreSQL sichergestellt wird.
Sie können den Azure Database Migration Service (DMS) verwenden, um die Datenbanken von einer lokalen PostgreSQL-Instanz zu Azure Database for PostgreSQL mit minimalen Ausfallzeiten zu migrieren. Somit kommt es bei der Migration nur zu einer geringen Ausfallzeit für die Anwendung. In diesem Tutorial migrieren Sie die Beispieldatenbank DVD Rental von einer lokalen Instanz von PostgreSQL 9.6 zu Azure Database for PostgreSQL. Zu diesem Zweck verwenden Sie die Onlinemigrationsaktivität in Azure Database Migration Service.
In diesem Tutorial lernen Sie Folgendes:
- Migrieren des Beispielschemas mit dem Hilfsprogramm pg_dump
- Erstellen einer Instanz von Azure Database Migration Service
- Erstellen Sie ein Migrationsprojekt mithilfe von Azure Database Migration Service.
- Ausführen der Migration
- Überwachen der Migration
Die Verwendung von Azure Database Migration Service zum Ausführen einer Onlinemigration erfordert das Erstellen einer Instanz auf der Grundlage des Premium-Tarifs. Wir verschlüsseln den Datenträger, um Datendiebstahl während der Migration zu verhindern.
Wichtig
Für eine optimale Migration empfiehlt Microsoft die Erstellung einer Azure Database Migration Service-Instanz in derselben Azure-Region, in der sich auch die Zieldatenbank befindet. Die Verschiebung von Daten zwischen Regionen oder Geografien kann den Migrationsvorgang verlangsamen und Fehler verursachen.
Voraussetzungen
Für dieses Tutorial benötigen Sie Folgendes:
Laden Sie die PostgreSQL Community Edition 9.4, 9.5, 9.6 oder 10 herunter und installieren Sie sie. Die PostgreSQL-Version des Quellservers muss 9.4, 9.5, 9.6, 10, 11, 12 oder 13 sein. Weitere Informationen finden Sie unter Unterstützte PostgreSQL-Datenbankversionen.
Die Azure Database for PostgreSQL-Zielversion muss höher als die lokale PostgreSQL-Version sein oder dieser entsprechen. Beispiel: PostgreSQL 9.6 kann nur zu Azure Database for PostgreSQL 9.6, 10 oder 11 migriert werden, nicht aber zu Azure Database for PostgreSQL 9.5.
Erstellen einer Instanz für Azure Database for PostgreSQL - Flexibler Server.
Erstellen Sie ein virtuelles Microsoft Azure-Netzwerk für den Azure-Datenbankmigrationsdienst mithilfe des Azure Resource Manager-Bereitstellungsmodells, das Standort-zu-Standort-Konnektivität mit Ihren lokalen Quellservern mithilfe von ExpressRoute oder VPN bereitstellt. Weitere Informationen zum Erstellen eines virtuellen Netzwerks finden Sie in der Dokumentation zum virtuellen Netzwerk und insbesondere in den Schnellstartartikeln mit schrittweisen Details.
Wenn Sie ExpressRoute beim Einrichten des virtuellen Netzwerks mit Netzwerk-Peering zu Microsoft verwenden, fügen Sie dem Subnetz, in dem der Dienst bereitgestellt wird, die folgenden Dienstendpunkte hinzu:
- Zieldatenbankendpunkt (z. B. SQL-Endpunkt, Azure Cosmos DB-Endpunkt usw.)
- Speicherendpunkt
- Service Bus-Endpunkt
Diese Konfiguration ist erforderlich, weil Azure Database Migration Service über keine Internetverbindung verfügt.
Stellen Sie sicher, dass die NSG-Regeln (Netzwerksicherheitsgruppen) des virtuellen Netzwerks nicht den ausgehenden Port 443 von ServiceTag für ServiceBus, Storage und AzureMonitor blockieren. Weitere Details zur NSG-Datenverkehrsfilterung für virtuelle Netzwerke finden Sie im Artikel "Filtern des Netzwerkdatenverkehrs mit Netzwerksicherheitsgruppen".
Konfigurieren Sie Ihre Windows-Firewall für den Datenbankmodulzugriff.
Öffnen Sie Ihre Windows-Firewall, damit Azure Database Migration Service auf die PostgreSQL Server-Quellinstanz zugreifen kann (standardmäßig TCP-Port 5432).
Wenn Sie eine Firewall-Appliance vor Ihren Quelldatenbanken verwenden, müssen Sie möglicherweise Firewall-Regeln hinzufügen, um Azure Database Migration Service für die Migration den Zugriff auf die Quelldatenbanken zu erlauben.
Erstellen Sie eine Firewallregel auf Serverebene für Azure Database for PostgreSQL, damit Azure Database Migration Service auf die Zieldatenbanken zugreifen kann. Geben Sie den Subnetzbereich des für Azure Database Migration Service verwendeten virtuellen Netzwerks an.
Es gibt zwei Methoden zum Aufrufen der CLI:
Wählen Sie im Azure-Portal rechts oben die Cloud Shell-Schaltfläche aus:
Installieren Sie die CLI lokal, und führen Sie sie aus. Für die Verwaltung der für diese Migration erforderlichen Azure-Ressourcen ist die Befehlszeilenschnittstelle in der Version CLI 2.18 oder höher erforderlich.
Um die CLI herunterzuladen, befolgen Sie die Anweisungen im Artikel Installieren von Azure CLI. In dem Artikel werden außerdem die Plattformen aufgelistet, die Azure CLI unterstützen.
Befolgen Sie zum Einrichten des Windows-Subsystems für Linux (WSL) die Anweisungen im Windows 10-Installationshandbuch.
Aktivieren Sie die logische Replikation auf dem Quellserver, indem Sie die
postgresql.config-Datei bearbeiten und die folgenden Parameter festlegen:wal_level=logical-
max_replication_slots= [Anzahl der Slots]. Die empfohlene Einstellung ist5Slots. -
max_wal_senders= [Anzahl gleichzeitiger Aufgaben]. Dermax_wal_senders-Parameter legt die Anzahl gleichzeitiger Aufgaben fest, die ausgeführt werden können. Die empfohlene Einstellung ist10Tasks.
Migrieren des Beispielschemas
Zum Fertigstellen aller Datenbankobjekte wie Tabellenschemas, Indizes und gespeicherter Prozeduren muss das Schema aus der Quelldatenbank extrahiert und auf die Datenbank angewendet werden.
Verwenden Sie
pg_dump -sden Befehl zum Erstellen einer Schemaabbilddatei für eine Datenbank.pg_dump -O -h hostname -U db_username -d db_name -s > your_schema.sqlGeben Sie beispielsweise Folgendes ein, um eine Schemadatei-dvdrental-Datenbank zu sichern:
pg_dump -O -h localhost -U postgres -d dvdrental -s > dvdrentalSchema.sqlWeitere Informationen zur Verwendung des hilfsprogramms pg_dump finden Sie in den Beispielen im pg-dump-Lernprogramm .
Erstellen Sie eine leere Datenbank in der Zielumgebung, Azure Database for PostgreSQL - Flexibler Server.
Importieren Sie das Schema in die Zieldatenbank, die Sie erstellt haben, indem Sie die Schemasicherungsdatei wiederherstellen.
psql -h hostname -U db_username -d db_name < your_schema.sqlBeispiel:
psql -h mypgserver-20170401.postgres.database.azure.com -U postgres -d dvdrental < dvdrentalSchema.sqlHinweis
Der Migrationsdienst verarbeitet intern die Aktivierung und Deaktivierung von Fremdschlüsseln und Triggern, um eine zuverlässige und robuste Datenmigration sicherzustellen. Daher müssen Sie sich keine Gedanken über Änderungen am Schema der Zieldatenbank machen.
Bereitstellung einer DMS-Instanz mithilfe der Azure CLI
Installieren der DMS-Synchronisierungserweiterung:
Melden Sie sich mithilfe des folgenden Befehls bei Azure an:
az loginWenn Sie aufgefordert werden, öffnen Sie einen Webbrowser, und geben Sie einen Code ein, um Ihr Gerät zu authentifizieren. Befolgen Sie die Anweisungen gemäß der Auflistung.
Die PostgreSQL-Onlinemigration ist jetzt im regulären CLI-Paket (Version 2.18.0 und höher) verfügbar, ohne dass die
dms-preview-Erweiterung erforderlich ist. Wenn Sie diese Erweiterung in der Vergangenheit installiert haben, können Sie sie wie folgt entfernen:Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die
dms-preview-Erweiterung bereits installiert ist:az extension list -o tableWenn die
dms-preview-Erweiterung installiert ist, führen Sie den folgenden Befehl aus, um sie zu deinstallieren:az extension remove --name dms-previewUm zu überprüfen, ob Sie die
dms-preview-Erweiterung ordnungsgemäß deinstalliert haben, führen Sie den folgenden Befehl aus. Diedms-preview-Erweiterung sollte nicht mehr in der Liste angezeigt werden:az extension list -o table
Wichtig
Die
dms-preview-Erweiterung ist möglicherweise weiterhin für andere Migrationspfade erforderlich, die von Azure DMS unterstützt werden. Überprüfen Sie die Dokumentation eines bestimmten Migrationspfads, um festzustellen, ob die Erweiterung erforderlich ist. Diese Dokumentation beinhaltet die Erweiterungsanforderung, die für die Online-Migration von PostgreSQL zu Azure Database for PostgreSQL erforderlich ist.Jederzeit können Sie alle in DMS unterstützten Befehle anzeigen, indem Sie Folgendes ausführen:
az dms -hWenn Sie über mehrere Azure-Abonnements verfügen, führen Sie den folgenden Befehl aus, um das Abonnement festzulegen, mit dem Sie eine Instanz des DMS-Diensts bereitstellen möchten.
az account set -s <SubscriptionID>
Stellen Sie eine Instanz von DMS bereit, indem Sie den folgenden Befehl ausführen:
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 tagWithNoValueBeispielsweise erstellt der folgender Befehl einen Dienst. Ersetzen Sie
<SubscriptionID>,<ResourceGroupName>und<VirtualNetwork>mit gültigen Werten.- Standort: Ost-US2
-
Abonnement:
<SubscriptionID> -
Ressourcengruppenname:
<ResourceGroupName> -
DMS-Dienstname:
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_4vCoresEs dauert ungefähr 10 Minuten, um die Instanz des DMS-Diensts zu erstellen.
Um die IP-Adresse des DMS-Agent zu identifizieren, damit Sie ihn der Postgres-Datei „
pg_hba.conf“ hinzufügen können, führen Sie den folgenden Befehl aus:az network nic list -g <ResourceGroupName> --query '[].ipConfigurations | [].privateIpAddress'Beispiel:
az network nic list -g <resource-group> --query '[].ipConfigurations | [].privateIpAddress'Das Ergebnis sollte in etwa der folgenden Adresse entsprechen:
[ "172.16.136.18" ]Fügen Sie die IP-Adresse des DMS-Agent der Postgres-Datei „
pg_hba.conf“ hinzu.Notieren Sie sich die DMS-IP-Adresse nach Abschluss der Bereitstellung in DMS.
Fügen Sie die IP-Adresse der Datei „
pg_hba.conf“ auf dem Quellcomputer ähnlich dem folgenden Eintrag hinzu:host all all 172.16.136.18/10 md5 host replication postgres 172.16.136.18/10 md5
Erstellen Sie als Nächstes ein PostgreSQL-Migrationsprojekt mithilfe des folgenden Befehls:
az dms project create -l <location> -g <ResourceGroupName> --service-name <yourServiceName> --source-platform PostgreSQL --target-platform AzureDbforPostgreSQL -n <newProjectName>Der folgende Befehl erstellt z.B. ein Projekt mit folgenden Parametern:
- Standort: West Central US
-
Ressourcengruppenname:
<ResourceGroupName> - Dienstname: PostgresCLI
- Projektname: PGMigration
- Quellplattform: PostgreSQL
- Zielplattform: AzureDbForPostgreSql
az dms project create -l westcentralus -n PGMigration -g <ResourceGroupName> --service-name PostgresCLI --source-platform PostgreSQL --target-platform AzureDbForPostgreSqlErstellen Sie mit den folgenden Schritten eine PostgreSQL-Migrationsaufgabe.
Dieser Schritt umfasst die Quell-IP, Benutzer-ID und Kennwort, Ziel-IP, Benutzer-ID, Kennwort und Aufgabentyp, um eine Verbindung herzustellen.
Um eine vollständige Liste der Optionen anzuzeigen, führen Sie diesen Befehl aus:
az dms project task create -hSowohl für die Quell- als auch Zielverbindung verweist der Eingabeparameter auf eine JSON-Datei, die die Objektliste enthält.
Das Format des JSON-Verbindungsobjekts für PostgreSQL-Verbindungen.
{ // 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 }Es gibt auch eine Datenbankoptions-JSON-Datei, die die JSON-Objekte auflistet. Für PostgreSQL ist das Format des Datenbankoptions-JSON-Objekts wie im Folgenden dargestellt:
[ { "name": "source database", "target_database_name": "target database", "selectedTables": [ "schemaName1.tableName1", ...n ] }, ...n ]Um die Quellverbindungs-JSON zu erstellen, öffnen Sie den Editor, kopieren Sie den folgenden JSON-Code, und fügen Sie ihn in die Datei ein. Speichern Sie die Datei unter C:\DMS\source.json, nachdem Sie sie entsprechend Ihres Quellservers angepasst haben.
{ "userName": "postgres", "password": null, "serverName": "13.51.14.222", "databaseName": "dvdrental", "port": 5432 }Um die Zielverbindungs-JSON zu erstellen, öffnen Sie den Editor, kopieren Sie den folgenden JSON-Code, und fügen Sie ihn in die Datei ein. Speichern Sie die Datei unter C:\DMS\target.json, nachdem Sie sie entsprechend Ihres Zielservers angepasst haben.
{ "userName": " dms@builddemotarget", "password": null, "serverName": " builddemotarget.postgres.database.azure.com", "databaseName": "inventory", "port": 5432 }Erstellen Sie eine Datenbankoptions-JSON-Datei, in der der Bestand und die Zuordnung der zu migrierenden Datenbanken aufgeführt ist:
Erstellen Sie eine Liste der zu migrierenden Tabellen, oder verwenden Sie eine SQL-Abfrage, um die Liste aus der Quelldatenbank zu generieren. Hier ist eine Beispielabfrage zum Generieren der Liste der Tabellen. Denken Sie beim Verwenden dieser Abfrage daran, das letzte Komma am Ende des letzten Tabellennamens zu entfernen, damit sie zu einem gültigen JSON-Array wird.
SELECT FORMAT('%s,', REPLACE(FORMAT('%I.%I', schemaname, tablename), '"', '\"')) AS SelectedTables FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema');Erstellen Sie die Datenbankoptions-JSON-Datei mit einem Eintrag für jede Datenbank, der den Namen der Quell- und Zieldatenbank sowie eine Liste der ausgewählten zu migrierenden Tabellen enthält. Sie können die Ausgabe der vorherigen SQL-Abfrage verwenden, um das Array
selectedTables(ausgewählte Tabellen) aufzufüllen.Hinweis
Wenn die Liste der ausgewählten Tabellen leer ist, enthält der Dienst alle Tabellen für die Migration mit übereinstimmenden Schema- und Tabellennamen.
[ { "name": "dvdrental", "target_database_name": "dvdrental", "selectedTables": [ "schemaName1.tableName1", "schemaName1.tableName2", ... "schemaNameN.tableNameM" ] }, ... n ]
Führen Sie den folgenden Befehl aus, der die Quellverbindung, die Zielverbindung und die Datenbankoptions-JSON-Dateien aufnimmt.
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
An diesem Punkt haben Sie erfolgreich eine Migrationsaufgabe gesendet.
Um den Fortschritt der Aufgabe anzuzeigen, führen Sie den folgenden Befehl aus.
Um den allgemeinen Taskstatus als Kurzversion anzuzeigen:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtaskUm den detaillierten Taskstatus einschließlich der Informationen zum Migrationsfortschritt anzuzeigen:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask --expand outputSie können auch das JMESPath-Abfrageformat verwenden, um nur die
migrationStateaus der erweiterten Ausgabe zu extrahieren:az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask --expand output --query 'properties.output[].migrationState'In der Ausgabe gibt es mehrere Parameter, die den Status der verschiedenen Migrationsschritte angeben. Sehen Sie sich zum Beispiel folgende Ausgabe an:
{ "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 }
Übernahmemigrationsaufgabe
Die Datenbank ist zur Übernahme bereit, wenn die Ladung vollständig abgeschlossen ist. Je nach Auslastung des Quellservers mit neuen Transaktionen könnte die DMS-Aufgabe möglicherweise weiterhin nach Abschluss des Ladevorgangs Änderungen anwenden.
Um sicherzustellen, dass alle Daten erfasst sind, vergleichen Sie die Zeilenanzahl in Quell- und Zieldatenbank. Sie können z. B. die folgenden Details anhand der Statusausgabe überprüfen:
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
Führen Sie die Übernahmemigrationsaufgabe mit dem folgenden Befehl durch:
az dms project task cutover -hMit dem folgenden Befehl wird beispielsweise die Übernahme der Datenbank „Inventory“ initiiert:
az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask --object-name InventoryÜberwachen Sie den Übernahmefortschritt mithilfe des folgenden Befehls :
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtaskWenn der Status der Datenbankmigration abgeschlossen angezeigt wird, erstellen Sie Sequenzen (falls zutreffend) neu, und verbinden Sie Ihre Anwendungen mit der neuen Zielinstanz von Azure Database for PostgreSQL.
Dienst, Projekt, Aufgabenbereinigung
Wenn Sie DMS-Aufgaben, -Projekte oder -Dienste abbrechen oder löschen müssen, führen Sie den Abbruch in der folgenden Reihenfolge durch:
- Abbrechen einer ausgeführten Aufgabe
- Löschen der Aufgabe
- Löschen des Projekts
- Löschen des DMS-Diensts
Um eine momentan ausgeführte Aufgabe abzubrechen, verwenden Sie den folgenden Befehl:
az dms project task cancel --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtaskUm eine momentan ausgeführte Aufgabe zu löschen, verwenden Sie den folgenden Befehl:
az dms project task delete --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtaskUm ein Projekt zu löschen, verwenden Sie den folgenden Befehl:
az dms project delete -n PGMigration -g <ResourceGroupName> --service-name PostgresCLIUm einen DMS-Dienst zu löschen, verwenden Sie den folgenden Befehl:
az dms delete -g <ResourceGroupName> -n PostgresCLI