Migrieren einer lokalen PostgreSQL-Datenbank zu Azure

Abgeschlossen

Sobald sich ein Unternehmen dazu entschließt, zu Azure Database for PostgreSQL zu migrieren, besteht der nächste Schritt darin, die Migration lokaler Datenbanken zu planen und die Tools auszuwählen, mit denen die Daten verschoben werden sollen.

Sie haben sich bisher angesehen, wie Azure Database for PostgreSQL PostgreSQL in Azure unterstützt und skaliert. Nun möchten Sie überlegen, wie Sie Ihre vorhandenen lokalen Datenbanken migrieren.

In dieser Lerneinheit erfahren Sie, wie Sie eine Instanz des Azure Database for PostgreSQL-Diensts mithilfe des Azure-Portals erstellen. Wenn Sie mehrere Instanzen des Diensts erstellen müssen, können Sie ein Skript für den Prozess erstellen, indem Sie die Azure CLI verwenden.

Erstellen eines flexiblen Servers für Azure Database for PostgreSQL

Geben Sie im Azure-Portal Azure Database for PostgreSQL – Flexibler Server in das Suchfeld ein, und wählen Sie Azure Database for PostgreSQL – Flexibler Server aus.

Screenshot showing the Azure Database for PostgreSQL flexible servers item in the Azure portal.

Wählen Sie Erstellen auf dem Hauptblatt Flexibler Server aus, und geben Sie die Details für den Dienst ein. Hierzu zählen:

  • Ressourcengruppe. Ressourcengruppe für den Server.

  • Servername. Geben Sie hierbei einen eindeutigen Namen ein, der zwischen 3 und 63 Zeichen lang ist und nur aus Kleinbuchstaben, Zahlen und Bindestrichen besteht.

  • Region: Region für den Server.

  • PostgreSQL-Version: Wählen Sie die Version aus, die der lokalen Datenbank entspricht, die Sie migrieren.

  • Workloadtyp. Wählen Sie die Option auf Grundlage Ihrer Workload aus.

    • Compute + Speicher: Klicken Sie auf Server konfig., um den Tarif festzulegen und die Ressourcen anzugeben, die Sie für den Dienst benötigen. Die Optionen haben Sie in der Lerneinheit 1 kennengelernt. Denken Sie daran, dass Sie die Anzahl virtueller Prozessorkerne später herunterskalieren oder hochskalieren können, wenn Sie einen der Tarife Universell oder Arbeitsspeicheroptimiert auswählen. Sie können jedoch die Speichermenge nicht reduzieren. Sie kann nach Erstellung des Servers nur noch erhöht werden.
  • Administratorbenutzername: Hierbei handelt es sich um den Namen eines Benutzerkontos, das Sie mit Administratorberechtigungen erstellen. Azure erstellt einige Konten zur eigenen Verwendung. Sie können azure_superuser, azure_pg_admin, admin, administrator, root, guest, public oder einen beliebigen Namen, der mit pg_ beginnt, nicht nutzen.

  • Kennwort: Kennwörter müssen zwischen 8 und 128 Zeichen lang sein. Sie müssen aus Klein- und Großbuchstaben, Zahlen und nicht-alphanumerischen Zeichen bestehen.

Screenshot showing a sample configuration for Azure Database for PostgreSQL flexible server in the Azure portal.

Klicken Sie zum Bereitstellen des Diensts auf Überprüfen + erstellen. Die Bereitstellung dauert mehrere Minuten.

Klicken Sie nach Bereitstellung des Diensts auf die Option Verbindungssicherheit, und fügen Sie die entsprechenden Firewallregeln hinzu, damit Clients eine Verbindung herstellen können. Sehen Sie sich dazu nochmal die Beschreibung unter Clientkonnektivität in Lerneinheit 1 an. Sie müssen auch die Option Zugriff auf Azure-Dienste erlauben auswählen.

Erstellen einer Azure Database for PostgreSQL-Instanz mithilfe der Azure CLI

Sie können eine Instanz von Azure Database for PostgreSQL mithilfe des az postgres flexible-server create-Befehls erstellen. Die Anweisung unten zeigt ein Beispiel, in dem eine Instanz von Flexibler Server erstellt wird. Die meisten Parameter sind selbsterklärend, mit Ausnahme der Folgenden:

  • sku-name: Dieser Parameter wird aus einer Kombination aus Tarif (B für „Basic“, GP (General Purpose) für „Universell“ und MO (Memory Optimized) für „Arbeitsspeicheroptimiert“), der Computegeneration (Gen4 oder Gen5) und der Anzahl virtueller CP-Kerne erstellt. Im Beispiel unten wird der Server mithilfe des Tarifs „Universell“ und mit 4 CPU-Kernen der Gen5-Generation erstellt.
  • storage-size: Hierbei handelt es sich um die erforderliche Datenträgerspeichermenge. Diese wird in Megabyte angegeben. Im folgenden Beispiel werden 10 Gigabyte zugeordnet:
    az postgres flexible-server create \
    --location northeurope --resource-group testGroup \
    --name testserver --admin-user username --admin-password password \
    --sku-name Standard_B1ms --tier Burstable --public-access 153.24.26.117 --storage-size 128 \
    --tags "key=value" --version 13 --high-availability Enabled --zone 1 \
    --standby-zone 3
    

Durchführen einer Onlinemigration

Sie können eine Onlinemigration einer lokalen PostgreSQL-Installation zu Azure Database for PostgreSQL mithilfe von Azure Database Migration Service durchführen.

Im Onlineszenario kopiert Azure Database Migration Service alle vorhandenen Daten zu Azure, und führt dann fortlaufend einen Synchronisierungsvorgang für die Quelldatenbank durch. Jede neue Transaktion, die für das lokale System durchgeführt wird, wird in die neue Datenbank in Azure kopiert. Dieser Prozess wird fortgesetzt, bis Sie Ihre Clientanwendungen so neu konfiguriert haben, dass die neue Datenbank in Azure verwendet wird. Zu diesem Zeitpunkt wird der Synchronisierungsvorgang beendet

Konfigurieren des Quellservers und Exportieren des Schemas

Der erste Schritt beim Durchführen einer Onlinemigration ist das Vorbereiten des Quellservers, damit die Erstellung vollständiger Write-Ahead-Protokolle unterstützt wird. Bearbeiten Sie auf dem Quellserver die postgresql.config-Datei, und konfigurieren Sie die folgenden Parameter für die Write-Ahead-Protokollierung. Wenn Sie diese Parameter ändern möchten, starten Sie den Server neu. Führen Sie diesen Schritt jedoch nur aus, wenn für das System keine Aktivität erwartet wird:

wal_level = logical
max_replication_slots = 5
max_wal_senders = 10

Exportieren Sie das Schema für die Quelldatenbank mithilfe des pg_dump-Hilfsprogramms, nachdem Sie den Server neu gestartet haben:

pg_dump -o -h [server host] -U [user name] -d [database name] -s > db_schema.sql

Erstellen Sie schließlich eine Liste aller Erweiterungen, die die Datenbank verwendet. Sie müssen diese Erweiterungen in der Zieldatenbank aktivieren. Verwenden Sie dazu entweder den plsql-Befehl \dx, oder führen Sie die folgende Abfrage aus:

SELECT *
FROM pg_extension;

Erstellen einer Zieldatenbank und Importieren des Schemas

Der nächste Schritt besteht darin, eine Zieldatenbank in Ihrem Azure Database for PostgreSQL-Dienst zu erstellen. Dafür verwenden Sie ein häufig genutztes Tool wie pgAdmin, um eine Verbindung zum Server herzustellen, oder Sie können auch die Azure CLI wie im folgenden Beispiel nutzen:

az postgres db create \
  --name [database name] \
  --server-name [server name] \
  --resource-group [azure resource group]

Aktivieren Sie für die Zieldatenbank alle Erweiterungen, die von der Quelldatenbank verwendet werden.

Importieren Sie das Schema in die Zieldatenbank. Führen Sie auf dem Computer, auf dem die Datei db_schema.sql gespeichert ist, den folgenden Befehl aus:

psql -h [Azure Database for PostgreSQL host] -U [user name] -d [database name] -f db_schema.sql

Entfernen Sie alle Verweise auf Fremdschlüssel in der Zieldatenbank. Dieser Schritt ist erforderlich, da die Daten nicht zwangsläufig in einer bestimmten Reihenfolge migriert werden, was zu Verstößen gegen die referentielle Integrität führen kann, die wiederum Fehler beim Migrationsprozess auslösen. Sie sollten sich jedoch alle Fremdschlüssel notieren, da Sie sie später neu erstellen müssen. Führen Sie die folgende SQL-Anweisung mithilfe des psql-Hilfsprogramms aus, um nach allen Fremdschlüsseln in Ihrer Datenbank zu suchen und ein Skript zu erstellen, das sie entfernt:

SELECT Queries.tablename
       ,concat('alter table ', Queries.tablename, ' ', STRING_AGG(concat('DROP CONSTRAINT ', Queries.foreignkey), ',')) as DropQuery
            ,concat('alter table ', Queries.tablename, ' ',
                                            STRING_AGG(concat('ADD CONSTRAINT ', Queries.foreignkey, ' FOREIGN KEY (', column_name, ')', 'REFERENCES ', foreign_table_name, '(', foreign_column_name, ')' ), ',')) as AddQuery
    FROM
    (SELECT
    tc.table_schema,
    tc.constraint_name as foreignkey,
    tc.table_name as tableName,
    kcu.column_name,
    ccu.table_schema AS foreign_table_schema,
    ccu.table_name AS foreign_table_name,
    ccu.column_name AS foreign_column_name
FROM
    information_schema.table_constraints AS tc
    JOIN information_schema.key_column_usage AS kcu
      ON tc.constraint_name = kcu.constraint_name
      AND tc.table_schema = kcu.table_schema
    JOIN information_schema.constraint_column_usage AS ccu
      ON ccu.constraint_name = tc.constraint_name
      AND ccu.table_schema = tc.table_schema
WHERE constraint_type = 'FOREIGN KEY') Queries
  GROUP BY Queries.tablename;

Deaktivieren Sie alle Trigger in der Zieldatenbank. Dafür gibt es zwei Gründe:

  • Sie können den Migrationsprozess hinsichtlich des Kopierens von Daten optimieren.
  • Mithilfe von Triggern werden oft komplexe Formen der referenziellen Integrität implementiert. Aus den bereits erläuterten Gründen können für diesen Typ des Integritätstests Fehler auftreten, während Daten übertragen werden. Verwenden Sie die folgende SQL-Anweisung, um nach allen Triggern in Ihrer Datenbank zu suchen und ein Skript zu erstellen, das sie deaktiviert:
    SELECT concat ('alter table ', event_object_table, ' disable trigger ', trigger_name)
    FROM information_schema.triggers;
    

Hinweis

Den Text für einen Trigger finden Sie mithilfe des \df+-Befehls in psql.

Erstellen einer Instanz von Azure Database Migration Service

Im Azure-Portal können Sie nun eine Instanz von Azure Database Migration Service erstellen.

Bevor Sie jedoch eine Instanz von Azure Database Migration Service erstellen, müssen Sie den Ressourcenanbieter Microsoft.DataMigration mit Ihrem Abonnement registrieren. Sie können dies wie folgt tun:

  1. Klicken Sie in der linken Menüleiste des Azure-Portals auf Alle Dienste.
  2. Klicken Sie auf der Seite Alle Dienste auf Abonnements.
  3. Wählen Sie auf der Seite Abonnements Ihr Abonnement aus.
  4. Klicken Sie auf der Abonnementseite unter Einstellungen auf Ressourcenanbieter.
  5. Geben Sie im Feld Nach Name filtern die Zeichenfolge DataMigration ein, und wählen Sie dann die Option Microsoft.DataMigration aus.
  6. Klicken Sie auf Registrieren, und warten Sie, bis der Status in Registriert geändert wurde. Möglicherweise müssen Sie auf Aktualisieren klicken, damit sich der Status ändert.
    Image showing the Resource providers page. The user is registering the Microsoft.DataMigration resource provider

Wenn der Ressourcenanbieter registriert wurde, können Sie den Dienst erstellen. Klicken Sie auf den Befehl Ressource erstellen in der linken Menüleiste, und suchen Sie nach Azure Database Migration Service.

Image showing the initial page when creating the Azure Database Migration Service

Geben Sie auf der Seite Migrationsdienst erstellen einen Namen für Ihre Instanz des Diensts ein, und geben Sie das Abonnement (dies sollte dasselbe Abonnement sein, für das Sie den Ressourcenanbieter registriert haben), die Ressourcengruppe und den Standort an. Sie müssen auch ein virtuelles Netzwerk bereitstellen, da die Database Migration Service-Instanz von einer Firewall abhängig ist, die für dieses virtuelle Netzwerk erstellt wird, um den erforderlichen Schutz bieten zu können. Wenn Sie Datenbanken von Azure-VMs migrieren, können Sie die Database Migration Service-Instanz möglicherweise im selben virtuellen Netzwerk platzieren, das von diesen VMs genutzt wird. Der Tarif bestimmt die Anzahl virtueller Prozessorkerne, die für den Dienst verfügbar sind. Wenn Sie eine Onlinemigration durchführen möchten, müssen Sie den Tarif Premium auswählen. Der Tarif Standard unterstützt nur die Offlinemigration.

Image showing the configuration for the Azure Database Migration Service. The user has selected the Premium pricing tier

Warten Sie, bis der Dienst bereitgestellt wurde, bevor Sie fortfahren. Dieser Vorgang dauert einige Minuten.

