Ćwiczenie: migrowanie lokalnej bazy danych PostgreSQL do usługi Azure Database for PostgreSQL

Ukończone

W tym ćwiczeniu przeprowadzisz migrację bazy danych PostgreSQL na platformę Azure. Przeprowadzisz migrację istniejącej bazy danych PostgreSQL uruchomionej na maszynie wirtualnej do usługi Azure Database for PostgreSQL.

Pracujesz jako deweloper bazy danych w organizacji AdventureWorks. AdventureWorks od ponad dekady sprzedaje rowery i części rowerowe bezpośrednio dla konsumentów i dystrybutorów. Ich systemy przechowują informacje w bazie danych, która obecnie działa przy użyciu bazy danych PostgreSQL na maszynie wirtualnej platformy Azure. W ramach ćwiczenia racjonalizacji sprzętu firma AdventureWorks chce przenieść bazę danych do zarządzanej bazy danych platformy Azure. Poproszono Cię o przeprowadzenie tej migracji.

Ważne

Usługa Azure Data Migration Service nie jest obsługiwana w bezpłatnym środowisku piaskownicy platformy Azure. Możesz wykonać te kroki we własnej subskrypcji osobistej lub po prostu postępować zgodnie z instrukcjami, aby dowiedzieć się, jak przeprowadzić migrację bazy danych.

Konfigurowanie środowiska

Uruchom te polecenia interfejsu wiersza polecenia platformy Azure w usłudze Cloud Shell, aby utworzyć maszynę wirtualną z uruchomioną bazą danych PostgreSQL z kopią bazy danych adventureworks. Ostatnie polecenia będą wyświetlać adres IP nowej maszyny wirtualnej.

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

Wykonanie tych poleceń potrwa około 5 minut. Nie musisz czekać, możesz kontynuować wykonywanie poniższych kroków.

Tworzenie serwera elastycznego usługi Azure Database for PostgreSQL

  1. Za pomocą przeglądarki internetowej otwórz nową kartę i przejdź do witryny Azure Portal.

  2. Na pasku wyszukiwania wpisz azure Database for PostgreSQL — serwery elastyczne.

  3. Na stronie serwerów elastycznych usługi Azure Database for PostgreSQL wybierz pozycję + Utwórz.

  4. Na stronie Serwer elastyczny wprowadź następujące szczegóły, a następnie wybierz pozycję Przejrzyj i utwórz:

    Właściwości Wartość
    Grupa zasobów migrate-postgresql
    Nazwa serwera adventureworksnnn, gdzie nnn jest sufiksem wyboru, aby nazwa serwera był unikatowy
    Lokalizacja Wybierz najbliższą lokalizację
    Wersja PostgreSQL 13
    Obliczenia i magazyn Wybierz pozycję Konfiguruj serwer, wybierz warstwę cenową Podstawowa, a następnie wybierz przycisk OK.
    Nazwa użytkownika administratora awadmin
    Password Pa55w.rdDemo
    Potwierdź hasło Pa55w.rdDemo
  5. Na stronie Przeglądanie i tworzenie wybierz pozycję Utwórz. Przed kontynuowaniem poczekaj na utworzenie usługi.

  6. Po utworzeniu usługi wybierz pozycję Przejdź do zasobu.

  7. Wybierz pozycję Zabezpieczenia Połączenie ion.

  8. Na stronie zabezpieczeń Połączenie ion ustaw opcję Zezwalaj na dostęp do usług platformy Azure na wartość Tak.

  9. Na liście reguł zapory dodaj regułę o nazwie VM i ustaw początkowy adres IP i KOŃCOWY adres IP na adres IP maszyny wirtualnej z uruchomionym wcześniej serwerem PostgreSQL.

  10. Wybierz pozycję Dodaj bieżący adres IP klienta, aby umożliwić maszynie klienckiej nawiązywanie połączenia z bazą danych.

  11. Zapisz i poczekaj na zaktualizowanie reguł zapory.

  12. W wierszu polecenia usługi Cloud Shell uruchom następujące polecenie, aby utworzyć nową bazę danych w usłudze Azure Database for PostgreSQL. Zastąp ciąg [nnn] sufiksem użytym podczas tworzenia usługi Azure Database for PostgreSQL. Zastąp ciąg [grupa zasobów] nazwą grupy zasobów określonej dla usługi:

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

    Jeśli baza danych została utworzona pomyślnie, powinien zostać wyświetlony komunikat podobny do następującego:

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

Eksportowanie schematu do użycia w docelowej bazie danych

Teraz połączysz się z istniejącą maszyną wirtualną PostgreSQL przy użyciu usługi Cloud Shell w celu wyeksportowania schematu bazy danych.

  1. Uruchom to polecenie interfejsu wiersza polecenia platformy Azure, aby wyświetlić adres IP istniejącej maszyny wirtualnej.

    SQLIP="$(az vm list-ip-addresses \
        --resource-group migrate-postgresql \
        --name postgresqlvm \
        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
        --output tsv)"
    
    echo $SQLIP
    
  2. Połączenie do starego serwera bazy danych przy użyciu protokołu SSH. Wprowadź wartość Pa55w.rdDemo jako hasło.

    ssh azureuser@$SQLIP
    
  3. Uruchom następujące polecenie, aby nawiązać połączenie z bazą danych na maszynie wirtualnej. Hasło użytkownika azureuser na serwerze PostgreSQL uruchomionym na maszynie wirtualnej to Pa55w.rd:

    psql adventureworks
    
  4. Udziel uprawnień replikacji użytkownikowi azureuser:

    ALTER ROLE azureuser REPLICATION;
    
  5. Zamknij narzędzie psql za pomocą polecenia \q.

  6. W wierszu polecenia powłoki bash uruchom następujące polecenie, aby wyeksportować schemat bazy danych adventureworks do pliku o nazwie adventureworks_schema.sql

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

Importowanie schematu do docelowej bazy danych

  1. Uruchom następujące polecenie, aby nawiązać połączenie z serwerem azureadventureworks[nnn]. Zastąp dwa wystąpienia elementu [nnn] sufiksem usługi. Należy pamiętać, że nazwa użytkownika ma sufiks @adventureworks[nnn]. W wierszu polecenia hasła wprowadź wartość Pa55w.rdDemo.

    psql -h adventureworks[nnn].postgres.database.azure.com -U awadmin@adventureworks[nnn] -d postgres
    
  2. Uruchom następujące polecenia, aby utworzyć użytkownika o nazwie azureuser i ustawić hasło dla tego użytkownika na Pa55w.rd. Trzecia instrukcja daje użytkownikowi azureuser niezbędne uprawnienia do tworzenia obiektów i zarządzania nimi w bazie danych azureadventureworks . Rola azure_pg_admin umożliwia użytkownikowi azureuser instalowanie i używanie rozszerzeń w bazie danych.

    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. Zamknij narzędzie psql za pomocą polecenia \q.

  4. Zaimportuj schemat bazy danych adventureworks do bazy danych azureadventureworks uruchomionej w usłudze Azure Database for PostgreSQL. Import jest wykonywany jako azureuser, więc po wyświetleniu monitu wprowadź hasło Pa55w.rd .

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

    Podczas tworzenia każdego elementu zostanie wyświetlona seria komunikatów. Skrypt powinien zostać ukończony bez żadnych błędów.

  5. Uruchom następujące polecenie: Skrypt findkeys.sql generuje inny skrypt SQL o nazwie dropkeys.sql , który spowoduje usunięcie wszystkich kluczy obcych z tabel w bazie danych azureadventureworks . Wkrótce uruchomisz skrypt dropkeys.sql :

    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. Uruchom następujące polecenie: Skrypt createkeys.sql generuje inny skrypt SQL o nazwie addkeys.sql , który utworzy ponownie wszystkie klucze obce. Po przeprowadzeniu migracji bazy danych uruchomisz skrypt addkeys.sql :

    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. Uruchom skrypt dropkeys.sql:

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

    Zostanie wyświetlona seria komunikatów ALTER TABLE , ponieważ klucze obce są porzucane.

  8. Ponownie Stat narzędzie psql i połącz się z bazą danych azureadventureworks .

    psql -h adventureworks[nnn].postgres.database.azure.com -U azureuser@adventureworks[nnn] -d azureadventureworks
    
  9. Uruchom następujące zapytanie, aby znaleźć szczegóły pozostałych kluczy obcych:

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

    To zapytanie powinno zwrócić pusty zestaw wyników. Jeśli jednak jakiekolwiek klucze obce nadal istnieją, dla każdego klucza obcego uruchom następujące polecenie:

    ALTER TABLE [table_schema].[table_name] DROP CONSTRAINT [constraint_name];
    
  10. Po usunięciu pozostałych kluczy obcych wykonaj następującą instrukcję SQL, aby wyświetlić wyzwalacze w bazie danych:

    SELECT trigger_name
    FROM information_schema.triggers;
    

    To zapytanie powinno również zwrócić pusty zestaw wyników wskazujący, że baza danych nie zawiera żadnych wyzwalaczy. Jeśli baza danych zawierała wyzwalacze, należy je wyłączyć przed migracją danych i ponownie je włączyć później.

  11. Zamknij narzędzie psql za pomocą polecenia \q.

