Übung: Migrieren einer lokalen PostgreSQL-Datenbank zu Azure Database for PostgreSQL

Abgeschlossen

In dieser Übung migrieren Sie eine PostgreSQL-Datenbank zu Azure. Sie migrieren eine vorhandene PostgreSQL-Datenbank, die auf einer VM ausgeführt wird, zu Azure Database for PostgreSQL.

Sie arbeiten als Datenbankentwickler für die Organisation AdventureWorks. AdventureWorks verkauft seit mehr als einem Jahrzehnt Fahrräder und Zubehör direkt an Endkunden und Vertriebspartner. In den Systemen des Onlinehändlers werden Informationen in einer Datenbank gespeichert, die aktuell mithilfe von PostgreSQL auf einer Azure-VM ausgeführt wird. Im Rahmen einer Hardwarerationalisierung möchte AdventureWorks die Datenbank zu einer von Azure verwalteten Datenbank verschieben. Sie wurden mit der Durchführung dieser Migration beauftragt.

Wichtig

Azure Database Migration Service wird in der kostenlosen Azure-Sandboxumgebung nicht unterstützt. Sie können die Schritte in Ihrem persönlichen Abonnement ausführen oder einfach nur die Erläuterungen lesen, um zu erfahren, wie Sie Ihre Datenbank migrieren.

Einrichten der Umgebung

Führen Sie die folgenden Azure CLI-Befehl in einer Cloud Shell-Instanz aus, um eine VM zu erstellen, auf der PostgreSQL ausgeführt wird, die eine Kopie der Datenbank von AdventureWorks enthält. Die letzten Befehle geben die IP-Adresse der neuen VM zurück.

az account list-locations -o table

az group create \
    --name migrate-postgresql \
    --location <CHOOSE A LOCATION FROM ABOVE NEAR YOU>

az vm create \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --admin-username azureuser \
    --admin-password Pa55w.rdDemo \
    --image Ubuntu2204 \
    --public-ip-address-allocation static \
    --public-ip-sku Standard \
    --vnet-name postgresqlvnet \
    --nsg ""

az vm run-command invoke \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --command-id RunShellScript \
    --scripts "
# Install PostgreSQL
sudo echo deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main > /etc/apt/sources.list.d/pgdg.list
sudo wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get -y update
sudo apt-get -y install postgresql-10
# Clone exercise code
sudo git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git /home/azureuser/workshop    
# Configure PostgreSQL
sudo service postgresql stop
sudo bash << EOF
    printf \"listen_addresses = '*'\nwal_level = logical\nmax_replication_slots = 5\nmax_wal_senders = 10\n\" >> /etc/postgresql/10/main/postgresql.conf
    printf \"host    all             all             0.0.0.0/0               md5\n\" >> /etc/postgresql/10/main/pg_hba.conf
EOF
sudo service postgresql start

# Add the azureuser role and adventure works
sudo bash << EOF
su postgres << EOC
printf \"create role azureuser with login;alter role azureuser createdb;alter role azureuser password 'Pa55w.rd';alter role azureuser superuser;create database adventureworks;grant all privileges on database adventureworks to azureuser; \" | psql
EOC
EOF

PGPASSWORD=Pa55w.rd psql -h localhost -U azureuser adventureworks -E -q -f /home/azureuser/workshop/migration_samples/setup/postgresql/adventureworks/adventureworks.sql
"

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 200 \
    --port '22'

az vm open-port \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --priority 300 \
    --port '5432'

echo Setup Complete

SQLIP="$(az vm list-ip-addresses \
    --resource-group migrate-postgresql \
    --name postgresqlvm \
    --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
    --output tsv)"

echo $SQLIP

Die Ausführung dieser Befehle dauert etwa fünf Minuten. Sie müssen jedoch nicht warten, sondern können mit den unten stehenden Schritten fortfahren.

Erstellen des flexiblen Servers für Azure Database for PostgreSQL

  1. Öffnen Sie in einem Webbrowser eine neue Registerkarte, und navigieren Sie zum Azure-Portal.

  2. Geben Sie auf der Suchleiste den Suchbegriff Flexible Server für Azure Database for PostgreSQL ein.

  3. Wählen Sie auf der Seite Flexible Server für Azure Database for PostgreSQL die Option + Erstellen aus.

  4. Geben Sie auf der Seite Flexibler Server die folgenden Details ein, und wählen Sie anschließend Überprüfen + erstellen aus:

    Eigenschaft Wert
    Ressourcengruppe migrate-postgresql
    Servername adventureworksnnn, wobei nnn ein Suffix Ihrer Wahl ist, durch das der Servername eindeutig wird
    Standort Wählen Sie den nächstgelegenen Standort aus.
    PostgreSQL-Version 13
    Compute und Speicher Klicken Sie auf Server konfig., wählen Sie den Tarif Basic aus, und klicken Sie dann auf OK.
    Administratorbenutzername awadmin
    Kennwort Pa55w.rdDemo
    Kennwort bestätigen Pa55w.rdDemo
  5. Wählen Sie auf der Seite Überprüfen + erstellen die Option Erstellen aus. Warten Sie, bis der Dienst erstellt wurde, bevor Sie fortfahren.

  6. Nachdem der Dienst erstellt wurde, klicken Sie auf Zu Ressource wechseln.

  7. Klicken Sie auf Verbindungssicherheit.

  8. Legen Sie auf der Seite Verbindungssicherheit für Zugriff auf Azure-Dienste erlauben die Option Ja fest.

  9. Fügen Sie in der Liste der Firewallregeln eine Regel namens VM hinzu, und legen Sie Start-IP-Adresse und End-IP-Adresse auf die IP-Adresse der VM fest, die auf dem PostgreSQL-Server ausgeführt wird, den Sie zuvor erstellt haben.

  10. Klicken Sie auf Aktuelle Client-IP-Adresse hinzufügen, um es Ihrem Clientcomputer zu ermöglichen, eine Verbindung zur Datenbank herzustellen.

  11. Speichern Sie, und warten Sie, bis die Firewallregeln aktualisiert wurden.

  12. Führen Sie in der Cloud Shell-Eingabeaufforderung den folgenden Befehl aus, um eine neue Datenbank in Ihrem Azure Database for PostgreSQL-Dienst zu erstellen. Ersetzen Sie [nnn] durch das Suffix, das Sie verwendet haben, als Sie den Azure Database for PostgreSQL-Dienst erstellt haben. Ersetzen Sie [resource group] durch den Namen der Ressourcengruppe, den Sie für den Dienst angegeben haben:

    az postgres flexible-server create \
      --name azureadventureworks \
      --resource-group migrate-postgresql
    

    Wenn die Datenbank erfolgreich erstellt wurde, sollte eine Meldung ähnlich der folgenden angezeigt werden:

    {
      "charset": "UTF8",
      "collation": "English_United States.1252",
      "name": "azureadventureworks",
      "resourceGroup": "migrate-postgresql",
      "type": "Microsoft.DBforPostgreSQL/servers/databases"
    }
    

Exportieren des Schemas zur Verwendung in der Zieldatenbank

Sie verbinden nun Ihre vorhandene PostgreSQL-VM mithilfe von Cloud Shell, um Ihr Datenbankschema zu exportieren.

  1. Führen Sie diesen Azure CLI-Befehl aus, damit die IP-Adresse für Ihre vorhandene VM angezeigt wird.

    SQLIP="$(az vm list-ip-addresses \
        --resource-group migrate-postgresql \
        --name postgresqlvm \
        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
        --output tsv)"
    
    echo $SQLIP
    
  2. Stellen Sie mit SSH eine Verbindung mit Ihrem alten Datenbankserver her. Geben Sie Pa55w.rdDemo als Kennwort ein.

    ssh azureuser@$SQLIP
    
  3. Führen Sie den folgenden Befehl aus, um eine Verbindung zur Datenbank auf der VM herzustellen. Das Kennwort für den Benutzer azureuser auf dem PostgreSQL-Server, der auf der VM ausgeführt wird, lautet Pa55w.rd:

    psql adventureworks
    
  4. Gewähren Sie azureuser die Replikationsberechtigung:

    ALTER ROLE azureuser REPLICATION;
    
  5. Schließen Sie das psql-Hilfsprogramm mit dem \q-Befehl.

  6. Führen Sie in der Bash-Eingabeaufforderung den folgenden Befehl aus, um das Schema für die adventureworks-Datenbank in eine Datei namens adventureworks_schema.sql zu exportieren.

    pg_dump -o  -d adventureworks -s > adventureworks_schema.sql
    

Importieren des Schemas in die Zieldatenbank

  1. Führen Sie den folgenden Befehl aus, um eine Verbindung zum azureadventureworks[nnn]-Server herzustellen. Ersetzen Sie die beiden Instanzen von [nnn] durch das Suffix für Ihren Dienst. Beachten Sie, dass der Benutzer das Suffix @adventureworks[nnn] aufweist. Geben Sie in der Eingabeaufforderung für das Kennwort Pa55w.rdDemo ein.

    psql -h adventureworks[nnn].postgres.database.azure.com -U awadmin@adventureworks[nnn] -d postgres
    
  2. Führen Sie die folgenden Befehle aus, um einen Benutzer namens azureuser zu erstellen, und legen Sie das Kennwort für diesen Benutzer auf Pa55w.rd fest. Die dritte Anweisung gewährt dem Benutzer azureuser die erforderlichen Berechtigungen, um Objekte in der Datenbank azureadventureworks zu erstellen und zu verwalten. Die Rolle azure_pg_admin ermöglicht es dem Benutzer azureuser, Erweiterungen in der Datenbank zu installieren und zu verwenden.

    CREATE ROLE azureuser WITH LOGIN;
    ALTER ROLE azureuser PASSWORD 'Pa55w.rd';
    GRANT ALL PRIVILEGES ON DATABASE azureadventureworks TO azureuser;
    GRANT azure_pg_admin TO azureuser;
    
  3. Schließen Sie das psql-Hilfsprogramm mit dem \q-Befehl.

  4. Importieren Sie das Schema für die adventureworks-Datenbank in die azureadventureworks-Datenbank, die in Ihrem Azure Database for PostgreSQL-Dienst ausgeführt wird. Sie führen den Import als azureuser durch, geben Sie also bei Aufforderung das Kennwort Pa55w.rd ein.

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -E -q -f adventureworks_schema.sql
    

    Bei Erstellung der einzelnen Elemente werden mehrere Nachrichten angezeigt. Das Skript sollte ohne Fehler abgeschlossen werden.

  5. Führen Sie den folgenden Befehl aus. Das findkeys.sql-Skript erstellt ein anderes SQL-Skript namens dropkeys.sql, das alle Fremdschlüssel aus den Tabellen in der azureadventureworks-Datenbank entfernt. Sie führen gleich das dropkeys.sql-Skript aus:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/findkeys.sql -o dropkeys.sql -t
    
  6. Führen Sie den folgenden Befehl aus. Das createkeys.sql-Skript erstellt ein weiteres SQL-Skript namens addkeys.sql, das alle Fremdschlüssel neu erstellt. Sie führen das addkeys.sql-Skript aus, nachdem Sie die Datenbank migriert haben:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/createkeys.sql -o addkeys.sql -t
    
  7. Führen Sie das dropkeys.sql-Skript aus:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f dropkeys.sql
    

    Mehrere ALTER TABLE-Nachrichten werden angezeigt, wenn die Fremdschlüssel entfernt werden.

  8. Starten Sie noch mal das psql-Hilfsprogramm, und stellen Sie eine Verbindung zur azureadventureworks-Datenbank her.

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    
  9. Führen Sie die folgende Abfrage aus, um die Details zu allen verbleibenden Fremdschlüsseln anzuzeigen:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'FOREIGN KEY';
    

    Diese Abfrage sollte ein leeres Resultset zurückgeben. Wenn jedoch noch Fremdschlüssel vorhanden sind, führen Sie für jeden Fremdschlüssel den folgenden Befehl aus:

    ALTER TABLE [table_schema].[table_name] DROP CONSTRAINT [constraint_name];
    
  10. Nachdem Sie alle verbleibenden Fremdschlüssel entfernt haben, führen Sie die folgende SQL-Anweisung aus, um die Trigger in der Datenbank anzuzeigen:

    SELECT trigger_name
    FROM information_schema.triggers;
    

    Diese Abfrage sollte ebenfalls ein leeres Resultset zurückgeben, was darauf hindeutet, dass die Datenbank keine Trigger enthält. Wenn die Datenbank noch Trigger enthalten hätte, müssten Sie sie deaktivieren, bevor Sie die Daten migrieren, und sie danach reaktivieren.

  11. Schließen Sie das psql-Hilfsprogramm mit dem \q-Befehl.

Durchführen einer Onlinemigration mit Database Migration Service

  1. Kehren Sie zum Azure-Portal zurück.

  2. Klicken Sie auf Alle Dienste, klicken Sie auf Abonnements, und wählen Sie dann Ihr Abonnement aus.

  3. Klicken Sie auf der Abonnementseite unter Einstellungen auf Ressourcenanbieter.

  4. Geben Sie im Feld Nach Name filtern die Zeichenfolge DataMigration ein, und wählen Sie dann die Option Microsoft.DataMigration aus.

  5. Wenn Microsoft.DataMigration nicht registriert ist, 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.

  6. Klicken Sie auf Ressource erstellen, geben Sie im Feld Marketplace durchsuchen den Suchbegriff Azure Database Migration Service ein, und drücken Sie die EINGABETASTE.

  7. Klicken Sie auf der Seite Azure Database Migration Service auf Erstellen.

  8. Geben Sie auf der Seite Migrationsdienst erstellen die folgenden Details an, und klicken Sie dann auf Weiter: Netzwerk>>.

    Eigenschaft Wert
    Auswählen einer Ressourcengruppe migrate-postgresql
    Dienstname adventureworks_migration_service
    Standort Wählen Sie den nächstgelegenen Standort aus.
    Dienstmodus Azure
    Tarif Premium, mit 4 virtuellen Kernen
  9. Klicken Sie auf der Seite Netzwerk auf das virtuelle Netzwerk postgresqlvnet/posgresqlvmSubnet. Dieses Netzwerk wurde im Rahmen der Einrichtung erstellt.

  10. Wählen Sie Überprüfen und erstellen und anschließend Erstellen aus. Warten Sie, bis die Database Migration Service-Instanz erstellt wurde. Dieser Vorgang nimmt einige Minuten in Anspruch.

  11. Nachdem der Dienst erstellt wurde, klicken Sie auf Zu Ressource wechseln.

  12. Wählen Sie Neues Migrationsprojekt aus.

  13. Geben Sie auf der Seite Neues Migrationsprojekt die folgenden Details ein, und klicken Sie dann auf Aktivität erstellen und ausführen.

    Eigenschaft Wert
    Projektname adventureworks_migration_project
    Quellservertyp PostgreSQL
    Zieldatenbank für PostgreSQL Azure-Datenbank für PostgreSQL
    Aktivitätstyp auswählen Onlinedatenmigration
  14. Wenn der Migrations-Assistent gestartet wurde, geben Sie auf der Seite Quelle auswählen die folgenden Details ein, und klicken Sie dann auf Weiter: Ziel auswählen>>.

    Eigenschaft Wert
    Name des Quellservers nn.nn.nn.nn (Die IP-Adresse der Azure-VM, die PostgreSQL ausführt)
    Serverport 5432
    Datenbank adventureworks
    Benutzername azureuser
    Kennwort Pa55w.rd
    Serverzertifikat vertrauen Ausgewählt
    Verschlüsseln der Verbindung Ausgewählt
  15. Geben Sie auf der Seite Ziel auswählen die folgenden Details ein, und klicken Sie dann auf Weiter: Datenbanken auswählen>>.

    Eigenschaft Wert
    Azure PostgreSQL adventureworks[nnn]
    Datenbank azureadventureworks
    Benutzername azureuser@adventureworks[nnn]
    Kennwort Pa55w.rd
  16. Wählen Sie auf der Seite Datenbanken auswählen die Datenbank adventureworks aus, und ordnen Sie sie azureadventureworks zu. Heben Sie die Auswahl der postgres-Datenbank auf. Klicken Sie auf Weiter: Tabellen auswählen>>.

  17. Klicken Sie auf der Seite Tabellen auswählen auf Weiter: Migrationseinstellungen konfigurieren>>.

  18. Erweitern Sie auf der Seite Migrationseinstellungen konfigurieren das Dropdown für adventureworks, erweitern Sie das Dropdown für Erweiterte Einstellungen für die Onlinemigration, überprüfen Sie, ob Maximum number of instances to load in parallel (Maximale Anzahl an Instanzen, die parallel geladen werden) auf 5 festgelegt ist, und klicken Sie dann auf Weiter: Zusammenfassung>>.

  19. Geben Sie auf der Seite Zusammenfassung im Feld Aktivitätsname die Zeichenfolge AdventureWorks_Migration_Activity ein, und klicken Sie dann auf Migration starten.

  20. Klicken Sie auf der Seite AdventureWorks_Migration_Activity in 15-Sekunden-Abständen auf Aktualisieren. Sie können den Status des laufenden Migrationsvorgangs verfolgen. Warten Sie, bis die Spalte MIGRATIONSDETAILS in Zur Übernahme bereit geändert wurde.

  21. Wechseln Sie zurück zur Cloud Shell-Instanz.

  22. Führen Sie den folgenden Befehl aus, um die Fremdschlüssel in der Datenbank azureadventureworks neu zu erstellen. Sie haben zuvor das Skript addkeys.sql erstellt:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks -f addkeys.sql
    

    Wenn die Fremdschlüssel hinzugefügt werden, werden mehrere ALTER TABLE-Anweisungen angezeigt. Möglicherweise wird ein Fehler zur Tabelle SpecialOfferProduct angezeigt, den Sie aber vorerst ignorieren können. Der Fehler ist einer UNIQUE-Einschränkung geschuldet, die nicht ordnungsgemäß übertragen werden kann. In einem realen Szenario würden Sie die Details dieser Einschränkung aus der Quelldatenbank mithilfe der folgenden Abfrage abrufen:

    SELECT constraint_type, table_schema, table_name, constraint_name
    FROM information_schema.table_constraints
    WHERE constraint_type = 'UNIQUE';
    

    Sie können diese Einschränkung dann manuell in der Zieldatenbank in Azure Database for PostgreSQL reaktivieren.

    Weitere Fehler sollten nicht auftreten.

Ändern von Daten und Übernahme der Daten in die neue Datenbank

  1. Kehren Sie zur Seite AdventureWorks_Migration_Activity im Azure-Portal zurück.

  2. Wählen Sie die Datenbank adventureworks aus.

  3. Überprüfen Sie auf der Seite adventureworks, ob für Vollständiger Ladevorgang abgeschlossen der Wert 66 und für alle anderen Werte 0 festgelegt ist.

  4. Wechseln Sie zurück zur Cloud Shell-Instanz.

  5. Führen Sie den folgenden Befehl aus, um eine Verbindung zur adventureworks-Datenbank herzustellen, die mithilfe von PostgreSQL auf der VM ausgeführt wird:

    psql adventureworks
    
  6. Führen Sie die folgenden SQL-Anweisungen aus, um die Bestellungen 43659, 43660 und 43661 anzuzeigen, und entfernen Sie sie anschließend aus der Datenbank. Sie können feststellen, dass die Datenbank ein kaskadierendes Delete für die salesorderheader-Tabelle implementiert. Dabei werden automatisch die entsprechenden Zeilen aus der salesorderdetail-Tabelle gelöscht.

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    DELETE FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    
  7. Schließen Sie das psql-Hilfsprogramm mit dem \q-Befehl.

  8. Kehren Sie zur Seite adventureworks im Azure-Portal zurück, und klicken Sie auf Aktualisieren. Überprüfen Sie, ob 32 Änderungen umgesetzt wurden.

  9. Klicken Sie auf Übernahme starten.

  10. Klicken Sie auf der Seite Umstellung abschließen auf Bestätigen, und klicken Sie dann auf Anwenden. Warten Sie, bis sich der Status in Abgeschlossen ändert.

  11. Wechseln Sie wieder zu Cloud Shell.

  12. Führen Sie den folgenden Befehl aus, um eine Verbindung zur azureadventureworks-Datenbank herzustellen, die mithilfe Ihres Azure Database for PostgreSQL-Diensts ausgeführt wird:

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    

    Das Kennwort ist Pa55w.rd.

  13. Führen Sie die folgenden SQL-Anweisungen aus, um die Bestellungen und die Bestellungsdetails in der Datenbank anzuzeigen. Zeigen Sie jeweils nur die erste Seite jeder Tabelle an. Der Zweck dieser Abfragen besteht darin, zu zeigen, dass die Daten übertragen wurden:

    SELECT * FROM sales.salesorderheader;
    SELECT * FROM sales.salesorderdetail;
    
  14. Führen Sie die folgenden SQL-Anweisungen aus, um die Bestellungen und die Bestellungsdetails für die Bestellungen 43659, 43660 und 43661 anzuzeigen.

    SELECT * FROM sales.salesorderheader WHERE salesorderid IN (43659, 43660, 43661);
    SELECT * FROM sales.salesorderdetail WHERE salesorderid IN (43659, 43660, 43661);
    

    Beide Abfragen sollten 0 Zeilen zurückgeben.

  15. Schließen Sie das psql-Hilfsprogramm mit dem \q-Befehl.

Bereinigen der von Ihnen erstellten Ressourcen

Wichtig

Wenn Sie diese Schritte in Ihrem persönlichen Abonnement ausgeführt haben, können Sie entweder die Ressourcen einzeln löschen oder durch Löschen der Ressourcengruppe alle Ressourcen löschen. Ressourcen, die weiterhin ausgeführt werden, können Sie Geld kosten.

  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um die Ressourcengruppe zu löschen:
az group delete --name migrate-postgresql