Oktatóanyag: A PostgreSQL online migrálása az Azure Database for PostgreSQL-be a DMS (klasszikus) használatával az Azure CLI-n keresztül

Az Azure Database Migration Service használatával minimális állásidővel migrálhatja az adatbázisokat egy helyszíni PostgreSQL-példányból az Azure Database for PostgreSQL-be . Más szóval a migrálás minimális állásidővel érhető el az alkalmazás számára. Ebben az oktatóanyagban a DVD-kölcsönzési mintaadatbázist a PostgreSQL 9.6 egy helyszíni példányából migrálja az Azure Database for PostgreSQL-be az Azure Database Migration Service online migrálási tevékenységével.

Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:

  • A mintaséma migrálása pg_dump segédprogrammal.
  • Egy Azure Database Migration Service-példány létrehozása.
  • Migrálási projekt létrehozása az Azure Database Migration Service használatával.
  • A migrálás futtatása.
  • Az áttelepítés monitorozása.

Feljegyzés

Az Azure Database Migration Service online migráláshoz való használatához létre kell hoznia egy példányt a prémium tarifacsomag alapján. Titkosítjuk a lemezt, hogy megelőzzük az adatlopásokat a migrálás során.

Fontos

Az optimális migrálási élmény érdekében a Microsoft azt javasolja, hogy hozzon létre egy Azure Database Migration Service-példányt ugyanabban az Azure-régióban, mint a céladatbázis. Az adatok különböző régiók és földrajzi helyek közötti áthelyezése lelassíthatja a migrálási folyamatot, és hibákat eredményezhet.

Előfeltételek

Az oktatóanyag elvégzéséhez a következőkre lesz szüksége:

  • Töltse le és telepítse a PostgreSQL community edition 9.4, 9.5, 9.6 vagy 10 kiadását. A postgreSQL-kiszolgáló forrásverziójának 9.4-es, 9.5-ös, 9.6-os, 10-es, 11-es, 12-es vagy 13-es verziónak kell lennie. További információ: Támogatott PostgreSQL-adatbázisverziók.

    Vegye figyelembe azt is, hogy a cél Azure Database for PostgreSQL-verziónak egyenlőnek vagy újabbnak kell lennie, mint a helyszíni PostgreSQL-verzió. A PostgreSQL 9.6 például csak az Azure Database for PostgreSQL 9.6,10-re vagy 11-re migrálható, az Azure Database for PostgreSQL 9.5-be azonban nem.

  • Hozzon létre egy példányt az Azure Database for PostgreSQL-ben , vagy hozzon létre egy Azure Database for PostgreSQL - Rugalmas skálázású (Citus) kiszolgálót.

  • Hozzon létre egy Microsoft Azure Virtual Network hálózatot az Azure Database Migration Service-hez az Azure Resource Manager-alapú üzemi modell használatával, amely a hálózat helyek közötti kapcsolatot biztosít a helyszíni forráskiszolgálóknak ExpressRoute vagy VPN használatával. A virtuális hálózat létrehozásával kapcsolatos további információkért tekintse meg a virtuális hálózat dokumentációját, és különösen a részletes információkat tartalmazó rövid útmutatókat.

    Feljegyzés

    A virtuális hálózat beállítása során, ha az ExpressRoute-ot hálózati társviszony-létesítéssel használja a Microsofthoz, adja hozzá a következő szolgáltatásvégpontokat ahhoz az alhálózathoz, amelyben a szolgáltatás ki lesz építve:

    • Céladatbázis végpontja (például SQL-végpont, Azure Cosmos DB-végpont stb.)
    • Tárolási végpont
    • Service Bus-végpont

    Ez a konfiguráció szükséges, mert az Azure Database Migration Service nem rendelkezik internetkapcsolattal.

  • Győződjön meg arról, hogy a virtuális hálózati hálózati biztonsági csoport (NSG) szabályai nem tiltják le a ServiceTag 443-at a ServiceTag for ServiceBus, a Storage és az AzureMonitor kimenő portjában. További részletek a Virtual Network NSG-forgalom szűréséről: Hálózati forgalom szűrése hálózati biztonsági csoportokkal.

  • Konfigurálja a Windows tűzfalat az adatbázismotorhoz való hozzáféréshez.

  • Nyissa meg a Windows tűzfalat, és engedélyezze, hogy az Azure Database Migration Service elérhesse a PostgreSQL-kiszolgáló forrását, amely alapértelmezés szerint az 5432-es TCP-port.

  • Ha tűzfalkészüléket használ a forrásadatbázis(ok) előtt, előfordulhat, hogy tűzfalszabályokat kell hozzáadnia annak engedélyezéséhez, hogy az Azure Database Migration Service a migrálás céljából hozzáférhessen a forrásadatbázis(ok)hoz.

  • Hozzon létre egy kiszolgálószintű tűzfalszabályt az Azure Database for PostgreSQL-hez, hogy az Azure Database Migration Service hozzáférhessen a céladatbázisokhoz. Adja meg az Azure Database Migration Service-hez használt Virtual Network alhálózati tartományát.

  • A CLI meghívásának két módja van:

    • Az Azure Portal jobb felső sarkában válassza a Cloud Shell gombot:

      Cloud Shell gomb a Microsoft Azure Portal-on

    • Telepítse és futtassa a CLI-t helyileg. A parancssori eszköz 2.18-as vagy újabb verziója szükséges a migráláshoz szükséges Azure-erőforrások kezeléséhez.

      A parancssori felület letöltéséhez kövesse az Azure CLI telepítése című cikkben található utasításokat. A cikk az Azure CLI-t támogató platformokat is felsorolja.

      Windows Subsystem for Linux (WSL) beállításához kövesse a Windows 10 telepítési útmutatójának utasításait

  • Engedélyezze a logikai replikációt a forráskiszolgálón a postgresql.config fájl szerkesztésével és a következő paraméterek beállításával:

    • wal_level = logical
    • max_replication_slots = [a tárolóhelyek száma], öt tárolóhely beállításának ajánlása
    • max_wal_senders = [párhuzamos feladatok száma] – a max_wal_senders paraméter megadja a párhuzamosan futtatható feladatok számát, az ajánlott beállítás 10 feladat

A mintaséma migrálása

Ahhoz, hogy az összes adatbázis-objektumot táblasémaként, indexekként és tárolt eljárásokként egészíthessük ki, ki kell bontanunk a forrásadatbázis sémáját, és alkalmaznunk kell az adatbázisra.

  1. Pg_dump -s parancs segítségével hozzon létre egy séma-memóriaképfájlt az adatbázishoz.

    pg_dump -O -h hostname -U db_username -d db_name -s > your_schema.sql
    

    Például: sémafájl kiírása a dvdrental adatbázishoz:

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

    A pg_dump segédprogram használatával kapcsolatos további információkért lásd a pg-memóriakép oktatóanyagban szereplő példákat.

  2. Hozzon létre egy üres adatbázist a célkörnyezetben, amely az Azure Database for PostgreSQL.

    Az adatbázisok csatlakoztatásával és létrehozásával kapcsolatos részletekért tekintse meg az Azure Database for PostgreSQL-kiszolgáló létrehozása az Azure Portalon vagy Az Azure Database for PostgreSQL - Rugalmas skálázású (Citus) kiszolgáló létrehozása az Azure Portalon című cikket.

  3. Importálja a sémát a létrehozott céladatbázisba a séma-memóriaképfájl visszaállításával.

    psql -h hostname -U db_username -d db_name < your_schema.sql 
    

    Például:

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

Feljegyzés

A migrálási szolgáltatás belsőleg kezeli az idegen kulcsok és triggerek engedélyezését/letiltását a megbízható és robusztus adatmigrálás biztosítása érdekében. Emiatt nem kell aggódnia a céladatbázis sémájának módosítása miatt.