Przeprowadzanie migracji online przy użyciu usługi Database Migration Service

  1. Wróć do witryny Azure Portal.

  2. Wybierz pozycję Wszystkie usługi, wybierz pozycję Subskrypcje, a następnie wybierz subskrypcję.

  3. Na stronie subskrypcji w obszarze Ustawienia wybierz pozycję Dostawcy zasobów.

  4. W polu Filtruj według nazwy wpisz DataMigration, a następnie wybierz pozycję Microsoft.DataMigration.

  5. Jeśli wartość Microsoft.DataMigration nie jest zarejestrowana, wybierz pozycję Zarejestruj i poczekaj na zmianę stanu na Zarejestrowano. Może być konieczne wybranie pozycji Odśwież , aby zobaczyć zmianę stanu.

  6. Wybierz pozycję Utwórz zasób, w polu Wyszukaj w witrynie Marketplace wpisz Azure Database Migration Service, a następnie naciśnij klawisz Enter.

  7. Na stronie Azure Database Migration Service wybierz pozycję Utwórz.

  8. Na stronie Tworzenie usługi Migration Service wprowadź następujące szczegóły, a następnie wybierz pozycję Dalej: Sieć>>.

    Właściwości Wartość
    Wybieranie grupy zasobów migrate-postgresql
    Service name adventureworks_migration_service
    Lokalizacja Wybierz najbliższą lokalizację
    Tryb usługi Azure
    Warstwa cenowa Premium z 4 rdzeniami wirtualnymi
  9. Na stronie Sieć wybierz sieć wirtualną postgresqlvnet/posgresqlvmSubnet. Ta sieć została utworzona w ramach konfiguracji.

  10. Wybierz pozycję Przeglądanie i tworzenie, a następnie wybierz pozycję Utwórz. Zaczekaj na utworzenie usługi Database Migration Service. Operacja potrwa kilka minut.

  11. Po utworzeniu usługi wybierz pozycję Przejdź do zasobu.

  12. Wybierz pozycję Nowy projekt migracji.

  13. Na stronie Nowy projekt migracji wprowadź następujące szczegóły, a następnie wybierz pozycję Utwórz i uruchom działanie.

    Właściwości Wartość
    Nazwa projektu adventureworks_migration_project
    Typ serwera źródłowego PostgreSQL
    Docelowa baza danych postgreSQL Azure Database for PostgreSQL
    Wybierz typ działania Migracja danych online
  14. Po uruchomieniu Kreatora migracji na stronie Wybierz źródło wprowadź następujące szczegóły, a następnie wybierz pozycję Dalej: Wybierz element docelowy>>.

    Właściwości Wartość
    Nazwa serwera źródłowego nn.nn.nn.nn (adres IP maszyny wirtualnej platformy Azure z uruchomionym programem PostgreSQL)
    Port serwera 5432
    Baza danych Adventureworks
    Nazwa użytkownika azureuser
    Password Pa55w.rd
    Certyfikat serwera zaufania Wybrane
    Szyfruj połączenie Wybrane
  15. Na stronie Wybierz element docelowy wprowadź następujące szczegóły, a następnie wybierz pozycję Dalej: Wybierz bazy danych>>.

    Właściwości Wartość
    Azure PostgreSQL adventureworks[nnn]
    Baza danych azureadventureworks
    Nazwa użytkownika azureuser@adventureworks[nnn]
    Password Pa55w.rd
  16. na stronie Wybieranie baz danych wybierz bazę danych adventureworks i zamapuj ją na azureadventureworks. Usuń zaznaczenie bazy danych postgres . Wybierz pozycję Dalej: wybierz tabele>>.

  17. Na stronie Wybieranie tabel wybierz pozycję Dalej: Skonfiguruj ustawienia>> migracji.

  18. Na stronie Konfigurowanie ustawień migracji rozwiń listę rozwijaną Adventureworks, rozwiń listę rozwijaną Zaawansowane ustawienia migracji online, sprawdź, czy maksymalna liczba wystąpień do załadowania równoległego wynosi 5, a następnie wybierz pozycję Dalej: Podsumowanie>>.

  19. Na stronie Podsumowanie w polu Nazwa działania wpisz AdventureWorks_Migration_Activity, a następnie wybierz pozycję Rozpocznij migrację.

  20. Na stronie AdventureWorks_Migration_Activity wybierz pozycję Odśwież w 15-sekundowych odstępach czasu. Stan operacji migracji będzie widoczny podczas jej postępu. Poczekaj, aż kolumna SZCZEGÓŁY MIGRACJI zmieni się na Gotowe do przejścia jednorazowego.

  21. Wróć do usługi Cloud Shell.

  22. Uruchom następujące polecenie, aby ponownie utworzyć klucze obce w bazie danych azureadventureworks . Wcześniej wygenerowano skrypt addkeys.sql :

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

    Podczas dodawania kluczy obcych zostanie wyświetlona seria instrukcji ALTER TABLE . Może zostać wyświetlony błąd dotyczący tabeli SpecialOfferProduct , którą na razie można zignorować. Jest to spowodowane ograniczeniem UNIKATOWYm, które nie jest poprawnie przenoszone. W świecie rzeczywistym należy pobrać szczegóły tego ograniczenia ze źródłowej bazy danych przy użyciu następującego zapytania:

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

    Następnie można ręcznie przywrócić to ograniczenie w docelowej bazie danych w usłudze Azure Database for PostgreSQL.

    Nie powinno istnieć żadne inne błędy.