Erstellen eines Migrationsprojekts mithilfe von Azure Database Migration Service

Sie können nun Ihre Database Migration Service-Instanz verwenden, um eine Onlinemigration durchzuführen. Erstellen Sie dazu ein neues Datenbankmigrationsprojekt. Rufen Sie die Seite für Ihre Database Migration Service-Instanz auf, und klicken Sie auf Neues Migrationsprojekt.

Image showing the newly created Azure Database Migration Service.

Legen Sie auf der Seite Neues Migrationsprojekt den Quellservertyp auf PostgreSQL fest, legen Sie den Zielservertyp auf Azure Database for PostgreSQL fest, und klicken Sie dann auf Onlinedatenmigration. Auf der Seite Typ der Aktivität sind die Schritte aufgeführt, die Sie für den Quellserver durchführen müssen, um die Onlinemigration zu aktivieren. Der Text unten auf der Seite Neues Migrationsprojekt beschreibt den Prozess für das Migrieren des Schemas zum Ziel.

Image showing the migration project properties and instructions.

Schließen Sie alle aufgeführten Schritte ab, und klicken Sie dann auf Aktivität erstellen und ausführen.

Erstellen und Ausführen einer Migrationsaktivität

Das neue Migrationsprojekt startet einen Assistenten, der Sie durch den Prozess führt. Geben Sie die folgenden Details an:

  • Geben Sie auf der Seite Quelldetails hinzufügen die Adresse des Quellservers, die Quelldatenbank und ein Konto an, das eine Verbindung zu dieser Datenbank herstellen und die Daten abrufen kann. Das Konto muss über Berechtigungen eines Superusers verfügen, um die Migration durchführen zu können.
  • Geben Sie auf der Seite Zieldetails die Adresse Ihrer Instanz des Azure Database for PostgreSQL-Diensts, die Datenbank, in die die Daten migriert werden sollen, sowie die Details zu einem Konto an, das über Administratorrechte verfügt.
  • Wählen Sie auf der Seite Den Zieldatenbanken zuordnen die Quelldatenbank und die Zieldatenbank aus. Sie können eine einzelne Datenbank oder mehrere Datenbanken migrieren.
  • Geben Sie auf der Seite Migrationseinstellungen alle weiteren Einstellungen an, die Sie konfigurieren möchten, z. B. die maximale Anzahl Tabellen, die parallel geladen werden dürfen.
  • Geben Sie auf der Seite Migrationszusammenfassung einen Namen für die Aktivität ein, und klicken Sie dann auf Migration ausführen.
    Image showing the migration summary page.

Die Seite „Aktivitätsstatus“ zeigt den Fortschritt der Migration sowie alle aufgetretenen Fehler. Wenn bei der Migration Fehler auftreten, können Sie die Probleme beheben und die Aktivität wiederholen. Wenn Sie eine Onlinemigration durchführen, wird der Status in Zur Übernahme bereit geändert, sobald die vorhandenen Daten übertragen wurden. Die Aktivität wird jedoch weiter ausgeführt, damit alle weiteren Änderungen übertragen werden, die auftreten, während Anwendungen noch aktiv die ursprüngliche Datenbank nutzen.

Image showing the activity status page for the migration activity. The migration has transferred all the current data, and is ready to cutover to the new database.

Reaktivieren von Fremdschlüsseln und Triggern

Sie haben die Daten nun übertragen, und Anwendungen können mit ihrer Verwendung beginnen. Sie sollten die Fremdschlüssel, die Sie vor der Migration der Daten entfernt haben, nun neu erstellen und alle Trigger reaktivieren. Wenn einige Anwendungen noch mit der ursprünglichen Datenbank verbunden sind, sorgt die Write-Ahead-Protokollierung dafür, dass die Zieldatenbank in Azure aktuell gehalten wird. Die Write-Ahead-Protokollierung wird von Fremdschlüsseln und Triggern nicht nachteilig beeinträchtigt.

Übernahme zur neuen Datenbank

Wenn alle Anwendungen in die neue Datenbank übertragen wurden, können Sie den Migrationsprozess abschließen und die Übernahme für die neue Datenbank starten. Wählen Sie auf der Seite „Aktivitätsstatus“ den Namen der Datenbank aus, die migriert wird, damit eine Zusammenfassung der durchgeführten Aufgaben angezeigt wird.

Image showing the statistics for the migration activity.