DMS-példány üzembe helyezése az Azure CLI használatával

  1. A dms szinkronizálási bővítmény telepítéséhez:

    • Jelentkezzen be az Azure-ba az alábbi parancs futtatásával:

      az login
      
    • Amikor a rendszer kéri, nyisson meg egy webböngészőt, és adja meg a kódot az eszköz hitelesítéséhez. Kövesse az utasításokat a megjelenésük sorrendjében.

    • A PostgreSQL online migrálása már elérhető a szokásos CLI-csomagban (2.18.0-s vagy újabb verzió), a bővítmény nélkül dms-preview . Ha korábban telepítette a bővítményt, az alábbi lépésekkel távolíthatja el:

      • Annak ellenőrzéséhez, hogy telepítve van-e dms-preview már a bővítmény, futtassa a következő parancsot:

        az extension list -o table
        
      • Ha dms-preview a bővítmény telepítve van, akkor az eltávolításhoz futtassa a következő parancsot:

        az extension remove --name dms-preview
        
      • A bővítmény helyes eltávolításának dms-preview ellenőrzéséhez futtassa a következő parancsot, és ne jelenjen meg a bővítmény a dms-preview listában:

        az extension list -o table
        

      Fontos

      dms-preview az Azure DMS által támogatott egyéb migrálási útvonalakhoz továbbra is szükség lehet bővítményre. Ellenőrizze az adott migrálási útvonal dokumentációját, és állapítsa meg, hogy szükség van-e a bővítményre. Ez a dokumentáció az Azure Database for PostgreSQL-hez készült PostgreSQL online bővítményére vonatkozó követelményt ismerteti.

    • A következő futtatásával bármikor megjelenítheti a DMS-ben támogatott összes parancsot:

      az dms -h
      
    • Ha több Azure-előfizetéssel is rendelkezik, a DMS-szolgáltatás egy példányának kiépítéséhez használni kívánt előfizetés beállításához futtassa a következő parancsot.

      az account set -s 97181df2-909d-420b-ab93-1bff15acb6b7
      
  2. A DMS egy példányának kiépítése a következő parancs futtatásával:

    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
    

    Például a következő parancs szolgáltatást hoz létre az alábbi helyen:

    • Hely: az USA 2. keleti régiója
    • Előfizetés: 97181df2-909d-420b-ab93-1bff15acb6b7
    • Erőforráscsoport neve: PostgresDemo
    • DMS-szolgáltatás neve: 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
    

    A DMS-szolgáltatás példányának létrehozása nagyjából 10–12 percet vesz igénybe.

  3. A DMS-ügynök IP-címének azonosításához, így a Postgres pg_hba.conf fájlba való felvételéhez futtassa a következő parancsot:

    az network nic list -g <ResourceGroupName>--query '[].ipConfigurations | [].privateIpAddress'
    

    Példa:

    az network nic list -g PostgresDemo --query '[].ipConfigurations | [].privateIpAddress'
    

    A következő címhez hasonló eredményt kell kapnia:

    [
      "172.16.136.18"
    ]
    
  4. Vegye fel a DMS-ügynök IP-címét a Postgres pg_hba.conf fájlba.

    • A DMS kiépítése után jegyezze fel a DMS IP-címét.

    • Vegye fel az IP-címet a pg_hba.conf fájlba a forráson a következő bejegyzéshez hasonló módon:

      host     all            all        172.16.136.18/10    md5
      host     replication    postgres   172.16.136.18/10    md5
      
  5. Ezután hozzon létre egy PostgreSQL-migrálási projektet a következő parancs futtatásával:

    az dms project create -l <location> -g <ResourceGroupName> --service-name <yourServiceName> --source-platform PostgreSQL --target-platform AzureDbforPostgreSQL -n <newProjectName>
    

    Például a következő parancs létrehoz egy projektet az alábbi paraméterek használatával:

    • Hely: az USA nyugati középső régiója
    • Erőforráscsoport neve: PostgresDemo
    • Szolgáltatás neve: PostgresCLI
    • Projekt neve: PGMigration
    • Forrásplatform: PostgreSQL
    • Célplatform: AzureDbForPostgreSql
    az dms project create -l westcentralus -n PGMigration -g PostgresDemo --service-name PostgresCLI --source-platform PostgreSQL --target-platform AzureDbForPostgreSql
    
  6. Az alábbi lépéseket követve hozzon létre egy PostgreSQL-migrálási feladatot.

    Ez a lépés magában foglalja a forrás IP-címének, felhasználói azonosítójának és jelszavának, a cél IP-címének, felhasználói azonosítójának és jelszavának, és a feladattípusnak a megadását a kapcsolat létrehozásához.

    • A lehetőségek teljes listájának megtekintéséhez futtassa a parancsot:

      az dms project task create -h
      

      A forrás és cél kapcsolata esetében is a bemeneti paraméter egy az objektumlistát tartalmazó json-fájlra hivatkozik.

      A kapcsolat JSON-objektumának formátuma a PostgreSQL-kapcsolatokhoz.

      {
          // 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                
      }
      

      Van egy adatbázis-beállítás json-fájlja is, amely felsorolja a json-objektumokat. A PostgreSQL esetében az adatbázis-beállítási JSON-objektum formátuma az alábbi:

      [
          {
              "name": "source database",
              "target_database_name": "target database",
              "selectedTables": [
                  "schemaName1.tableName1",
                  ...n
              ]
          },
          ...n
      ]
      
    • A forráskapcsolat jsonjának létrehozásához nyissa meg a Jegyzettömb, másolja ki a következő jsont, és illessze be a fájlba. Mentse a fájlt a C:\DMS\source.json fájlba, miután módosította a forráskiszolgálónak megfelelően.

      {
          "userName": "postgres",    
          "password": null,
          "serverName": "13.51.14.222",
          "databaseName": "dvdrental", 
          "port": 5432                
      }
      
    • A célkapcsolat json létrehozásához nyissa meg a Jegyzettömb, másolja ki a következő jsont, és illessze be a fájlba. Mentse a fájlt a C:\DMS\target.json fájlba, miután módosította a célkiszolgálónak megfelelően.

      {
          "userName": " dms@builddemotarget",    
          "password": null,           
          "serverName": " builddemotarget.postgres.database.azure.com",
          "databaseName": "inventory", 
          "port": 5432                
      }
      
    • Hozzon létre egy adatbázis-beállítások json-fájlt, amely felsorolja a migrálni kívánt adatbázisok leltárát és leképezését:

      • Hozza létre az áttelepítendő táblák listáját, vagy sql-lekérdezéssel hozza létre a listát a forrásadatbázisból. A táblák listájának létrehozására szolgáló minta lekérdezést az alábbi példában tekintheti meg. Ha ezt a lekérdezést használja, ne felejtse el eltávolítani az utolsó vesszőt a táblanév végén, hogy az érvényes JSON-tömb legyen.

        SELECT
            FORMAT('%s,', REPLACE(FORMAT('%I.%I', schemaname, tablename), '"', '\"')) AS SelectedTables
        FROM 
            pg_tables
        WHERE 
            schemaname NOT IN ('pg_catalog', 'information_schema');
        
      • Hozza létre az adatbázis-beállítások json-fájlját egy bejegyzéssel az egyes adatbázisokhoz a forrás- és céladatbázis nevével, valamint a migrálni kívánt táblák listájával. A fenti SQL-lekérdezés kimenetével feltöltheti a "selectedTables" tömböt. Vegye figyelembe, hogy ha a kijelölt táblák listája üres, akkor a szolgáltatás tartalmazza az áttelepítéshez szükséges összes táblát, amelyek egyező sémával és táblanevekkel rendelkeznek.

        [
            {
                "name": "dvdrental",
                "target_database_name": "dvdrental",
                "selectedTables": [
                    "schemaName1.tableName1",
                    "schemaName1.tableName2",                    
                    ...
                    "schemaNameN.tableNameM"
                ]
            },
            ... n
        ]
        
    • Futtassa a következő parancsot, amely felveszi a forráskapcsolatot, a célkapcsolatot és az adatbázis-beállítások json-fájljait.

      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    
      

    Ezen a ponton sikeresen beküldött egy migrálási feladatot.

  7. A feladat előrehaladásának megjelenítéséhez futtassa a következő parancsot:

    • Az általános tevékenység állapotának rövid megjelenítése

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
      
    • A tevékenység részletes állapotának megtekintése, beleértve a migrálási folyamat adatait

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand output
      
    • JMESPath lekérdezési formátumot is használhat a migrationState kibontásához a kibontott kimenetből:

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand output --query 'properties.output[].migrationState'
      

      A kimenetben számos paraméter jelzi a különböző migrálási lépések előrehaladását. Lásd például az alábbi kimenetet:

      {
          "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
      }
      

