Tutorial: Memigrasikan PostgreSQL ke Azure Database for PostgreSQL secara online menggunakan DMS (klasik) melalui Azure CLI

Anda dapat menggunakan Azure Database Migration Service untuk memigrasikan database dari instans PostgreSQL lokal ke Azure Database for PostgreSQL dengan waktu henti minimal. Dengan kata lain, migrasi dapat diselesaikan dengan waktu henti minimal ke aplikasi. Dalam tutorial ini, Anda akan memigrasikan database sampel DVD Rental dari instans lokal PostgreSQL 9.6 ke Azure Database for PostgreSQL dengan menggunakan aktivitas migrasi online di Azure Database Migration Service.

Dalam tutorial ini, Anda akan mempelajari cara:

  • Memigrasikan skema sampel menggunakan utilitas pg_dump.
  • Membuat instans Azure Database Migration Service.
  • Membuat proyek migrasi dengan menggunakan Azure Database Migration Service.
  • Menjalankan migrasi.
  • Memantau migrasinya.

Catatan

Menggunakan Azure Database Migration Service untuk melakukan migrasi online mengharuskan pembuatan instans berdasarkan tingkat harga Premium. Kami mengenkripsi disk untuk mencegah pencurian data selama proses migrasi.

Penting

Untuk pengalaman migrasi yang optimal, Microsoft menyarankan pembuatan instans Azure Database Migration Service di wilayah Azure yang sama dengan database target. Pemindahan data antar wilayah atau geografi dapat memperlambat proses migrasi dan menimbulkan kesalahan.

Prasyarat

Untuk menyelesaikan tutorial ini, Anda perlu:

  • Unduh dan pasang PostgreSQL edisi komunitas 9.4, 9.5, 9.6, atau 10. Versi sumber PostgreSQL Server harus 9.4, 9.5, 9.6, 10, 11, 12, atau 13. Untuk informasi selengkapnya, lihat Versi database PostgreSQL yang didukung.

    Perhatikan juga bahwa target Azure Database for PostgreSQL harus sama dengan atau lebih baru dari versi PostgreSQL lokal. Misalnya, PostgreSQL 9.6 hanya dapat bermigrasi ke Azure Database for PostgreSQL 9.6, 10, atau 11, tetapi tidak ke Azure Database for PostgreSQL 9.5.

  • Membuat instans di Azure Database for PostgreSQL atau Membuat Azure Database for PostgreSQL - server Hyperscale (Citus).

  • Buat Microsoft Azure Virtual Network untuk Azure Database Migration Service dengan menggunakan model penyebaran Azure Resource Manager, yang menyediakan konektivitas site-to-site ke server sumber lokal Anda dengan menggunakan ExpressRoute atau VPN. Untuk mengetahui informasi selengkapnya tentang cara membuat jaringan virtual, lihat Dokumentasi Jaringan Virtual, terutama artikel mulai cepat yang disertai detail langkah demi langkah.

    Catatan

    Selama penyiapan jaringan virtual, jika Anda menggunakan ExpressRoute dengan peering jaringan ke Microsoft, tambahkan titik akhir layanan berikut ke subnet tempat layanan akan diprovisikan:

    • Titik akhir database target (misalnya, titik akhir SQL, titik akhir Cosmos DB, serta sebagainya)
    • Titik akhir penyimpanan
    • Titik akhir bus layanan

    Konfigurasi ini diperlukan karena Azure Database Migration Service tidak memiliki konektivitas internet.

  • Memastikan aturan Network Security Group (NSG) jaringan virtual Anda tidak memblokir port keluar 443 ServiceTag untuk ServiceBus, Storage, dan AzureMonitor. Untuk mengetahui detail selengkapnya tentang pemfilteran lalu lintas NSG jaringan virtual, lihat artikel Memfilter lalu lintas jaringan dengan kelompok keamanan jaringan.

  • Konfigurasikan Windows Firewall untuk akses mesin database Anda.

  • Membuka firewall Windows Anda untuk mengizinkan Azure Database Migration Service mengakses sumber Server PostgreSQL, yang secara default adalah port TCP 5432.

  • Saat menggunakan perangkat firewall di depan database sumber, Anda mungkin perlu menambahkan aturan firewall untuk mengizinkan Azure Database Migration Service mengakses database sumber untuk migrasi.

  • Membuat aturan firewall tingkat server untuk Azure Database for PostgreSQL agar Azure Database Migration Service dapat mengakses database target. Berikan rentang subnet jaringan virtual yang digunakan untuk Azure Database Migration Service.

  • Ada dua metode untuk memanggil CLI:

    • Di sudut kanan atas portal Microsoft Azure, pilih tombol Cloud Shell:

                    Tombol Cloud Shell di portal Microsoft Azure

    • Pasang dan jalankan CLI secara lokal. CLI 2.18 atau versi lebih tinggi dari alat baris perintah diperlukan untuk mengelola sumber daya Azure yang diperlukan untuk migrasi ini.

      Untuk mengunduh CLI, ikuti petunjuki di artikel Memasang Azure CLI 2.0. Artikel tersebut juga mencantumkan platform yang mendukung CLI.

      Untuk menyiapkan Subsistem Windows untuk Linux (WSL), ikuti instruksi di Panduan Penginstalan Windows 10

  • Aktifkan replikasi logika pada server sumber, dengan mengedit file postgresql.config dan mengatur parameter berikut:

    • wal_level = logical
    • max_replication_slots = [number of slots], menyarankan pengaturan ke lima slot
    • max_wal_senders =[number of concurrent tasks] - Parameter max_wal_senders menetapkan jumlah tugas bersamaan yang dapat dijalankan, menyarankan pengaturan ke 10 tugas

Memigrasikan skema sampel

Untuk melengkapi semua objek database seperti skema tabel, indeks, dan prosedur tersimpan, kita perlu mengekstrak skema dari database sumber dan menerapkannya ke database.

  1. Menggunakan perintah pg_dump -s untuk membuat file cadangan skema untuk database.

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

    Misalnya, untuk mencadangkan database dvdrental file skema:

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

    Selengkapnya tentang menggunakan utilitas pg_dump, lihat contoh di tutorial pg-dump.

  2. Buat database kosong di lingkungan target Anda, yaitu Azure Database for PostgreSQL.

    Untuk detail tentang cara menyambungkan dan membuat database, lihat artikel Membuat server Azure Database for PostgreSQL di portal Microsoft Azure atau Membuat Azure Database for PostgreSQL - server Hyperscale (Citus) di portal Microsoft Azure.

  3. Mengimpor skema ke database target yang Anda buat dengan memulihkan file cadangan skema.

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

    Contoh:

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

Catatan

Layanan migrasi secara internal menangani pengaktifan/penonaktifan kunci asing dan pemicu untuk memastikan migrasi data yang andal dan kuat. Oleh karena itu, Anda tidak perlu khawatir untuk membuat modifikasi apa pun pada skema database target.

Menyediakan instans DMS menggunakan Azure CLI

  1. Pasang ekstensi sinkronisasi dms:

    • Masuk ke Azure dengan menjalankan perintah berikut:

      az login
      
    • Saat diminta, buka browser web dan masukkan kode untuk mengautentikasi perangkat Anda. Ikuti instruksi seperti yang tercantum.

    • Migrasi online PostgreSQL sekarang tersedia dalam paket CLI reguler (versi 2.18.0 ke atas) tanpa perlu ekstensi dms-preview. Jika Anda telah memasang ekstensi tersebut sebelumnya, Anda bisa menghapusnya dengan langkah-langkah berikut:

      • Untuk memeriksa apakah ekstensi dms-preview sudah terinstal, jalankan perintah berikut:

        az extension list -o table
        
      • Jika ekstensi dms-preview sudah dipasang, maka untuk melepasnya, jalankan perintah berikut:

        az extension remove --name dms-preview
        
      • Untuk memverifikasi bahwa Anda telah melepas ekstensi dms-preview dengan benar, jalankan perintah berikut ini dan Anda mestinya tidak akan melihat ekstensi dms-previewdalam daftar:

        az extension list -o table
        

      Penting

      Ekstensi dms-preview mungkin masih diperlukan untuk jalur migrasi lain yang didukung oleh Azure DMS. Silakan periksa dokumentasi jalur migrasi tertentu untuk menentukan apakah ekstensi tersebut diperlukan. Dokumentasi ini mencakup persyaratan ekstensi, khusus untuk PostgreSQL ke Azure Database untuk PostgreSQL online.

    • Kapan saja, lihat semua perintah yang didukung di DMS dengan menjalankan:

      az dms -h
      
    • Jika Anda memiliki beberapa langganan Azure, jalankan perintah berikut untuk mengatur langganan yang ingin Anda gunakan untuk menyediakan instans layanan DMS.

      az account set -s 97181df2-909d-420b-ab93-1bff15acb6b7
      
  2. Sediakan instans DMS dengan menjalankan perintah berikut:

    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
    

    Contohnya perintah berikut akan membuat layanan di:

    • Lokasi: US Timur 2
    • Langganan: 97181df2-909d-420b-ab93-1bff15acb6b7
    • Nama Grup Sumber Saya: PostgresDemo
    • Nama Layanan 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
    

    Dibutuhkan sekitar 10-12 menit untuk membuat instans layanan DMS.

  3. Untuk mengidentifikasi alamat IP agen DMS sehingga Anda dapat menambahkannya ke file Postgres pg_hba.conf, jalankan perintah berikut:

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

    Contohnya:

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

    Anda harus mendapatkan hasil yang hampir sama dengan alamat berikut:

    [
      "172.16.136.18"
    ]
    
  4. Tambahkan alamat IP agen DMS ke file Postgres pg_hba.conf.

    • Catat alamat IP DMS setelah Anda selesai menyediakan di DMS.

    • Tambahkan alamat IP ke file pg_hba.conf pada sumber, yang hampir sama dengan entri berikut:

      host     all            all        172.16.136.18/10    md5
      host     replication    postgres   172.16.136.18/10    md5
      
  5. Selanjutnya, buat proyek migrasi PostgreSQL dengan menjalankan perintah berikut:

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

    Contohnya, perintah berikut membuat proyek menggunakan parameter ini:

    • Lokasi: Barat Sentral AS
    • Nama Grup Sumber Saya: PostgresDemo
    • Nama Layanan: PostgresCLI
    • Nama proyek: PGMigration
    • Platform sumber: PostgreSQL
    • Platform target: AzureDbForPostgreSql
    az dms project create -l westcentralus -n PGMigration -g PostgresDemo --service-name PostgresCLI --source-platform PostgreSQL --target-platform AzureDbForPostgreSql
    
  6. Buat tugas migrasi PostgreSQL menggunakan langkah-langkah berikut.

    Langkah ini termasuk menggunakan IP sumber, UserID dan kata sandi, IP tujuan, UserID, kata sandi, dan jenis tugas untuk membangun konektivitas.

    • Untuk melihat daftar lengkap opsi, jalankan perintah:

      az dms project task create -h
      

      Untuk koneksi sumber dan target, parameter input mengacu pada file json yang memiliki daftar objek.

      Format objek JSON koneksi untuk koneksi 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                
      }
      

      Ada juga file json opsi database yang mencantumkan objek json. Untuk PostgreSQL, format objek JSON opsi database ditunjukkan di bawah ini:

      [
          {
              "name": "source database",
              "target_database_name": "target database",
              "selectedTables": [
                  "schemaName1.tableName1",
                  ...n
              ]
          },
          ...n
      ]
      
    • Untuk membuat json koneksi sumber, buka Notepad dan salin json berikut dan tempelkan ke dalam file. Simpan file di C:\DMS\source.json setelah memodifikasinya sesuai dengan server sumber Anda.

      {
          "userName": "postgres",    
          "password": null,
          "serverName": "13.51.14.222",
          "databaseName": "dvdrental", 
          "port": 5432                
      }
      
    • Untuk membuat json koneksi target, buka Notepad dan salin json berikut dan tempelkan ke dalam file. Simpan file di C:\DMS\target.json setelah memodifikasinya sesuai dengan server sumber Anda.

      {
          "userName": " dms@builddemotarget",    
          "password": null,           
          "serverName": " builddemotarget.postgres.database.azure.com",
          "databaseName": "inventory", 
          "port": 5432                
      }
      
    • Buat file json opsi database yang mencantumkan inventaris dan memetakan database yang akan dimigrasikan:

      • Buat daftar tabel yang akan dimigrasikan, atau Anda bisa menggunakan SQL kueri untuk membuat daftar dari database sumber. Contoh kueri untuk membuat daftar tabel diberikan di bawah ini hanya sebagai contoh. Jika menggunakan kueri ini, harap ingat untuk menghapus koma terakhir di akhir nama tabel terakhir untuk menjadikannya array JSON yang valid.

        SELECT
            FORMAT('%s,', REPLACE(FORMAT('%I.%I', schemaname, tablename), '"', '\"')) AS SelectedTables
        FROM 
            pg_tables
        WHERE 
            schemaname NOT IN ('pg_catalog', 'information_schema');
        
      • Buat file json opsi database dengan satu entri untuk setiap database dengan nama database sumber dan target dan daftar tabel yang dipilih untuk dimigrasikan. Anda bisa menggunakan output kueri SQL di atas untuk mengisi array "SelectedTables". Harap dicatat bahwa jika daftar tabel yang dipilih kosong, maka layanan akan mencakup semua tabel yang memiliki skema dan nama tabel yang cocok semua akan dimigrasikan..

        [
            {
                "name": "dvdrental",
                "target_database_name": "dvdrental",
                "selectedTables": [
                    "schemaName1.tableName1",
                    "schemaName1.tableName2",                    
                    ...
                    "schemaNameN.tableNameM"
                ]
            },
            ... n
        ]
        
    • Jalankan perintah berikut, yang mengambil koneksi sumber, koneksi target, dan file json opsi database.

      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    
      

    Pada titik ini, Anda telah berhasil mengirimkan tugas migrasi.

  7. Untuk menunjukkan kemajuan tugas, jalankan perintah berikut:

    • Untuk melihat status tugas umum secara singkat

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
      
    • Untuk melihat status tugas terperinci termasuk informasi kemajuan migrasi

      az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask --expand output
      
    • Anda juga dapat menggunakan format kueri JMESPath untuk hanya mengekstrak migrationState dari output perluas:

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

      Di file output, ada beberapa parameter yang menunjukkan kemajuan migrasi. Contohnya, lihat file output di bawah ini:

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

Tugas migrasi langsung

Database siap untuk migrasi langsung saat pemuatan penuh selesai. Tergantung pada seberapa sibuk server sumber dengan transaksi baru yang masuk, tugas DMS mungkin masih menerapkan perubahan setelah pemuatan penuh selesai.

Untuk memastikan semua data tercakup, validasi jumlah baris antara database sumber dan target. Misalnya, Anda dapat memvalidasi detail berikut dari output status:

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. Lakukan tugas migrasi database langsung dengan menggunakan perintah berikut:

    az dms project task cutover -h
    

    Misalnya, perintah berikut akan memulai cut-over untuk database 'Inventory':

    az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask  --object-name Inventory
    
  2. Untuk memantau kemajuan migrasi langsung, jalankan perintah berikut:

    az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  3. Saat status migrasi database menunjukkan Selesai, buat ulang urutan (jika berlaku), dan sambungkan aplikasi Anda ke instans target baru Azure Database for PostgreSQL.

Pembersihan layanan, proyek, tugas

Jika Anda perlu membatalkan atau menghapus tugas, proyek, atau layanan DMS, lakukan pembatalan dengan urutan berikut:

  • Batalkan semua tugas yang sedang berjalan
  • Hapus tugas
  • Hapus proyek
  • Hapus layanan DMS
  1. Untuk membatalkan tugas yang sedang berjalan, gunakan perintah berikut:

    az dms project task cancel --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  2. Untuk menghapus tugas yang sedang berjalan, gunakan perintah berikut:

    az dms project task delete --service-name PostgresCLI --project-name PGMigration --resource-group PostgresDemo --name runnowtask
    
  3. Untuk menghapus proyek, gunakan perintah berikut:

    az dms project delete -n PGMigration -g PostgresDemo --service-name PostgresCLI
    
  4. Untuk menghapus layanan DMS, gunakan perintah berikut:

    az dms delete -g ProgresDemo -n PostgresCLI
    

Langkah berikutnya