Tema ini menjelaskan cara menggunakan pg_dump dan pg_restore untuk memigrasi database dari instance PostgreSQL mandiri ke instance ApsaraDB RDS untuk PostgreSQL. Panduan ini berlaku jika Anda sudah familiar dengan pg_dump dan pg_restore serta tidak ingin menggunakan layanan migrasi yang disediakan oleh Alibaba Cloud, seperti Data Transmission Service (DTS) atau fitur migrasi cloud dari ApsaraDB RDS untuk PostgreSQL.
Prasyarat
Instance RDS yang menjalankan versi PostgreSQL yang sama dengan instance PostgreSQL mandiri telah dibuat. Untuk informasi lebih lanjut, lihat Buat instance ApsaraDB RDS untuk PostgreSQL.
CatatanAnda dapat menggunakan pg_dump dan pg_restore untuk memigrasi database di antara versi PostgreSQL. Namun, kami merekomendasikan agar Anda menggunakan versi PostgreSQL yang sama untuk instance PostgreSQL mandiri dan instance RDS guna menghindari masalah kompatibilitas.
Jalankan perintah
psql --versionpada server tempat instance PostgreSQL mandiri ditempatkan untuk mengetahui versi PostgreSQL dari instance tersebut.Setelah migrasi selesai, Anda dapat meningkatkan versi mesin utama instance RDS. Untuk informasi lebih lanjut, lihat Tingkatkan versi mesin utama.
Jika instance PostgreSQL mandiri berada pada instance Elastic Compute Service (ECS), buatlah instance RDS di wilayah dan virtual private cloud (VPC) yang sama dengan instance ECS. Dengan cara ini, data dimigrasikan melalui jaringan internal, yang lebih cepat dan aman.
Konfigurasikan daftar putih alamat IP untuk instance RDS agar mengizinkan akses dari server tempat instance PostgreSQL mandiri ditempatkan. Untuk informasi lebih lanjut, lihat Konfigurasikan daftar putih alamat IP.
Buat akun istimewa untuk instance RDS. Untuk informasi lebih lanjut, lihat Buat akun.
Peroleh titik akhir dan nomor port instance RDS. Untuk informasi lebih lanjut, lihat Lihat dan ubah titik akhir dan nomor port instance ApsaraDB RDS untuk PostgreSQL.
CatatanJika instance PostgreSQL mandiri berada pada instance ECS dalam wilayah dan VPC yang sama dengan instance RDS, gunakan titik akhir internal dan nomor port instance RDS. Dalam kasus lain, gunakan titik akhir publik dan nomor port instance RDS.
Buat akun administrator dengan peran superuser untuk instance PostgreSQL mandiri.
Pastikan bahwa pg_dump dan pg_restore telah terinstal pada server tempat instance PostgreSQL mandiri ditempatkan.
CatatanKetika Anda menginstal instance PostgreSQL mandiri di mesin lokal, pg_dump dan pg_restore secara otomatis terinstal. Jalankan perintah
pg_dump --versiondanpg_restore --versionuntuk memeriksa detailnya.
Prosedur
Solusi migrasi yang dijelaskan dalam tema ini cocok untuk memigrasikan satu database. Jika Anda ingin memigrasikan beberapa database atau seluruh instance PostgreSQL mandiri ke instance RDS, lihat solusi berikut:
Untuk memigrasikan beberapa database pada instance PostgreSQL mandiri sekaligus, gunakan Data Transmission Service (DTS). Untuk informasi lebih lanjut, lihat Gunakan DTS untuk memigrasi data dari database PostgreSQL mandiri ke instance ApsaraDB RDS untuk PostgreSQL.
Untuk memigrasikan seluruh instance PostgreSQL mandiri, gunakan fitur migrasi cloud dari ApsaraDB RDS untuk PostgreSQL. Untuk informasi lebih lanjut, lihat Gunakan fitur migrasi cloud untuk instance ApsaraDB RDS untuk PostgreSQL.
Langkah 1: Periksa informasi tentang database yang ingin Anda migrasikan
Sambungkan ke instance PostgreSQL mandiri. Di baris perintah psql, jalankan perintah \l untuk memeriksa informasi tentang database dan nilai Pemilik, Pengkodean, Collate, dan Ctype dari database yang ingin dimigrasikan.
Sebagai contoh, database bernama testdb akan dimigrasikan. Informasi berikut diperoleh untuk database tersebut: Pemilik adalah testuser, Pengkodean adalah UTF8, Collate adalah en_US.UTF-8, dan Ctype adalah en_US.UTF-8.
Daftar database
Nama | Pemilik | Pengkodean | Collate | Ctype | ICU Locale | Locale Provider | Hak akses
-----------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =Tc/postgres +
| | | | | | | postgres=CTc/postgres
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres +
| | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc | =c/postgres +
| | | | | | | postgres=CTc/postgres
testdb | testuser | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | libc |
(4 baris)Langkah 2: Migrasikan pengguna
Sambungkan ke server tempat instance PostgreSQL mandiri ditempatkan dan jalankan perintah berikut untuk mengekspor pemilik bernama
testuserdari database yang ingin dimigrasikan:pg_dumpall -g -h 127.0.0.1 -p 5432 -U testuserContoh keluaran:
CatatanDi bagian Peran dari keluaran perintah, Anda dapat memperoleh pernyataan yang terkait dengan izin pengguna
testuser.-- -- Dump kluster database PostgreSQL -- SET default_transaction_read_only = off; SET client_encoding = 'UTF8'; SET standard_conforming_strings = on; -- -- Peran -- CREATE ROLE postgres; ALTER ROLE postgres WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS; CREATE ROLE testuser; ALTER ROLE testuser WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS PASSWORD 'SCRAM-SHA-256$4096:0IEvNqWupQsGcaoDS3SX****3U='; -- -- Konfigurasi Pengguna -- -- -- Dump kluster database PostgreSQL selesai --Gunakan akun istimewa untuk menyambung ke instance RDS. Untuk informasi lebih lanjut, lihat Sambungkan ke instance ApsaraDB RDS untuk PostgreSQL.
Ganti
SUPERUSERdalam pernyataan SQL yang diperoleh yang terkait dengan izin penggunatestusermenjadirds_SUPERUSER. Pada instance RDS, buat akun yang memiliki izin yang sama dengan pengguna testuser dari instance PostgreSQL mandiri.CREATE ROLE testuser; ALTER ROLE testuser WITH rds_SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION BYPASSRLS PASSWORD 'SCRAM-SHA-256$4096:0IEvNqWupQsGcaoDS3SX****3U=';
Langkah 3: Buat database tujuan pada instance RDS
Gunakan akun istimewa untuk menyambung ke instance RDS.
Buat database tujuan. Pastikan bahwa database tujuan memiliki karakter set yang sama serta pengaturan Collate dan Ctype yang sama dengan database sumber pada instance PostgreSQL mandiri. Sebagai contoh, database tujuan harus memiliki pengaturan yang sama dengan database sumber yang diperoleh di Langkah 1: Pengkodean adalah
UTF8, Collate adalahen_US.UTF-8, dan Ctype adalahen_US.UTF-8.CREATE DATABASE <Nama database tujuan> WITH OWNER <Pemilik database> TEMPLATE template0 ENCODING 'UTF8' LC_CTYPE 'en_US.UTF-8' LC_COLLATE 'en_US.UTF-8';CatatanNama database tujuan dapat berbeda dari nama database sumber pada instance PostgreSQL mandiri.
Pemilik database tujuan harus sama dengan pemilik database sumber pada instance PostgreSQL mandiri.
Langkah 4: Migrasikan data
Anda dapat menggunakan salah satu metode berikut untuk memigrasikan data:
Jika server tempat instance PostgreSQL mandiri ditempatkan dapat tersambung ke instance RDS, gunakan migrasi online.
Jika server tempat instance PostgreSQL mandiri ditempatkan tidak dapat tersambung ke instance RDS, gunakan migrasi offline. Secara khusus, gunakan pg_dump untuk mengekspor data ke file, salin file tersebut ke host tempat instance RDS tersambung, lalu gunakan pg_restore untuk mengimpor file ke instance RDS.
Migrasi Online
Konfigurasikan file kata sandi. Untuk informasi lebih lanjut, lihat File Kata Sandi.
Jalankan perintah berikut pada server tempat instance PostgreSQL mandiri ditempatkan untuk membuat dan mengedit file .pgpass untuk menyimpan kata sandi:
vi ~/.pgpassTekan
iuntuk masuk ke mode sisipan dan masukkan konten terkait kata sandi.CatatanKonten file kata sandi dalam format berikut:
host:port:dbname:username:password.Secara default, metadata database PostgreSQL disimpan dalam huruf kecil. Oleh karena itu, nilai parameter dbname dan username harus dalam huruf kecil. Jika nama database dan nama pengguna yang Anda tentukan menggunakan huruf besar dan diapit oleh tanda kutip ganda ("), kondisi sebelumnya tidak berlaku.
Titik akhir instance RDS:5432:Nama database tujuan:Username pemilik database tujuan:Kata sandi 127.0.0.1:5432:Nama database sumber pada instance PostgreSQL mandiri:Username superuser:Kata sandiTekan
Escdan masukkan:wquntuk keluar dari mode sisipan.Ubah izin pada file
.pgpass.chmod 700 ~/.pgpass
Jalankan perintah berikut pada server tempat instance PostgreSQL mandiri ditempatkan untuk memigrasikan data:
nohup pg_dump -F p -h 127.0.0.1 -p 5432 -U <Superuser instance mandiri> -d <Nama database yang ingin Anda migrasikan> --no-tablespaces | time psql -h <Titik akhir instance RDS> -p 5432 -U <Username pemilik database tujuan> --single-transaction <Nama database tujuan> > ./pg.dump.log 2>&1 &CatatanPeriksa file pg.dump.log untuk memastikan tidak ada log kesalahan. Jika file kosong, migrasi berhasil. Dalam hal ini, Anda dapat masuk ke instance RDS untuk melihat data yang dimigrasikan.
Opsi
--single-transactionditentukan dalam perintah sebelumnya. Selama impor data, semua operasi dienkapsulasi dalam satu transaksi untuk memastikan bahwa semua operasi berhasil atau gagal bersamaan. Jika semua operasi gagal, Anda dapat menyelesaikan masalah dan langsung mengimpor data lagi.
Migrasi Offline
Jalankan perintah berikut pada server tempat instance PostgreSQL mandiri ditempatkan untuk mengekspor file pg.dump:
nohup pg_dump -F c -h 127.0.0.1 -p 5432 -U <Superuser instance mandiri> -d <Nama database yang ingin Anda migrasikan> --no-tablespaces -f ./pg.dump > ./pg.dump.log 2>&1 &CatatanTunggu hingga ekspor selesai. Kemudian, verifikasi bahwa tidak ada log kesalahan dalam file pg.dump.log.
Salin file
pg.dumpke host tempat instance RDS dapat tersambung. Lalu, impor file tersebut.CatatanJika Anda menggunakan metode ini, konfigurasikan daftar putih alamat IP untuk instance RDS agar mengizinkan host mengakses instance tersebut. Untuk informasi lebih lanjut, lihat Konfigurasikan daftar putih alamat IP.
Impor single-thread
pg_restore -h <Titik akhir instance RDS> -p 5432 -U <Username pemilik database tujuan> -d <Nama database tujuan> --no-tablespaces --single-transaction pg.dump >./pg.restore.logCatatanTunggu hingga impor selesai. Periksa file
pg.restore.loguntuk memastikan tidak ada log kesalahan. Jika file kosong, migrasi berhasil. Dalam hal ini, Anda dapat masuk ke instance RDS untuk melihat data yang dimigrasikan.Opsi
--single-transactionditentukan dalam perintah sebelumnya. Selama impor data, semua operasi dienkapsulasi dalam satu transaksi untuk memastikan bahwa semua operasi berhasil atau gagal bersamaan. Jika semua operasi gagal, Anda dapat menyelesaikan masalah dan langsung mengimpor data lagi.
Impor multi-thread paralel
pg_restore -h <Titik akhir instance RDS> -p 5432 -U <Username pemilik database tujuan> -d <Nama database tujuan> --no-tablespaces -j <Jumlah thread paralel> pg.dump >./pg.restore.log 2>&1 &CatatanAnda tidak dapat menggunakan opsi
--single-transactiondan opsi-jyang digunakan untuk mengaktifkan paralelisme pada saat yang sama.Nilai opsi
-jadalah bilangan bulat positif. Kami merekomendasikan agar nilai maksimum opsi tersebut adalah dua kali atau empat kali jumlah inti CPU sistem. Hal ini memastikan bahwa sumber daya sistem sepenuhnya dimanfaatkan dan mencegah persaingan sumber daya dan penurunan kinerja yang disebabkan oleh banyak tugas paralel.Metode ini tidak menggunakan opsi
--single-transactionuntuk mengenkapsulasi transaksi. Jika terjadi kesalahan selama impor data, Anda harus menyelesaikan masalah, membersihkan semua tabel dalam database tujuan pada instance RDS, lalu mengimpor data lagi. Ini membantu memastikan konsistensi data.
Referensi
Anda dapat mengonfigurasi lebih banyak parameter untuk perintah dalam tema ini sesuai dengan kebutuhan bisnis Anda. Untuk informasi lebih lanjut, lihat dokumen berikut:
Solusi migrasi yang dijelaskan dalam tema ini cocok untuk memigrasikan satu database. Jika Anda ingin memigrasikan beberapa database atau seluruh instance PostgreSQL mandiri ke instance RDS, lihat solusi berikut:
Untuk memigrasikan beberapa database pada instance PostgreSQL mandiri sekaligus, gunakan Data Transmission Service (DTS). Untuk informasi lebih lanjut, lihat Gunakan DTS untuk memigrasi data dari database PostgreSQL mandiri ke instance ApsaraDB RDS untuk PostgreSQL.
Untuk memigrasikan seluruh instance PostgreSQL mandiri, gunakan fitur migrasi cloud dari ApsaraDB RDS untuk PostgreSQL. Untuk informasi lebih lanjut, lihat Gunakan fitur migrasi cloud untuk instance ApsaraDB RDS untuk PostgreSQL.