Átállásos migrálási feladat

Amikor a teljes betöltés kész, az adatbázis készen áll az átállásra. Attól függően, mennyire foglalt a forráskiszolgáló a beérkező új tranzakciók miatt, lehet, hogy a teljes betöltés befejeződése után a DMS-feladat még módosításokat alkalmaz.

Annak érdekében, hogy az összes adat szerepeljen, ellenőrizze a forrás- és a céladatbázis sorainak számát. Az állapotkimenetből például a következő adatokat ellenőrizheti:

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. Hajtsa végre az átállásos adatbázis-migrálási feladatot a következő paranccsal:

    az dms project task cutover -h
    

    A következő parancs például elindítja az "Inventory" adatbázis átvágását:

    az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask  --object-name Inventory
    
  2. Az átállás előrehaladásának monitorozásához futtassa a következő parancsot:

    az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  3. Amikor az adatbázis migrálási állapota befejeződött, hozza létre újra a sorozatokat (ha van), és csatlakoztassa az alkalmazásokat az Azure Database for PostgreSQL új célpéldányához.

Szolgáltatás, projekt, feladat törlése

Ha valamelyik DMS-feladat, -projekt vagy -szolgáltatás megszakítására vagy törlésére van szükség, hajtsa végre a megszakítást a következő sorrendben:

  • Az adott futó feladat megszakítása
  • A feladat törlése
  • A projekt törlése
  • A DMS-szolgáltatás törlése
  1. A futó feladat megszakításához használja a következő parancsot:

    az dms project task cancel --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  2. A futó feladat törléséhez használja a következő parancsot:

    az dms project task delete --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  3. Projekt törléséhez használja a következő parancsot:

    az dms project delete -n PGMigration -g PostgresDemo --service-name PostgresCLI
    
  4. A DMS-szolgáltatás törléséhez használja a következő parancsot:

    az dms delete -g ProgresDemo -n PostgresCLI
    

Következő lépések