Kurz: migrace PostgreSQL do Azure DB pro PostgreSQL online pomocí DMS přes Azure CLI
Pomocí Azure Database Migration Service můžete migrovat databáze z místní instance PostgreSQL a Azure Database for PostgreSQL s minimálními výpadky. Jinými slovy, migraci je možné dosáhnout s minimálními výpadky aplikace. V tomto kurzu migrujete ukázkovou databázi pro pronájem DVD z místní instance PostgreSQL 9,6 na Azure Database for PostgreSQL pomocí online aktivity migrace v Azure Database Migration Service.
V tomto kurzu se naučíte:
- Pomocí nástroje pg_dump proveďte migraci ukázkového schématu.
- Vytvoření instance služby Azure Database Migration Service
- Vytvoření projektu migrace pomocí služby Azure Database Migration Service
- Spuštění migrace
- Monitorujte migraci.
Poznámka
Použití Azure Database Migration Service k provedení online migrace vyžaduje vytvoření instance založené na cenové úrovni Premium. Šifrováním disku zabráníte krádeži dat během migrace.
Důležité
Pro optimální prostředí migrace doporučuje Microsoft vytvořit instanci Azure Database Migration Service ve stejné oblasti Azure jako cílová databáze. Přenášení dat mezi oblastmi geografickými lokalitami může zpomalit proces migrace a způsobit chyby.
Požadavky
Pro absolvování tohoto kurzu je potřeba provést následující:
Stáhněte a nainstalujte si PostgreSQL community edition 9,5, 9,6 nebo 10. Verze zdrojového PostgreSQL serveru musí být 9.5.11, 9.6.7, 10 nebo novější. Další informace najdete v článku podporované verze databáze PostgreSQL.
Všimněte si také, že cílová verze Azure Database for PostgreSQL musí být stejná nebo vyšší než verze místní PostgreSQL. Například PostgreSQL 9,6 lze migrovat pouze do Azure Database for PostgreSQL 9,6, 10 nebo 11, ale ne do Azure Database for PostgreSQL 9,5.
Vytvořte instanci v Azure Database for PostgreSQL nebo vytvořte server Azure Database for PostgreSQL-Citus (pro škálovánína více instancí).
Vytvořte Microsoft Azure Virtual Network pro Azure Database Migration Service pomocí modelu nasazení Azure Resource Manager, který umožňuje připojení typu Site-to-site k místním zdrojovým serverům pomocí ExpressRoute nebo VPN. Další informace o vytváření virtuálních sítí najdete v dokumentaci k Virtual Networka zejména v článcích rychlý Start s podrobnými údaji.
Poznámka
Pokud při instalaci virtuální sítě používáte ExpressRoute s partnerským vztahem k síti Microsoftu, přidejte do podsítě, ve které se služba zřídí, tyto koncové body služby:
- Koncový bod cílové databáze (například koncový bod SQL, Cosmos DB koncový bod atd.)
- Koncový bod úložiště
- Koncový bod služby Service Bus
Tato konfigurace je nezbytná, protože Azure Database Migration Service nemá připojení k Internetu.
Zajistěte, aby pravidla skupiny zabezpečení sítě (NSG) neblokovala odchozí port 443 ServiceTag pro ServiceBus, úložiště a AzureMonitor. Další podrobnosti o filtrování provozu NSG virtuální sítě najdete v článku filtrování provozu sítě pomocí skupin zabezpečení sítě.
Nakonfigurujte bránu Windows Firewall pro přístup k databázovému stroji.
Otevřete bránu Windows Firewall, abyste povolili Azure Database Migration Service přístup ke zdrojovému serveru PostgreSQL, který je ve výchozím nastavení port TCP 5432.
Pokud před zdrojovými databázemi používáte zařízení brány firewall, možná bude potřeba přidat pravidla brány firewall, která službě Azure Database Migration Service povolí přístup ke zdrojovým databázím za účelem migrace.
Vytvořte pravidlo brány firewall na úrovni serveru pro Azure Database for PostgreSQL, které povolí Azure Database Migration Service přístup k cílovým databázím. Zadejte rozsah podsítě virtuální sítě, která se používá pro Azure Database Migration Service.
Existují dvě metody pro vyvolání rozhraní příkazového řádku:
V pravém horním rohu Azure Portal vyberte tlačítko Cloud Shell:

Nainstalujte a spusťte místně rozhraní příkazového řádku. Pro správu prostředků Azure potřebných pro tuto migraci se vyžaduje CLI 2,18 nebo novější verze nástroje příkazového řádku.
Pokud chcete stáhnout CLI, postupujte podle pokynů v článku Instalace rozhraní příkazového řádku Azure CLI. Tento článek obsahuje taky platformy, které podporují Azure CLI.
Pokud chcete nastavit subsystém Windows pro Linux (WSL), postupujte podle pokynů Průvodce instalací systému Windows 10.
Povolte logickou replikaci na zdrojovém serveru úpravou souboru postgresql.config a nastavením následujících parametrů:
- wal_level = logical
- max_replication_slots = [počet slotů], doporučuje se nastavit na pět slotů
- max_wal_senders = [počet souběžných úloh] - parametr max_wal_senders nastaví počet souběžných úloh, které můžete spustit, doporučujeme nastavení na 10 úloh
Migrace ukázkového schématu
K dokončení všech databázových objektů, jako jsou schémata tabulek, indexy a uložené procedury, potřebujeme extrahovat schéma ze zdrojové databáze a použít ho na databázi.
Pomocí příkazu pg_dump -s můžete vytvořit soubor schématu s výpisem paměti pro databázi.
pg_dump -o -h hostname -U db_username -d db_name -s > your_schema.sqlChcete-li například vypsat schéma souboru databáze dvdrental:
pg_dump -o -h localhost -U postgres -d dvdrental -s > dvdrentalSchema.sqlDalší informace o používání nástroje pg_dump, viz příklady v kurzu pg-dump.
Vytvořte prázdnou databázi v cílovém prostředí, což je Azure Database for PostgreSQL.
Podrobnosti o tom, jak připojit a vytvořit databázi, najdete v článku vytvoření serveru Azure Database for PostgreSQL v Azure Portal nebo vytvoření serveru Azure Database for PostgreSQLového škálování (Citus) v Azure Portal.
Importujte schéma do cílové databáze, kterou jste vytvořili pomocí obnovení souboru se schématem výpisu paměti.
psql -h hostname -U db_username -d db_name < your_schema.sqlPříklad:
psql -h mypgserver-20170401.postgres.database.azure.com -U postgres -d dvdrental < dvdrentalSchema.sql
Poznámka
Služba migrace interně zpracovává povolení a zakázání cizích klíčů a triggerů, aby se zajistila spolehlivá a robustní migrace dat. V důsledku toho se nemusíte starat o provádění jakýchkoli úprav schématu cílové databáze.
Zřizování instance DMS pomocí Azure CLI
Nainstalujte rozšíření synchronizace dms:
K Azure se přihlásíte spuštěním následujícího příkazu:
az loginPo zobrazení výzvy otevřete webový prohlížeč a zadejte kód pro ověření vašeho zařízení. Postupujte podle uvedených pokynů.
Online migrace PostgreSQL je teď dostupná v rámci běžného balíčku CLI (verze 2.18.0 a vyšší) bez nutnosti
dms-previewrozšíření. Pokud jste rozšíření nainstalovali v minulosti, můžete ho odebrat pomocí následujících kroků:Pokud chcete zjistit, jestli
dms-previewuž máte nainstalovanou příponu, spusťte následující příkaz:az extension list -o tablePokud
dms-previewje rozšíření nainstalované a pak ho odinstalujte, spusťte následující příkaz:az extension remove --name dms-previewPokud chcete ověřit, že jste správně odinstalovali
dms-previewpříponu, spusťte následující příkaz a v seznamu by se neměla zobrazit tatodms-previewpřípona:az extension list -o table
Důležité
dms-previewpro jiné cesty migrace podporované službou Azure DMS může být rozšíření stále potřeba. Pokud chcete zjistit, jestli je rozšíření potřeba, Projděte si dokumentaci ke konkrétní cestě migrace. Tato dokumentace se zabývá požadavkem rozšíření, které je specifické pro PostgreSQL, pro Azure Database for PostgreSQL online.Kdykoli spuštěním zobrazíte všechny příkazy podporované v DMS:
az dms -hPokud máte několik předplatných Azure, spuštěním následujícího příkazu nastavíte předplatné, které chcete použít k zřízení instance služby DMS.
az account set -s 97181df2-909d-420b-ab93-1bff15acb6b7
Zřízení instance DMS spuštěním následujícího příkazu:
az dms create -l <location> -n <newServiceName> -g <yourResourceGroupName> --sku-name Premium_4vCores --subnet/subscriptions/{vnet subscription id}/resourceGroups/{vnet resource group}/providers/Microsoft.Network/virtualNetworks/{vnet name}/subnets/{subnet name} –tags tagName1=tagValue1 tagWithNoValueNapříklad následující příkaz vytvoří službu v:
- Umístění: USA – východ 2
- Předplatné: 97181df2-909d-420b-ab93-1bff15acb6b7
- Název skupina prostředků: PostgresDemo
- Název služby DMS: PostgresCLI
az dms create -l eastus2 -g PostgresDemo -n PostgresCLI --subnet /subscriptions/97181df2-909d-420b-ab93-1bff15acb6b7/resourceGroups/ERNetwork/providers/Microsoft.Network/virtualNetworks/AzureDMS-CORP-USC-VNET-5044/subnets/Subnet-1 --sku-name Premium_4vCoresVytvoření instance služby DMS trvá asi 10 až 12 minut.
Pokud chcete zjistit IP adresu DMS agenta tak, že ho přidáte do souboru Postgres pg_hba.conf, spusťte následující příkaz:
az network nic list -g <ResourceGroupName>--query '[].ipConfigurations | [].privateIpAddress'Příklad:
az network nic list -g PostgresDemo --query '[].ipConfigurations | [].privateIpAddress'Zobrazený výsledek by měl vypadat přibližně jako tato adresa:
[ "172.16.136.18" ]Přidejte IP adresu agenta DMS do souboru Postgres pg_hba.conf.
Po dokončení zřízení v DMS si poznamenejte IP adresu DMS.
Přidejte ke zdroji IP adresu do souboru pg_hba.conf podobně jako následující položky:
host all all 172.16.136.18/10 md5 host replication postgres 172.16.136.18/10 md5
Dále spuštěním následujícího příkazu vytvořte projekt migrace PostgreSQL:
az dms project create -l <location> -g <ResourceGroupName> --service-name <yourServiceName> --source-platform PostgreSQL --target-platform AzureDbforPostgreSQL -n <newProjectName>Například následující příkaz vytvoří projekt s použitím těchto parametrů:
- Umístění: USA – středozápad
- Název skupina prostředků: PostgresDemo
- Název služby: PostgresCLI
- Název projektu: PGMigration
- Zdrojová platforma: PostgreSQL
- Cílová platforma: AzureDbForPostgreSql
az dms project create -l westcentralus -n PGMigration -g PostgresDemo --service-name PostgresCLI --source-platform PostgreSQL --target-platform AzureDbForPostgreSqlVytvoření úlohy migrace PostgreSQL pomocí následujících kroků.
Tento krok zahrnuje použití zdrojové IP adresy, ID uživatele a hesla, cílové IP adresy, ID uživatele, hesla a typ úlohy k navázání možnosti připojení.
Pokud chcete zobrazit úplný seznam možností, spusťte příkaz:
az dms project task create -hJak u zdroje, tak u cíle připojení vstupní parametr odkazuje na soubor json, který má seznam objektů.
Formát objektu připojení JSON pro připojení 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 }K dispozici je také soubor JSON s možnostmi databáze, který obsahuje seznam objektů JSON. Pro PostgreSQL formát objektu JSON možností databáze je zobrazen níže:
[ { "name": "source database", "target_database_name": "target database", "selectedTables": [ "schemaName1.tableName1", ...n ] }, ...n ]Pokud chcete vytvořit json zdrojového připojení, otevřete Poznámkový blok, zkopírujte následující json a vložte ho do souboru . Po úpravě souboru podle C:\DMS\source.jsuložte soubor do souboru .
{ "userName": "postgres", "password": null, "serverName": "13.51.14.222", "databaseName": "dvdrental", "port": 5432 }Pokud chcete vytvořit json cílového připojení, otevřete Poznámkový blok, zkopírujte následující json a vložte ho do souboru . Po úpravě souboru podle C:\DMS\target.jsuložte soubor do složky .
{ "userName": " dms@builddemotarget", "password": null, "serverName": " builddemotarget.postgres.database.azure.com", "databaseName": "inventory", "port": 5432 }Vytvořte soubor JSON s možnostmi databáze se seznamem inventáře a mapování databází, které se mají migrovat:
Vytvořte seznam tabulek, které se mají migrovat, nebo můžete seznam ze zdrojové databáze vygenerovat pomocí dotazu SQL. Ukázkový dotaz pro vygenerování seznamu tabulek je uveden níže stejně jako příklad. Pokud používáte tento dotaz, nezapomeňte odebrat poslední čárku na konci názvu poslední tabulky, aby byla platným polem JSON.
SELECT FORMAT('%s,', REPLACE(FORMAT('%I.%I', schemaname, tablename), '"', '\"')) AS SelectedTables FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema');Vytvořte soubor JSON s možnostmi databáze s jednou položku pro každou databázi s názvy zdrojové a cílové databáze a seznamem vybraných tabulek, které se mají migrovat. Pomocí výstupu výše uvedeného dotazu SQL můžete naplnit pole selectedTables. Upozorňujeme, že pokud je seznam vybraných tabulek prázdný, bude služba obsahovat všechny tabulky pro migraci, které mají odpovídající názvy schémat a tabulek.
[ { "name": "dvdrental", "target_database_name": "dvdrental", "selectedTables": [ "schemaName1.tableName1", "schemaName1.tableName2", ... "schemaNameN.tableNameM" ] }, ... n ]
Spusťte následující příkaz, který převezme zdrojové připojení, cílové připojení a soubory JSON s možnostmi databáze.
az dms project task create -g PostgresDemo --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
V tomto okamžiku jste úspěšně odeslali úlohu migrace.
Chcete-li zobrazit průběh úlohy, spusťte následující příkaz:
Zkrácené zobrazení obecného stavu úlohy
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtaskZobrazení podrobného stavu úlohy včetně informací o průběhu migrace
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand outputPomocí formátu dotazu JMESPATH můžete také extrahovat pouze vlastnost migrationState z výstupu rozbalení:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand output --query 'properties.output[].migrationState'Ve výstupu je několik parametrů, které indikují průběh různých kroků migrace. Podívejte se například na následující výstup:
{ "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 }
Úloha přímé migrace
Databáze je připravená k přímé migraci po úplném načtení. V závislosti na tom, jak vytížený je zdrojový server s novými příchozími transakcemi, může být úloha DMS stále provedena po dokončení úplného načtení.
Aby byla všechna data zachycena, ověřte počet řádků mezi zdrojovými a cílovými databázemi. Můžete například ověřit následující podrobnosti z výstupu stavu:
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
Pomocí následujícího příkazu proveďte úlohu přímé migrace databáze:
az dms project task cutover -hNapříklad následující příkaz zahájí převzetí služeb při použití databáze Inventory:
az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --object-name InventoryChcete-li sledovat průběh přímé migrace, spusťte následující příkaz:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtaskKdyž se ve stavu migrace databáze zobrazí Dokončeno, znovu vytvořte sekvence (pokud je to možné) a připojte své aplikace k nové cílové instanci Azure Database for PostgreSQL.
Služba projekt, úloha vyčištění
Pokud potřebujete zrušit nebo odstranit všechny úlohy, projekt nebo služby DMS, proveďte zrušení v následujícím pořadí:
- Zrušte jakoukoli běžící úlohu.
- Odstraňte úlohu.
- Odstraňte projekt.
- Odstraňte službu DMS.
Chcete-li zrušit běžící úlohu, použijte následující příkaz:
az dms project task cancel --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtaskChcete-li odstranit běžící úlohu, použijte následující příkaz:
az dms project task delete --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtaskChcete-li zrušit běžící projekt, použijte následující příkaz:
az dms project task cancel -n runnowtask --project-name PGMigration -g PostgresDemo --service-name PostgresCLIChcete-li odstranit běžící projekt, použijte následující příkaz:
az dms project task delete -n runnowtask --project-name PGMigration -g PostgresDemo --service-name PostgresCLIChcete-li odstranit službu DMS, použijte následující příkaz:
az dms delete -g ProgresDemo -n PostgresCLI
Další kroky
- Informace o známých problémech a omezeních při provádění online migrací do služby Azure Database for PostgreSQL najdete v článku Známé problémy s online migracemi do služby Azure Database for PostgreSQLa jejich řešení.
- Informace o službě Azure Database Migration Service najdete v článku Co je Azure Database Migration Service?.
- Informace o Azure Database for PostgreSQL najdete v článku Co je Azure Database for PostgreSQL?.