Bagikan melalui


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

Penting

Kami menyarankan agar Anda menggunakan layanan migrasi baru di Azure Database for PostgreSQL untuk pengalaman migrasi yang lebih efisien dan efisien. Layanan ini menyederhanakan proses dengan mendukung berbagai lingkungan sumber, memastikan transisi bebas repot ke Azure Database for PostgreSQL.

Anda dapat menggunakan Azure Database Migration Service (DMS) 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 memigrasikan DVD Rental database sampel dari instans PostgreSQL 9.6 lokal 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.

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.

    Versi Azure Database for PostgreSQL target 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.

  • Buat instans di Azure Database for PostgreSQL - Server fleksibel.

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

    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.

  • Buka Windows Firewall Anda untuk mengizinkan Azure Database Migration Service mengakses Sumber PostgreSQL Server, yang secara default adalah port TCP 5432.

  • Saat menggunakan appliance firewall di depan database sumber, Anda mungkin perlu menambahkan aturan firewall untuk memungkinkan 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:

      Cuplikan layar tombol Cloud Shell di portal 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 logis di server sumber, dengan mengedit postgresql.config file dan mengatur parameter berikut:

    • wal_level = logical

    • max_replication_slots = [jumlah slot]. Pengaturan yang disarankan adalah 5.

    • max_wal_senders = [jumlah tugas bersamaan]. Parameter max_wal_senders mengatur jumlah tugas bersamaan yang dapat dijalankan. Pengaturan yang disarankan adalah 10.

Memigrasikan skema sampel

Untuk menyelesaikan semua objek database seperti skema tabel, indeks, dan prosedur tersimpan, kita perlu mengekstrak skema dari database sumber dan menerapkan 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 - Server fleksibel.

  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. Akibatnya, Anda tidak perlu khawatir membuat modifikasi apa pun pada skema database target.

Menyediakan instans DMS menggunakan Azure CLI

  1. Instal 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 menginstal ekstensi di masa lalu, Anda dapat menghapusnya menggunakan 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 menghapus instalan dms-preview ekstensi dengan benar, jalankan perintah berikut dan Anda seharusnya tidak melihat dms-preview ekstensi dalam daftar:

        az extension list -o table
        

      Penting

      dms-preview ekstensi 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 <SubscriptionID>
      
  2. Sediakan instans DMS dengan menjalankan perintah berikut:

    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
    

    Misalnya, perintah berikut membuat layanan. Ganti <SubscriptionID>, , <ResourceGroupName>dan <VirtualNetwork> dengan nilai yang valid.

    • Lokasi: US Timur2
    • Langganan: <SubscriptionID>
    • Nama grup sumber daya: <ResourceGroupName>
    • Nama layanan 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
    

    Dibutuhkan sekitar 10 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 <resource-group> --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 pg_hba.conf file pada sumber, mirip 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 Tengah AS
    • Nama grup sumber daya: <ResourceGroupName>
    • Nama layanan: PostgresCLI
    • Nama proyek: PGMigration
    • Platform sumber: PostgreSQL
    • Platform target: AzureDbForPostgreSql
    az dms project create -l westcentralus -n PGMigration -g <ResourceGroupName> --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 opsi database objek JSON ditampilkan sebagai berikut:

      [
          {
              "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. Berikut adalah contoh kueri untuk menghasilkan daftar tabel. Jika menggunakan kueri ini, ingatlah 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 dapat menggunakan output kueri SQL sebelumnya untuk mengisi selectedTables array.

        Catatan

        Jika daftar tabel yang dipilih kosong, maka layanan akan menyertakan semua tabel untuk migrasi yang memiliki skema dan nama tabel yang cocok.

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

    Pada titik ini, Anda berhasil mengirimkan tugas migrasi.

  7. Untuk memperlihatkan kemajuan tugas, jalankan perintah berikut.

    • Untuk melihat status tugas umum singkatnya:

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

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

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

      Di file output, ada beberapa parameter yang menunjukkan kemajuan migrasi. Misalnya, lihat output berikut:

      {
          "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 memulai cut-over untuk database 'Inventory':

    az dms project task cutover --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --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 <ResourceGroupName> --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 <ResourceGroupName> --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 <ResourceGroupName> --name runnowtask
    
  3. Untuk menghapus proyek, gunakan perintah berikut:

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

    az dms delete -g <ResourceGroupName> -n PostgresCLI