Backup

Mencadangkan dan memulihkan basis data dengan pg_dump dan pg_restore, serta mengenal pg_basebackup.

Daftar isi

Topik ini membahas cadangan (backup) dengan pg_dump dan pemulihannya dengan pg_restore, beserta perbedaan formatnya dan peran pg_basebackup. Prinsip yang menopang seluruh topik ini sederhana, yaitu cadangan yang belum pernah dipulihkan belum terbuktikan sebagai cadangan, sehingga setiap langkah pada topik ini selesai dengan pemulihan sungguhan.

Blok penyiapan dataset#

bash
# siapkan ulang tabel dan data contoh untuk topik ini
PGOPTIONS='-c client_min_messages=warning' psql -q -U postgres -d perpustakaan <<'SQL'
DROP TABLE IF EXISTS peminjaman, buku, anggota, kategori CASCADE;
CREATE TABLE kategori (id SERIAL PRIMARY KEY, nama TEXT NOT NULL UNIQUE);
CREATE TABLE anggota (id SERIAL PRIMARY KEY, nama TEXT NOT NULL, email TEXT UNIQUE, bergabung DATE NOT NULL, aktif BOOLEAN NOT NULL DEFAULT TRUE);
CREATE TABLE buku (id SERIAL PRIMARY KEY, judul TEXT NOT NULL, penulis TEXT NOT NULL, tahun INTEGER NOT NULL, kategori_id INTEGER REFERENCES kategori(id));
CREATE TABLE peminjaman (id SERIAL PRIMARY KEY, anggota_id INTEGER NOT NULL REFERENCES anggota(id), buku_id INTEGER NOT NULL REFERENCES buku(id), tanggal_pinjam DATE NOT NULL, tanggal_kembali DATE);
INSERT INTO kategori (nama) VALUES ('Pemrograman'), ('Sains'), ('Sejarah'), ('Fiksi'), ('Statistika');
INSERT INTO anggota (nama, email, bergabung, aktif) VALUES ('Ali Rahman', '[email protected]', '2024-01-15', TRUE), ('Budi Santoso', '[email protected]', '2024-03-02', TRUE), ('Citra Kirana', '[email protected]', '2024-05-20', FALSE), ('Dewi Lestari', '[email protected]', '2024-08-11', TRUE), ('Eka Pratama', NULL, '2025-01-30', TRUE);
INSERT INTO buku (judul, penulis, tahun, kategori_id) VALUES ('Dasar Basis Data', 'Sari Wulandari', 2021, 1), ('Jaringan Komputer', 'Ahmad Fauzi', 2019, 1), ('Fisika untuk Pemula', 'Rina Marlina', 2020, 2), ('Kimia Organik', 'Rina Marlina', 2022, 2), ('Sejarah Nusantara', 'Bambang Wijaya', 2018, 3), ('Cerita Kota Lama', 'Nur Aisyah', 2023, 4), ('Statistika Terapan', 'Sari Wulandari', 2022, 5), ('Algoritma dan Struktur Data', 'Ahmad Fauzi', 2021, 1);
INSERT INTO peminjaman (anggota_id, buku_id, tanggal_pinjam, tanggal_kembali) VALUES (1, 1, '2025-03-01', '2025-03-15'), (1, 7, '2025-03-05', '2025-03-20'), (2, 3, '2025-03-10', NULL), (3, 5, '2025-02-20', '2025-03-01'), (2, 1, '2025-04-02', NULL), (4, 6, '2025-04-07', NULL), (5, 8, '2025-04-09', '2025-04-25'), (4, 2, '2025-05-01', NULL);
SQL

Cadangan dengan format khusus#

pg_dump menulis cadangan satu basis data tanpa menghentikan pembacaan lain, dan format khusus dengan -Fc menyimpannya terkompresi sekaligus memberi kebebasan pemilihan isi saat pemulihan. Blok berikut mencadangkan basis data contoh, membaca daftar isinya, dan menghitung banyaknya tabel yang tercatat.

bash
# cadangkan dengan format khusus lalu periksa daftar isinya
pg_dump -U postgres -Fc -d perpustakaan -f /tmp/perpus.dump
pg_restore -U postgres --list /tmp/perpus.dump | sed -E 's/^[0-9]+; [0-9]+ [0-9]+ //' | grep -cE '^TABLE '
text Keluaran
26

Berkas cadangannya berada di mesin klien karena pg_dump adalah alat klien, dan daftar isi dari pg_restore –list membaca apa yang tersimpan tanpa memulihkannya. Penyaringan pada baris tabel menghilangkan nomor urut katalog yang berubah antar server, sehingga hitungannya berupa empat tabel dataset utama.

Memulihkan ke basis data baru#

pg_restore mengisi basis data tujuan dari cadangan format khusus, dan latihan pemulihan dilakukan pada basis data segar alih-alih menimpa basis data sumbernya. Blok berikut memulihkan cadangan tersebut lalu membandingkan jumlah barisnya.

bash
# pulihkan ke basis data baru dan verifikasi isinya
psql -U postgres -d postgres -c "DROP DATABASE IF EXISTS uji_pulih;"
psql -U postgres -d postgres -c "CREATE DATABASE uji_pulih;"
pg_restore -U postgres -d uji_pulih /tmp/perpus.dump
psql -U postgres -d uji_pulih -c "SELECT (SELECT COUNT(*) FROM anggota) AS anggota, (SELECT COUNT(*) FROM buku) AS buku;"
psql -U postgres -d postgres -c "DROP DATABASE uji_pulih;"
rm /tmp/perpus.dump
text Keluaran
NOTICE:  database "uji_pulih" does not exist, skipping
DROP DATABASE
CREATE DATABASE
 anggota | buku
---------+------
       5 |    8
(1 row)

DROP DATABASE

Kedua jumlah barisnya cocok dengan sumbernya, dan inilah bukti pemulihan yang diminta prinsip awal topik ini. pg_restore menerima opsi seleksi seperti -t nama_tabel dan -j untuk pekerjaan paralel pada cadangan besar, keleluasaan yang hanya dimiliki format khusus.

Cadangan teks polos dan pilihannya#

Tanpa -Fc, pg_dump menulis teks SQL polos yang dipulihkan dengan psql, bentuk yang terbaca manusia dan nyaman untuk penyuntingan kecil, sedangkan format khusus menang untuk ukuran, kecepatan, dan seleksinya. Blok berikut membuat cadangan polos dan menghitung pernyataan pembuatan tabelnya.

bash
# cadangan teks polos dan hitungan isinya
pg_dump -U postgres -d perpustakaan -f /tmp/perpus.sql
grep -c '^CREATE TABLE' /tmp/perpus.sql
rm /tmp/perpus.sql
text Keluaran
13

Cadangan polos dipulihkan dengan psql -d tujuan -f berkas.sql, dan pemilihannya mengikuti kebutuhan, yaitu teks untuk inspeksi dan portabilitas antar versi, khusus untuk ukuran dan pemulihan terpilih. Cadangan seluruh kluster beserta role dan tablespace adalah wilayah pg_dumpall, dan cadangan fisik tingkat kluster adalah wilayah pg_basebackup pada bagian berikutnya.

pg_basebackup dan cadangan fisik#

pg_basebackup menyalin seluruh kluster sebagaimana berada di disk, sehingga hasilnya pulih ke titik waktunya bersama arsip WAL, fondasi strategi pemulihan titik waktu yang dibahas pada topik replikasi. Cadangan fisiknya menyertakan seluruh basis data dalam kluster sekaligus, berbeda dengan pg_dump yang bersifat per basis data dan menghasilkan berkas logis yang lintas versi.

Blok berikut menggambarkan pemanggilannya tanpa dijalankan, karena keluarannya memuat titik WAL yang berubah setiap eksekusi dan ukuran klusternya tergantung lingkungan.

bash
# tidak-dijalankan (keluaran memuat titik WAL dan ukuran yang berubah setiap eksekusi)
# cadangan fisik seluruh kluster ke folder khusus
pg_basebackup -U postgres -D /tmp/bkp-kluster -Fp -Xs -P

Pola cadangan yang sehat menempatkan pg_dump terjadwal sebagai cadangan logis harian dan pg_basebackup sebagai dasar pemulihan bencana, dengan verifikasi pemulihan berkala atas keduanya, kebiasaan yang menjadikan cadangan benar-benar terbukti.

Kesalahan umum#

Kesalahan pertama adalah menjadwalkan cadangan tanpa pernah mengujinya, sehingga berkas yang tampak utuh gagal dipulihkan tepat saat dibutuhkan, dan uji pemulihan berkala menjadi bagian dari prosedur cadangannya. Kesalahan kedua adalah mencadangkan tanpa format khusus pada basis data besar, yang membuat pemulihan parsial dan paralel mustahil.

Kesalahan ketiga adalah mencadangkan hanya tabel tertentu lalu menganggapnya cadangan penuh, padahal skema, urutan, dan hak aksesnya perlu dicantumkan secara sadar. Kesalahan keempat adalah menyimpan cadangan di server yang sama dengan sumbernya, karena kegagalan disk menelan keduanya, dan tujuan cadangan yang berbeda mesin menjadi aturan baku.

Ringkasan#

  • pg_dump mencadangkan satu basis data secara logis tanpa menghentikan pembacaan, dengan -Fc sebagai format pilihan.
  • pg_restore memulihkan cadangan khusus dengan seleksi tabel dan paralelisme, dan setiap pemulihan diverifikasi jumlah barisnya.
  • Cadangan polos adalah teks SQL yang dibaca manusia dan dipulihkan psql, lengkap dengan pertukarannya.
  • pg_basebackup menyalin seluruh kluster secara fisik dan menjadi dasar pemulihan titik waktu, dengan uji pemulihan sebagai bukti.

Referensi#