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:
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 adalah5
.max_wal_senders
= [jumlah tugas bersamaan]. Parametermax_wal_senders
mengatur jumlah tugas bersamaan yang dapat dijalankan. Pengaturan yang disarankan adalah10
.
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.
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.
Buat database kosong di lingkungan target Anda, yaitu Azure Database for PostgreSQL - Server fleksibel.
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
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 melihatdms-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>
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.
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" ]
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
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
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.
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
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
Untuk memantau kemajuan migrasi langsung, jalankan perintah berikut:
az dms project task show --service-name PostgresCLI --project-name PGMigration --resource-group <ResourceGroupName> --name runnowtask
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
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
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
Untuk menghapus proyek, gunakan perintah berikut:
az dms project delete -n PGMigration -g <ResourceGroupName> --service-name PostgresCLI
Untuk menghapus layanan DMS, gunakan perintah berikut:
az dms delete -g <ResourceGroupName> -n PostgresCLI