Kurz: Online migrace PostgreSQL do služby Azure Database for PostgreSQL pomocí DMS (classic) přes Azure CLI

Službu Azure Database Migration Service můžete použít k migraci databází z místní instance PostgreSQL do služby 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 provedete migraci ukázkové databáze DVD Rental z místní instance PostgreSQL 9.6 do Služby Azure Database for PostgreSQL pomocí aktivity online migrace ve službě Azure Database Migration Service.

V tomto kurzu se naučíte:

  • Migrujte ukázkové schéma pomocí nástroje pg_dump.
  • 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í služby Azure Database Migration Service k provedení online migrace vyžaduje vytvoření instance na základě cenové úrovně Premium. Disk zašifrujeme, abychom zabránili krádeži dat během procesu migrace.

Důležité

Pro optimální prostředí migrace microsoft doporučuje vytvořit instanci služby Azure Database Migration Service ve stejné oblasti Azure jako cílovou databázi. 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 komunitní edici PostgreSQL 9.4, 9.5, 9.6 nebo 10. Zdrojová verze Serveru PostgreSQL musí být 9.4, 9.5, 9.6, 10, 11, 12 nebo 13. Další informace najdete v tématu Podporované verze databází PostgreSQL.

    Všimněte si také, že cílová verze Azure Database for PostgreSQL musí být stejná nebo novější než místní verze PostgreSQL. Například PostgreSQL 9.6 se dá migrovat jenom na Azure Database for PostgreSQL 9.6, 10 nebo 11, ale ne na Azure Database for PostgreSQL 9.5.

  • Vytvořte instanci ve službě Azure Database for PostgreSQL nebo vytvořte server Azure Database for PostgreSQL – Hyperscale (Citus).

  • Vytvořte pro službu Azure Database Migration Service síť Microsoft Azure Virtual Network s použitím modelu nasazení Azure Resource Manager, který poskytuje možnosti připojení typu Site-to-Site k místním zdrojovým serverům prostřednictvím ExpressRoute nebo sítě VPN. Další informace o vytváření virtuální sítě najdete v dokumentaci k virtuální síti a zejména v článcích rychlého startu s podrobnými podrobnostmi.

    Poznámka:

    Pokud během instalace virtuální sítě použijete ExpressRoute s partnerským vztahem sítě k Microsoftu, přidejte do podsítě, ve které bude služba zřízena, následující koncové body služby:

    • Cílový koncový bod databáze (například koncový bod SQL, koncový bod služby Azure Cosmos DB 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.

  • Ujistěte se, že pravidla skupiny zabezpečení sítě virtuální sítě (NSG) neblokují odchozí port 443 ServiceTag pro ServiceBus, Storage a AzureMonitor. Další podrobnosti o filtrování provozu pomocí skupin zabezpečení virtuální sítě najdete v článku Filtrování provozu sítě s použitím skupin zabezpečení sítě.

  • Nakonfigurujte bránu Windows Firewall pro přístup k databázovému stroji.

  • Otevřete bránu Windows Firewall a povolte službě Azure Database Migration Service přístup ke zdrojovému serveru PostgreSQL, který ve výchozím nastavení probíhá přes 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 pro službu Azure Database for PostgreSQL pravidlo brány firewall na úrovni serveru, které službě Azure Database Migration Service povolí přístup k cílovým databázím. Zadejte rozsah podsítí virtuální sítě použité pro službu Azure Database Migration Service.

  • Existují dvě metody pro vyvolání rozhraní příkazového řádku:

    • V pravém horním rohu webu Azure Portal vyberte tlačítko Cloud Shell:

      Tlačítko Cloud Shell na webu Azure Portal

    • Nainstalujte a spusťte místně rozhraní příkazového řádku. K správě 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 rozhraní příkazového řádku, postupujte podle pokynů v článku Instalace Azure CLI. Tento článek také uvádí 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 na zdrojovém serveru logickou replikaci úpravou souboru postgresql.config a nastavením následujících parametrů:

    • wal_level = logical
    • max_replication_slots = [počet slotů], doporučujeme 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.

  1. 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.sql
    

    Chcete-li například vypsat schéma souboru databáze dvdrental:

    pg_dump -O -h localhost -U postgres -d dvdrental -s  > dvdrentalSchema.sql
    

    Další informace o používání nástroje pg_dump, viz příklady v kurzu pg-dump.

  2. Vytvořte prázdnou databázi v cílovém prostředí, což je Azure Database for PostgreSQL.

    Podrobnosti o připojení a vytvoření databáze najdete v článku Vytvoření serveru Azure Database for PostgreSQL na webu Azure Portal nebo vytvoření serveru Azure Database for PostgreSQL – Hyperscale (Citus) na webu Azure Portal.

  3. 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.sql 
    

    Příklad:

    psql -h mypgserver-20170401.postgres.database.azure.com  -U postgres -d dvdrental < dvdrentalSchema.sql
    

Poznámka:

Služba migrace interně zpracovává povolení/zákaz cizích klíčů a triggerů, aby zajistila spolehlivou a robustní migraci dat. V důsledku toho si nemusíte dělat starosti s prováděním jakýchkoli úprav schématu cílové databáze.

Zřízení instance DMS pomocí Azure CLI

  1. Nainstalujte rozšíření synchronizace dms:

    • K Azure se přihlásíte spuštěním následujícího příkazu:

      az login
      
    • Po 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 rozhraní příkazového řádku (verze 2.18.0 a vyšší), aniž by bylo dms-preview potřeba rozšíření. Pokud jste rozšíření nainstalovali v minulosti, můžete ho odebrat pomocí následujícího postupu:

      • Pokud chcete zkontrolovat, jestli už máte dms-preview nainstalované rozšíření, spusťte následující příkaz:

        az extension list -o table
        
      • Pokud dms-preview je rozšíření nainstalované, pak ho odinstalujte spuštěním následujícího příkazu:

        az extension remove --name dms-preview
        
      • Pokud chcete ověřit, že jste rozšíření odinstalovali dms-preview správně, spusťte následující příkaz a v seznamu byste neměli vidět dms-preview rozšíření:

        az extension list -o table
        

      Důležité

      dms-preview Rozšíření může být stále potřeba pro jiné cesty migrace podporované službou Azure DMS. Projděte si dokumentaci ke konkrétní cestě migrace a zjistěte, jestli je rozšíření potřeba. 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 -h
      
    • Pokud 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
      
  2. 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 tagWithNoValue
    

    Napří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_4vCores
    

    Vytvoření instance služby DMS trvá asi 10 až 12 minut.

  3. 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"
    ]
    
  4. 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
      
  5. 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 AzureDbForPostgreSql
    
  6. Vytvoř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 -h
      

      Jak 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žností 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 a zkopírujte následující json a vložte ho do souboru. Uložte soubor do složky C:\DMS\source.json po jeho úpravě podle zdrojového serveru.

      {
          "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 a zkopírujte následující json a vložte ho do souboru. Uložte soubor do složky C:\DMS\target.json po jeho úpravě podle cílového serveru.

      {
          "userName": " dms@builddemotarget",    
          "password": null,           
          "serverName": " builddemotarget.postgres.database.azure.com",
          "databaseName": "inventory", 
          "port": 5432                
      }
      
    • Vytvořte soubor JSON možností 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 pomocí dotazu SQL vygenerovat seznam ze zdrojové databáze. Ukázkový dotaz pro vygenerování seznamu tabulek je uveden níže jako příklad. Pokud používáte tento dotaz, nezapomeňte odebrat poslední čárku na konci názvu poslední tabulky, aby byla platná pole 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žkou pro každou databázi se zdrojovými a cílovými názvy databází 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ý, služba bude 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.

  7. Chcete-li zobrazit průběh úlohy, spusťte následující příkaz:

    • Pokud chcete zobrazit obecný stav úkolu za krátkou dobu

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
      
    • Zobrazení podrobného stavu úkolu 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 output
      
    • Formát dotazu JMESPath můžete použít také k extrahování stavu migrace pouze z rozbalení výstupu:

      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é označují 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
  1. Pomocí následujícího příkazu proveďte úlohu přímé migrace databáze:

    az dms project task cutover -h
    

    Například následující příkaz zahájí přímé spuštění databáze Inventory:

    az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask  --object-name Inventory
    
  2. Chcete-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 runnowtask
    
  3. Když se ve stavu migrace databáze zobrazí Stav dokončeno, znovu vytvořte sekvence (pokud jsou k dispozici) a připojte své aplikace k nové cílové instanci služby 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.
  1. 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 runnowtask
    
  2. Chcete-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 runnowtask
    
  3. Pokud chcete odstranit projekt, použijte následující příkaz:

    az dms project delete -n PGMigration -g PostgresDemo --service-name PostgresCLI
    
  4. Chcete-li odstranit službu DMS, použijte následující příkaz:

    az dms delete -g ProgresDemo -n PostgresCLI
    

Další kroky