Samouczek: migrowanie bazy danych PostgreSQL do usługi Azure Database for PostgreSQL w trybie online przy użyciu usługi DMS (klasycznej) za pośrednictwem interfejsu wiersza polecenia platformy Azure
Ważne
Zalecamy użycie nowej usługi migracji w usłudze Azure Database for PostgreSQL w celu uzyskania bardziej usprawnionego i wydajnego środowiska migracji. Ta usługa upraszcza proces, obsługując różne środowiska źródłowe, zapewniając bezproblemowe przejście do usługi Azure Database for PostgreSQL.
Za pomocą usługi Azure Database Migration Service (DMS) można migrować bazy danych z lokalnego wystąpienia bazy danych PostgreSQL do usługi Azure Database for PostgreSQL z minimalnym przestojem. Innymi słowy, migrację można osiągnąć z minimalnym przestojem w aplikacji. W tym samouczku przeprowadzisz migrację DVD Rental
przykładowej bazy danych z lokalnego wystąpienia bazy danych PostgreSQL 9.6 do usługi Azure Database for PostgreSQL przy użyciu działania migracji online w usłudze Azure Database Migration Service.
Z tego samouczka dowiesz się, jak wykonywać następujące czynności:
- Migrowanie przykładowego schematu przy użyciu narzędzia pg_dump.
- Tworzenie wystąpienia usługi Azure Database Migration Service.
- Tworzenie projektu migracji za pomocą usługi Azure Database Migration Service.
- Uruchamianie migracji.
- Monitoruj migrację.
Przeprowadzenie migracji online przy użyciu usługi Azure Database Migration Service wymaga utworzenia wystąpienia na podstawie warstwy cenowej Premium. Szyfrujemy dysk, aby zapobiec kradzieży danych podczas procesu migracji.
Ważne
Aby uzyskać optymalne środowisko migracji, firma Microsoft zaleca utworzenie wystąpienia usługi Azure Database Migration Service w tym samym regionie świadczenia usługi Azure co docelowa baza danych. Przenoszenie danych między regionami lub lokalizacjami geograficznymi może spowalniać proces migracji i powodować błędy.
Wymagania wstępne
Do ukończenia tego samouczka niezbędne są następujące elementy:
Pobierz i zainstaluj program PostgreSQL Community Edition 9.4, 9.5, 9.6 lub 10. Źródłowa wersja serwera PostgreSQL musi być 9.4, 9.5, 9.6, 10, 11, 12 lub 13. Aby uzyskać więcej informacji, zobacz Obsługiwane wersje bazy danych PostgreSQL.
Docelowa wersja usługi Azure Database for PostgreSQL musi być równa lokalnej wersji bazy danych PostgreSQL lub nowszej. Na przykład program PostgreSQL 9.6 może migrować tylko do usługi Azure Database for PostgreSQL 9.6, 10 lub 11, ale nie do usługi Azure Database for PostgreSQL 9.5.
Tworzenie wystąpienia w usłudze Azure Database for PostgreSQL — serwer elastyczny.
Utworzenie usługi Microsoft Azure Virtual Network dla usługi Azure Database Migration Service przy użyciu modelu wdrożenia usługi Azure Resource Manager, która zapewnia łączność między lokacjami dla lokalnych serwerów źródłowych, z użyciem usługi ExpressRoute lub sieci VPN. Aby uzyskać więcej informacji na temat tworzenia sieci wirtualnej, zobacz dokumentację sieci wirtualnej, a zwłaszcza artykuły Szybki start ze szczegółowymi informacjami krok po kroku.
Podczas konfigurowania sieci wirtualnej, jeśli używasz usługi ExpressRoute z komunikacją równorzędną sieci do firmy Microsoft, dodaj następujące punkty końcowe usługi do podsieci , w której będzie aprowizowana usługa:
- Punkt końcowy docelowej bazy danych (np. punkt końcowy usługi SQL, punkt końcowy usługi Azure Cosmos DB)
- Punkt końcowy magazynu
- Punkt końcowy magistrali usług
Taka konfiguracja jest konieczna, ponieważ usługa Azure Database Migration Service nie ma łączności z Internetem.
Upewnij się, że reguły sieciowej grupy zabezpieczeń sieci wirtualnej nie blokują portu wychodzącego 443 elementu ServiceTag dla usług ServiceBus, Storage i AzureMonitor. Aby uzyskać więcej informacji na temat filtrowania ruchu sieciowej grupy zabezpieczeń sieci wirtualnej, zapoznaj się z artykułem Filtrowanie ruchu sieciowego przy użyciu sieciowych grup zabezpieczeń.
Zapora sytemu Windows skonfigurowana pod kątem dostępu do aparatu bazy danych.
Otwórz zaporę systemu Windows, aby zezwolić usłudze Azure Database Migration Service na dostęp do źródłowego serwera PostgreSQL, który domyślnie jest portem TCP 5432.
W przypadku korzystania z urządzenia zapory przed źródłowymi bazami danych może być konieczne dodanie reguł zapory, aby umożliwić usłudze Azure Database Migration Service dostęp do źródłowych baz danych na potrzeby migracji.
Utwórz regułę zapory na poziomie serwera dla usługi Azure Database for PostgreSQL, aby umożliwić usłudze Azure Database Migration Service dostęp do docelowych baz danych. Podaj zakres podsieci sieci wirtualnej używanej dla usługi Azure Database Migration Service.
Istnieją dwie metody wywoływania interfejsu wiersza polecenia:
W prawym górnym rogu witryny Azure Portal wybierz przycisk Cloud Shell:
Lokalnie zainstaluj i uruchom interfejs wiersza polecenia. Do zarządzania zasobami platformy Azure potrzebnymi do migracji jest wymagana wersja interfejsu wiersza polecenia w wersji 2.18 lub nowszej.
Aby pobrać interfejs wiersza polecenia, postępuj zgodnie z instrukcjami w artykule Instalowanie interfejsu wiersza polecenia platformy Azure. W tym artykule wymieniono również platformy, które obsługują interfejs wiersza polecenia platformy Azure.
Aby skonfigurować podsystem Windows dla systemu Linux (WSL), postępuj zgodnie z instrukcjami w Przewodniku instalacji systemu Windows 10
Włącz replikację logiczną na serwerze źródłowym, edytując
postgresql.config
plik i ustawiając następujące parametry:wal_level
=logical
max_replication_slots
= [liczba miejsc]. Zalecane ustawienie to5
.max_wal_senders
= [liczba współbieżnych zadań]. Parametrmax_wal_senders
ustawia liczbę współbieżnych zadań, które mogą być uruchamiane. Zalecane ustawienie to10
.
Migrowanie przykładowego schematu
Aby ukończyć wszystkie obiekty bazy danych, takie jak schematy tabel, indeksy i procedury składowane, musimy wyodrębnić schemat ze źródłowej bazy danych i zastosować je do bazy danych.
Użyj polecenia -s pg_dump, aby utworzyć plik zrzutu schematu dla bazy danych.
pg_dump -O -h hostname -U db_username -d db_name -s > your_schema.sql
Na przykład aby wykonać zrzut pliku schematu bazy danych dvdrental:
pg_dump -O -h localhost -U postgres -d dvdrental -s > dvdrentalSchema.sql
Aby uzyskać więcej informacji na temat korzystania z narzędzia pg_dump, zobacz przykłady w samouczku narzędzia pg-dump.
Utwórz pustą bazę danych w środowisku docelowym, czyli azure Database for PostgreSQL — serwer elastyczny.
Zaimportuj schemat do docelowej bazy danych utworzonej przez przywrócenie pliku zrzutu schematu.
psql -h hostname -U db_username -d db_name < your_schema.sql
Na przykład:
psql -h mypgserver-20170401.postgres.database.azure.com -U postgres -d dvdrental < dvdrentalSchema.sql
Uwaga
Usługa migracji wewnętrznie obsługuje włączanie/wyłączanie kluczy obcych i wyzwalaczy w celu zapewnienia niezawodnej i niezawodnej migracji danych. W związku z tym nie musisz martwić się o wprowadzanie żadnych modyfikacji docelowego schematu bazy danych.
Aprowizuj wystąpienie usługi DMS przy użyciu interfejsu wiersza polecenia platformy Azure
Zainstaluj rozszerzenie synchronizacji usługi DMS:
Uruchom następujące polecenia, aby zalogować się na platformie Azure:
az login
Po wyświetleniu monitu otwórz przeglądarkę internetową i wprowadź kod w celu uwierzytelnienia swojego urządzenia. Wykonaj wyświetlone instrukcje.
Migracja online bazy danych PostgreSQL jest teraz dostępna w ramach zwykłego pakietu interfejsu wiersza polecenia (wersja 2.18.0 lub nowsza) bez konieczności używania
dms-preview
rozszerzenia. Jeśli rozszerzenie zainstalowano w przeszłości, możesz go usunąć, wykonując następujące czynności:Aby sprawdzić, czy masz
dms-preview
już zainstalowane rozszerzenie, uruchom następujące polecenie:az extension list -o table
Jeśli
dms-preview
rozszerzenie jest zainstalowane, uruchom następujące polecenie, aby go odinstalować:az extension remove --name dms-preview
Aby sprawdzić, czy rozszerzenie odinstalowane jest
dms-preview
poprawnie, uruchom następujące polecenie i nie powinno być widocznedms-preview
rozszerzenie na liście:az extension list -o table
Ważne
dms-preview
Rozszerzenie może być nadal potrzebne w przypadku innych ścieżek migracji obsługiwanych przez usługę Azure DMS. Zapoznaj się z dokumentacją określonej ścieżki migracji, aby określić, czy rozszerzenie jest potrzebne. Ta dokumentacja obejmuje wymaganie rozszerzenia specyficzne dla bazy danych PostgreSQL do usługi Azure Database for PostgreSQL w trybie online.W dowolnym momencie wyświetl wszystkie polecenia obsługiwane w usłudze DMS, uruchamiając polecenie:
az dms -h
Jeśli masz wiele subskrypcji platformy Azure, uruchom poniższe polecenie, aby ustawić subskrypcję, której chcesz użyć do aprowizacji wystąpienia usługi DMS.
az account set -s <SubscriptionID>
Rozpocznij aprowizację wystąpienia usługi DMS, uruchamiając następujące polecenie:
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
Na przykład następujące polecenie tworzy usługę. Zastąp wartości
<SubscriptionID>
,<ResourceGroupName>
i<VirtualNetwork>
prawidłowymi wartościami.- Lokalizacja: Wschodnie stany USA 2
- Subskrypcja:
<SubscriptionID>
- Nazwa grupy zasobów:
<ResourceGroupName>
- Nazwa usługi DMS:
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
Utworzenie wystąpienia usługi DMS trwa około 10 minut.
Aby zidentyfikować adres IP agenta USŁUGI DMS, aby można było dodać go do pliku Postgres
pg_hba.conf
, uruchom następujące polecenie:az network nic list -g <ResourceGroupName> --query '[].ipConfigurations | [].privateIpAddress'
Na przykład:
az network nic list -g <resource-group> --query '[].ipConfigurations | [].privateIpAddress'
Powinien zostać uzyskany wynik podobny do następującego adresu:
[ "172.16.136.18" ]
Dodaj adres IP agenta DMS do pliku Postgres
pg_hba.conf
.Zwróć uwagę na adres IP usługi DMS po zakończeniu aprowizowania usługi DMS.
Dodaj adres IP do
pg_hba.conf
pliku w źródle, podobnie jak w następującym wpisie:host all all 172.16.136.18/10 md5 host replication postgres 172.16.136.18/10 md5
Następnie utwórz projekt migracji PostgreSQL, uruchamiając następujące polecenie:
az dms project create -l <location> -g <ResourceGroupName> --service-name <yourServiceName> --source-platform PostgreSQL --target-platform AzureDbforPostgreSQL -n <newProjectName>
Na przykład następujące polecenie tworzy projekt przy użyciu tych parametrów:
- Lokalizacja: Zachodnio-środkowe stany USA
- Nazwa grupy zasobów:
<ResourceGroupName>
- Nazwa usługi: PostgresCLI
- Nazwa projektu: PGMigration
- Platforma źródłowa: PostgreSQL
- Platforma docelowa: AzureDbForPostgreSql
az dms project create -l westcentralus -n PGMigration -g <ResourceGroupName> --service-name PostgresCLI --source-platform PostgreSQL --target-platform AzureDbForPostgreSql
Utwórz zadanie migracji PostgreSQL, wykonując następujące kroki.
Ten krok obejmuje wykorzystanie źródłowego adresu IP, identyfikatora użytkownika i hasła, docelowego adresu IP, identyfikatora użytkownika, hasła i typu zadania do ustanowienia połączenia.
Aby wyświetlić pełną listę opcji, uruchom polecenie:
az dms project task create -h
Zarówno dla połączenia elementu źródłowego, jak i docelowego parametr wejściowy odwołuje się do pliku json, który ma listę obiektów.
Format obiektu JSON połączenia dla połączeń PostgreSQL.
{ // 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 }
Istnieje również plik json opcji bazy danych, który zawiera listę obiektów json. W przypadku bazy danych PostgreSQL format obiektu JSON opcji bazy danych jest wyświetlany w następujący sposób:
[ { "name": "source database", "target_database_name": "target database", "selectedTables": [ "schemaName1.tableName1", ...n ] }, ...n ]
Aby utworzyć kod json połączenia źródłowego, otwórz Notatnik i skopiuj następujący kod json i wklej go do pliku. Zapisz plik w folderze C:\DMS\source.json po zmodyfikowaniu go zgodnie z serwerem źródłowym.
{ "userName": "postgres", "password": null, "serverName": "13.51.14.222", "databaseName": "dvdrental", "port": 5432 }
Aby utworzyć kod json połączenia docelowego, otwórz Notatnik i skopiuj następujący kod json i wklej go do pliku. Zapisz plik w folderze C:\DMS\target.json po zmodyfikowaniu go zgodnie z serwerem docelowym.
{ "userName": " dms@builddemotarget", "password": null, "serverName": " builddemotarget.postgres.database.azure.com", "databaseName": "inventory", "port": 5432 }
Utwórz plik json opcji bazy danych zawierający listę spisu i mapowania baz danych do migracji:
Utwórz listę tabel do zmigrowania lub możesz użyć zapytania SQL do wygenerowania listy ze źródłowej bazy danych. Oto przykładowe zapytanie w celu wygenerowania listy tabel. Jeśli używasz tego zapytania, pamiętaj, aby usunąć ostatni przecinek na końcu nazwy tabeli, aby uczynić ją prawidłową tablicą JSON.
SELECT FORMAT('%s,', REPLACE(FORMAT('%I.%I', schemaname, tablename), '"', '\"')) AS SelectedTables FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
Utwórz plik JSON opcji bazy danych z jednym wpisem dla każdej bazy danych z nazwami źródłowej i docelowej bazy danych oraz listą wybranych tabel do zmigrowania. Możesz użyć danych wyjściowych poprzedniego zapytania SQL, aby wypełnić tablicę
selectedTables
.Uwaga
Jeśli lista wybranych tabel jest pusta, usługa będzie zawierać wszystkie tabele migracji, które mają pasujące nazwy schematów i tabel.
[ { "name": "dvdrental", "target_database_name": "dvdrental", "selectedTables": [ "schemaName1.tableName1", "schemaName1.tableName2", ... "schemaNameN.tableNameM" ] }, ... n ]
Uruchom następujące polecenie, które przyjmuje połączenie źródłowe, połączenie docelowe i pliki json opcji bazy danych.
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
Na tym etapie pomyślnie przesłano zadanie migracji.
Aby wyświetlić postęp zadania, uruchom następujące polecenia.
Aby wyświetlić ogólny stan zadania w skrócie:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
Aby wyświetlić szczegółowy stan zadania, w tym informacje o postępie migracji:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask --expand output
Możesz również użyć formatu zapytania JMESPath , aby wyodrębnić
migrationState
dane tylko z rozwiniętych danych wyjściowych:az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask --expand output --query 'properties.output[].migrationState'
W danych wyjściowych istnieje kilka parametrów, które wskazują postęp różnych kroków migracji. Zobacz na przykład następujące dane wyjściowe:
{ "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 }
Zadanie migracji uruchomienia produkcyjnego
Baza danych jest gotowa do uruchomienia produkcyjnego, gdy pełne ładowanie zostało zakończone. W zależności od zajętości serwera źródłowego nowymi przychodzącymi transakcjami zadanie usługi DMS może nadal stosować zmiany po zakończeniu pełnego ładowania.
Aby upewnić się, że wszystkie dane zostały przechwycone, przeprowadź weryfikację liczby wierszy między źródłową i docelową bazą danych. Na przykład możesz zweryfikować następujące szczegóły z danych wyjściowych stanu:
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
Wykonaj zadanie migracji bazy danych uruchomienia produkcyjnego, używając następującego polecenia:
az dms project task cutover -h
Na przykład następujące polecenie inicjuje przecięcie dla bazy danych "Inventory":
az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask --object-name Inventory
Aby monitorować postęp uruchomienia produkcyjnego, uruchom następujące polecenie:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
Gdy stan migracji bazy danych to Ukończono, utwórz ponownie sekwencje (jeśli dotyczy) i połącz aplikacje z nowym docelowym wystąpieniem usługi Azure Database for PostgreSQL.
Usługa, projekt, oczyszczanie zadania
Jeśli potrzebujesz anulować lub usunąć jakiekolwiek zadanie usługi DMS, projekt lub usługę, przeprowadź anulowanie w następującej kolejności:
- Anuluj wszelkie uruchomione zadania
- Usuń zadanie
- Usuń projekt
- Usuń usługę DMS
Aby anulować bieżące zadanie, użyj następującego polecenia:
az dms project task cancel --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
Aby usunąć bieżące zadanie, użyj następującego polecenia:
az dms project task delete --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
Aby usunąć projekt, użyj następującego polecenia:
az dms project delete -n PGMigration -g <ResourceGroupName> --service-name PostgresCLI
Aby usunąć usługę DMS, użyj następującego polecenia:
az dms delete -g <ResourceGroupName> -n PostgresCLI