Klicken Sie auf Übernahme starten. Eine Seite wird angezeigt, in der Sie bestätigen sollen, dass der Vorgang abgeschlossen ist. Zu diesem Zeitpunkt werden alle verbleibenden Einträge aus dem Write-Ahead-Protokoll für die Quelldatenbank gelöscht, und Updates werden angehalten. Alle weiteren Änderungen, die an der Quelldatenbank vorgenommen werden, werden nicht übernommen.

Image of the Complete cutover page.

Durchführen einer Offlinemigration

Bei einer Offlinemigration wird eine „Momentaufnahme“ der Quelldatenbank zu einem bestimmten Zeitpunkt erstellt, und diese Daten werden in die Zieldatenbank kopiert. Alle Änderungen, die nach der Momentaufnahme an den Quelldaten vorgenommen werden, werden für die Zieldatenbank nicht übernommen.

Wenn Sie eine Offlinemigration zu Azure Database for PostgreSQL oder zu einem PostgreSQL-Server durchführen möchten, der an anderer Stelle ausgeführt wird, z. B. auf einer Azure-VM, stehen Ihnen mindestens zwei Optionen zur Verfügung:

  • Exportieren Sie das Schema und die Daten aus der Quelldatenbank mithilfe des pg_dump-Hilfsprogramms, und importieren Sie das Schema und die Daten mithilfe des psql-Hilfsprogramms in die Zieldatenbank. Mit dieser Methode ist es Ihnen möglich, das Schema und die Daten zu ändern, neu zu formatieren und zu bereinigen, wenn dies erforderlich ist, bevor Sie die Daten und das Schema in die Zieldatenbank übertragen.
  • Sichern Sie sie Daten aus der Quelldatenbank, auch wieder mithilfe von pg_dump, und stellen Sie die Daten in der Zieldatenbank mithilfe von pg_restore wieder her. Diese Methode ist schneller als die Verwendung eines Exports und eines Imports, die Daten werden jedoch in einem Format gesichert, das nicht einfach geändert werden kann. Verwenden Sie diesen Ansatz, wenn das Schema oder die Daten nicht optimiert werden müssen.

Hinweis

Aktuell können Sie Azure Database Migration Service nicht nutzen, um eine Offlinemigration einer PostgreSQL-Datenbank durchzuführen.

Migrieren mithilfe eines Exports und eines Imports

Führen Sie die folgenden Schritte durch, um eine Datenbank mithilfe des Export- und Importansatzes zu migrieren.

  1. Exportieren Sie das Schema mithilfe des pg_dump-Befehls in einer Bash-Eingabeaufforderung:

    pg_dump -o -h [source database server] -U [user name] -d [database] -s > db_schema.sql
    
  2. Exportieren Sie die Daten mithilfe des pg_dump-Befehls in eine andere Datei:

    pg_dump -o -h [source database server] -U [user name] -d [database] -a > db_data.sql
    

    An dieser Stelle sind db_schema.sql und db_data.sql SQL-Skripts, die Sie mithilfe eines Text-Editors bearbeiten.

  3. Erstellen Sie die Zieldatenbank in Azure Database for PostgreSQL. Nutzen Sie dafür die Azure CLI:

    az postgres db create \
        --name [database name] \
        --server-name [server name] \
        --resource-group [azure resource group]
    
  4. Importieren Sie das Schema mithilfe des psql-Befehls in die Zieldatenbank:

    psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_schema.sql
    
  5. Importieren Sie die Daten mithilfe des psql-Befehls in die Zieldatenbank:

    psql -d [target database name] -h [server name in Azure Database for PostgreSQL] -U [user name] -f db_data.sql
    

Migrieren mithilfe von Sicherung und Wiederherstellung

Diese Schritte beschreiben den Migrationsprozess für eine Datenbank mithilfe von Sicherung und Wiederherstellung.

  1. Sicheren Sie die Datenbank über eine Bash-Eingabeaufforderung, indem Sie den folgenden Befehl ausführen. Geben Sie den Namen eines Benutzers an, der die erforderlichen Berechtigungen hat, um die Datenbank zu sichern:

    pg_dump [database name] -h [source database server] -U [user name] -Fc > database_backup.bak
    
  2. Erstellen Sie die Zieldatenbank in Azure Database for PostgreSQL:

    az postgres db create \
        --name [database name] \
        --server-name [server name] \
        --resource-group [azure resource group] \
    
  3. Stellen Sie die Sicherung in der neuen Datenbank mit dem pg_restore-Befehl über eine Bash-Eingabeaufforderung wieder her. Geben Sie den Namen eines Benutzers mit Administratorrechten in Ihrem Azure Database for PostgreSQL-Dienst an:

    pg_restore -d [target database name] -h [server name in Azure Database for PostgreSQL] -Fc -U [user name] database_backup.bak