Sdílet prostřednictvím


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

Důležité

Doporučujeme používat novou službu migrace ve službě Azure Database for PostgreSQL pro efektivnější a efektivnější migraci. Tato služba zjednodušuje proces tím, že podporuje celou řadu zdrojových prostředí a zajišťuje bezproblémový přechod na Azure Database for PostgreSQL.

Pomocí služby Azure Database Migration Service (DMS) můžete migrovat databáze 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 DVD Rental ukázkové databáze 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.

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.

    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 na flexibilním serveru Azure Database for PostgreSQL.

  • 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.

    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, což je ve výchozím nastavení port TCP 5432.

  • Při použití zařízení brány firewall před zdrojovými databázemi možná budete muset přidat pravidla brány firewall, která službě Azure Database Migration Service umožní přístup ke zdrojovým databázím pro migraci.

  • 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:

      Snímek obrazovky s tlačítkem 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 logickou replikaci na zdrojovém serveru úpravou postgresql.config souboru a nastavením následujících parametrů:

    • wal_level = logical

    • max_replication_slots = [počet slotů]. Doporučené nastavení je 5.

    • max_wal_senders = [počet souběžných úkolů]. Parametr max_wal_senders nastaví počet souběžných úloh, které lze spustit. Doporučené nastavení je 10.

Migrace ukázkového schématu

Abychom mohli dokončit všechny databázové objekty, jako jsou schémata tabulek, indexy a uložené procedury, musíme extrahovat schéma ze zdrojové databáze a použít je pro 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. Ve svém cílovém prostředí vytvořte prázdnou databázi, což je flexibilní server Azure Database for PostgreSQL.

  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 <SubscriptionID>
      
  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/<SubscriptionID>/resourceGroups/<ResourceGroupName>/providers/Microsoft.Network/virtualNetworks/<VirtualNetwork>/subnets/<SubnetName> –tags tagName1=tagValue1 tagWithNoValue
    

    Například následující příkaz vytvoří službu. Nahradit <SubscriptionID>, <ResourceGroupName>a <VirtualNetwork> s platnými hodnotami.

    • Umístění: USA – východ 2
    • Předplatné: <SubscriptionID>
    • Název skupiny prostředků: <ResourceGroupName>
    • Název služby 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
    

    Vytvoření instance služby DMS trvá přibližně 10 minut.

  3. Pokud chcete identifikovat IP adresu agenta DMS, abyste ji mohli přidat 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 <resource-group> --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 IP adresu do pg_hba.conf souboru ve zdroji, podobně jako v následující položce:

      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 skupiny prostředků: <ResourceGroupName>
    • 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 <ResourceGroupName> --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 se formát objektu JSON možností databáze zobrazuje takto:

      [
          {
              "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. Tady je ukázkový dotaz pro vygenerování seznamu tabulek. 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. K naplnění selectedTables pole můžete použít výstup předchozího dotazu SQL.

        Poznámka:

        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ématu 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 <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
      

    V tomto okamžiku jste úspěšně odeslali úlohu migrace.

  7. Pokud chcete zobrazit průběh úlohy, spusťte následující příkazy.

    • Pokud chcete zobrazit obecný stav úkolu stručně:

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
      
    • Pokud chcete zobrazit podrobný stav úkolu, včetně informací o průběhu migrace:

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask --expand output
      
    • Formát dotazu JMESPath můžete použít také k extrakci migrationState pouze z rozbaleného výstupu:

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --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 inicializuje přímou databázi Inventory:

    az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --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 <ResourceGroupName> --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 <ResourceGroupName> --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 <ResourceGroupName> --name runnowtask
    
  3. Pokud chcete odstranit projekt, použijte následující příkaz:

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

    az dms delete -g <ResourceGroupName> -n PostgresCLI