Modyfikowanie danych i wycinanie do nowej bazy danych

  1. Wróć do strony AdventureWorks_Migration_Activity w witrynie Azure Portal.

  2. Wybierz bazę danych adventureworks.

  3. Na stronie adventureworks sprawdź, czy wartość Ukończono pełne ładowanie wynosi 66 i czy wszystkie inne wartości to 0.

  4. Wróć do usługi Cloud Shell.

  5. Uruchom następujące polecenie, aby nawiązać połączenie z bazą danych adventureworks uruchomioną przy użyciu bazy danych PostgreSQL na maszynie wirtualnej:

    psql adventureworks
    
  6. Wykonaj następujące instrukcje SQL, aby wyświetlić, a następnie usuń zamówienia 43659, 43660 i 43661 z bazy danych. Pamiętaj, że baza danych implementuje kaskadowe usuwanie w tabeli salesorderheader , która automatycznie usuwa odpowiednie wiersze z tabeli salesorderdetail .

    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. Zamknij narzędzie psql za pomocą polecenia \q.

  8. Wróć do strony adventureworks w witrynie Azure Portal i wybierz pozycję Odśwież. Sprawdź, czy zastosowano 32 zmiany.

  9. Wybierz pozycję Rozpocznij migrację jednorazową.

  10. Na stronie Zakończ migrację jednorazową wybierz pozycję Potwierdź, a następnie wybierz pozycję Zastosuj. Poczekaj, aż stan zmieni się na Ukończono.

  11. Wróć do usługi Cloud Shell.

  12. Uruchom następujące polecenie, aby nawiązać połączenie z bazą danych azureadventureworks uruchomioną przy użyciu usługi Azure Database for PostgreSQL:

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

    Hasło to Pa55w.rd.

  13. Wykonaj następujące instrukcje SQL, aby wyświetlić zamówienia i szczegóły zamówienia w bazie danych. Zamknij po pierwszej stronie każdej tabeli. Celem tych zapytań jest pokazanie, że dane zostały przesłane:

    SELECT * FROM sales.salesorderheader;
    SELECT * FROM sales.salesorderdetail;
    
  14. Uruchom następujące instrukcje SQL, aby wyświetlić zamówienia i szczegóły zamówień 43659, 43660 i 43661.

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

    Oba zapytania powinny zwracać 0 wierszy.

  15. Zamknij narzędzie psql za pomocą polecenia \q.

Czyszczenie utworzonych zasobów

Ważne

Jeśli wykonano te kroki we własnej subskrypcji osobistej, możesz usunąć zasoby pojedynczo lub usunąć grupę zasobów, aby usunąć cały zestaw zasobów. Uruchomione zasoby mogą generować koszty.

  1. Za pomocą usługi Cloud Shell uruchom następujące polecenie, aby usunąć grupę zasobów:
az group delete --name migrate-postgresql