全部产品
Search
文档中心

ApsaraDB RDS:Gunakan pg_dump dan pg_restore untuk memigrasi data dari instance PostgreSQL mandiri ke instance ApsaraDB RDS untuk PostgreSQL

更新时间:Jul 06, 2025

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.

    Catatan
    • Anda 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 --version pada 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.

    Catatan

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

    Catatan

    Ketika Anda menginstal instance PostgreSQL mandiri di mesin lokal, pg_dump dan pg_restore secara otomatis terinstal. Jalankan perintah pg_dump --version dan pg_restore --version untuk 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:

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

  1. Sambungkan ke server tempat instance PostgreSQL mandiri ditempatkan dan jalankan perintah berikut untuk mengekspor pemilik bernama testuser dari database yang ingin dimigrasikan:

    pg_dumpall -g -h 127.0.0.1 -p 5432 -U testuser

    Contoh keluaran:

    Catatan

    Di 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
    --
  2. Gunakan akun istimewa untuk menyambung ke instance RDS. Untuk informasi lebih lanjut, lihat Sambungkan ke instance ApsaraDB RDS untuk PostgreSQL.

  3. Ganti SUPERUSER dalam pernyataan SQL yang diperoleh yang terkait dengan izin pengguna testuser menjadi rds_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

  1. Gunakan akun istimewa untuk menyambung ke instance RDS.

  2. 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 adalah en_US.UTF-8, dan Ctype adalah en_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';
    Catatan
    • Nama 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

  1. Konfigurasikan file kata sandi. Untuk informasi lebih lanjut, lihat File Kata Sandi.

    1. Jalankan perintah berikut pada server tempat instance PostgreSQL mandiri ditempatkan untuk membuat dan mengedit file .pgpass untuk menyimpan kata sandi:

      vi ~/.pgpass
    2. Tekan i untuk masuk ke mode sisipan dan masukkan konten terkait kata sandi.

      Catatan
      • Konten 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 sandi
    3. Tekan Esc dan masukkan :wq untuk keluar dari mode sisipan.

    4. Ubah izin pada file .pgpass.

      chmod 700 ~/.pgpass
  2. 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 & 
    Catatan
    • Periksa 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-transaction ditentukan 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

  1. 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 &
    Catatan

    Tunggu hingga ekspor selesai. Kemudian, verifikasi bahwa tidak ada log kesalahan dalam file pg.dump.log.

  2. Salin file pg.dump ke host tempat instance RDS dapat tersambung. Lalu, impor file tersebut.

    Catatan

    Jika 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.log
      Catatan
      • Tunggu hingga impor selesai. Periksa file pg.restore.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-transaction ditentukan 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 &
      Catatan
      • Anda tidak dapat menggunakan opsi --single-transaction dan opsi -j yang digunakan untuk mengaktifkan paralelisme pada saat yang sama.

      • Nilai opsi -j adalah 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-transaction untuk 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: