Di keluarga backup logis, pg_dump adalah kuda beban yang paling sering dipakai setiap hari administrator PostgreSQL. Alat ini menghubungkan diri ke satu database, membaca seluruh objek dan datanya, lalu menuliskan hasilnya ke file — sebagai teks SQL polos atau sebagai arsip terkompresi yang hanya bisa dibuka pg_restore. Dalam chapter ini kita memakai pg_dump dari bentuk paling sederhana sampai pola yang layak masuk cron: dump seluruh database, pilihan format plain versus custom, penyaringan per tabel, pemisahan skema dan data, sampai pemeriksaan exit code yang membedakan backup yang berhasil dari yang diam-diam gagal.
Basis Data Latihan #
Seluruh contoh chapter ini berjalan di atas tiga tabel Toko Maju Jaya yang berelasi — produk, pelanggan, dan pesanan — dengan data tetap agar setiap keluaran bisa dibandingkan:
-- Data latihan Toko Maju Jaya: tiga tabel berelasi.
CREATE TABLE produk (
id integer PRIMARY KEY,
nama varchar(40),
harga numeric(10,2)
);
INSERT INTO produk (id, nama, harga) VALUES
(1, 'Kopi Gayo 250g', 45000),
(2, 'Teh Melati 100g', 15000),
(3, 'Gula Aren 500g', 32000),
(4, 'Beras Pandan 1kg', 68000),
(5, 'Susu Kental 375g', 21000);
CREATE TABLE pelanggan (
id integer PRIMARY KEY,
nama varchar(40),
email varchar(60)
);
INSERT INTO pelanggan (id, nama, email) VALUES
(1, 'Budi Santoso', '[email protected]'),
(2, 'Siti Aminah', '[email protected]'),
(3, 'Rina Wijaya', '[email protected]');
CREATE TABLE pesanan (
id integer PRIMARY KEY,
pelanggan_id integer REFERENCES pelanggan(id),
produk_id integer REFERENCES produk(id),
qty integer
);
INSERT INTO pesanan (id, pelanggan_id, produk_id, qty) VALUES
(101, 1, 1, 2),
(102, 2, 3, 1),
(103, 1, 4, 5),
(104, 3, 2, 3);
SELECT (SELECT count(*) FROM produk) AS jumlah_produk,
(SELECT count(*) FROM pelanggan) AS jumlah_pelanggan,
(SELECT count(*) FROM pesanan) AS jumlah_pesanan;Output yang Dihasilkan:
CREATE TABLE
INSERT 0 5
CREATE TABLE
INSERT 0 3
CREATE TABLE
INSERT 0 4
jumlah_produk | jumlah_pelanggan | jumlah_pesanan
---------------+------------------+----------------
5 | 3 | 4
(1 row)Bentuk Paling Dasar: Dump Sebagai File SQL #
Perintah minimal pg_dump hanya butuh nama database dan sebuah file keluaran. Seperti psql, pg_dump membaca PGHOST, PGPORT, PGUSER, dan PGDATABASE dari lingkungan, sehingga skrip portabel cukup memakai "$PGDATABASE":
#!/bin/bash
# Bentuk paling dasar: dump seluruh database sebagai file SQL (format plain).
pg_dump "$PGDATABASE" > backup_latihan.sql
# Bagian pembuka file dump.
# Baris \restrict berisi token acak (pengaman psql), kita saring dulu.
sed -n '1,8p' backup_latihan.sql | grep -v 'restrict'
# Ukuran file: jumlah baris dan jumlah byte.
wc -l backup_latihan.sql
wc -c backup_latihan.sqlOutput yang Dihasilkan:
--
-- PostgreSQL database dump
--
-- Dumped from database version 17.11 (Debian 17.11-0+deb13u1)
-- Dumped by pg_dump version 17.11 (Debian 17.11-0+deb13u1)
147 backup_latihan.sql
3211 backup_latihan.sqlMari bedah skrip dan keluarannya baris per baris:
pg_dump "$PGDATABASE" > backup_latihan.sql: tanpa opsi-F,pg_dumpmemakai format plain — teks SQL murni yang kelak dipulihkan denganpsql -f. Operator>mengarahkan keluaran standar ke file, pola yang sama dengan menyalin keluaran program CLI apa pun.sed -n '1,8p' ... | grep -v 'restrict': delapan baris pertama file ditampilkan setelah baris\restrictdisaring. Baris tersebut berisi token acak yang disisipkan sejak PostgreSQL 17.6 sebagai pengaman agar nama objek jahat tidak bisa menyusup perintah meta psql saat dump diputar ulang — dua dump dari data yang sama karenanya tidak pernah identik byte demi byte, meski bagian berartinya selalu sama.- Baris komentar
-- Dumped from database version ...: dua baris ini merekam versi server sumber dan versi alatpg_dump— informasi pertama yang diperiksa saat restore lintas versi bermasalah. wc -ldanwc -c: 147 baris dan 3211 byte untuk tiga tabel ini. Jumlah ini tetap stabil untuk data yang sama; setelah baris pembuka, file berlanjut dengan belasan barisSET, laluCREATE TABLEtiap objek,COPYtiap tabel berisi data, dan penutup constraint.
Format custom: Satu File Terkompresi untuk pg_restore #
Opsi -Fc mengganti format keluaran menjadi custom: satu file biner terkompresi yang menyimpan daftar isi, dipulihkan dengan pg_restore, dan bisa diambil sebagian (per tabel) saat restore. Opsi -f menunjuk nama file keluaran — setara dengan operator > tetapi lebih eksplisit:
#!/bin/bash
# Format custom (-Fc): satu file terkompresi, dipulihkan dengan pg_restore.
pg_dump -Fc "$PGDATABASE" -f backup_latihan.dump
# Ukuran file SQL plain (deterministik); ukuran file custom tidak
# ditampilkan karena format custom menyisipkan stempel waktu pembuatan.
wc -c backup_latihan.sql
# Lima byte pertama file custom adalah tanda tangan format: PGDMP.
head -c 5 backup_latihan.dump
echoOutput yang Dihasilkan:
3211 backup_latihan.sql
PGDMPDua hal menarik dari keluarannya. Pertama, tanda tangan PGDMP — lima byte pertama setiap file format custom — cara cepat memastikan sebuah file misterius memang arsip pg_dump dan bukan file teks. Kedua, ukurannya: file custom justru biasanya lebih besar daripada plain untuk data sekecil ini — overhead struktur arsip belum terbayar kompresi pada data yang cuma beberapa kilobyte. (Ukuran byte file custom tidak ditampilkan karena format itu menyisipkan stempel waktu pembuatan, sehingga ukurannya bergeser beberapa byte antar eksekusi walau isinya identik.) Pada database berukuran ratusan megabyte ke atas, perbandingannya berbalik jauh — kompresi bawaan (gzip) bisa memangkas ukuran drastis, dan tingkatnya bisa diatur dengan -Z, misalnya -Z 9 untuk tingkat maksimal atau -Z 0 untuk tanpa kompresi.
Menyaring dan Memilah Isi Dump #
Database produksi sering berisi campuran tabel yang sangat penting dan tabel staging yang tidak. pg_dump menyediakan beberapa keran penyaringan:
#!/bin/bash
# --table: hanya tabel yang cocok dengan pola yang ikut diambil.
pg_dump "$PGDATABASE" --table produk > backup_produk.sql
grep -E '^(CREATE TABLE|COPY )' backup_produk.sql
# --schema-only: struktur tanpa data.
pg_dump "$PGDATABASE" --schema-only > skema_saja.sql
echo "CREATE TABLE di skema_saja.sql: $(grep -c '^CREATE TABLE' skema_saja.sql)"
# --data-only: data tanpa struktur.
pg_dump "$PGDATABASE" --data-only > data_saja.sql
echo "COPY di data_saja.sql : $(grep -c '^COPY ' data_saja.sql)"Output yang Dihasilkan:
CREATE TABLE public.produk (
COPY public.produk (id, nama, harga) FROM stdin;
CREATE TABLE di skema_saja.sql: 3
COPY di data_saja.sql : 3Bedah tiga keran penyaringannya:
--table produk: hanya tabelprodukyang ikut — keluarannya berisiCREATE TABLE public.produkdanCOPY public.produktunggal. Nilai--tableadalah pola yang dipahaminya:--table 'pe*'mengambil semua tabel berawalanpe, dan opsi bisa diulang (--table produk --table pelanggan) untuk beberapa tabel sekaligus. Kerabatnya--exclude-tablejustru membuang tabel tertentu.--schema-only: fileskema_saja.sqlberisi 3CREATE TABLE— seluruh struktur — tanpa satu punCOPY. Berguna untuk menduplikasi struktur ke database uji tanpa memindahkan data rahasia.--data-only: kebalikannya —data_saja.sqlberisi 3 blokCOPYtanpaCREATE TABLE. Berguna untuk mengisi ulang tabel yang strukturnya sudah ada.
Exit Code: Backup yang Gagal Diam-diam #
pg_dump yang gagal jarang berteriak — server mati, database salah nama, atau disk penuh membuat file keluaran kosong atau setengah jadi. Satu-satunya sinyal yang bisa dipercaya skrip adalah exit code: 0 berarti dump tuntas, bukan nol berarti gagal:
#!/bin/bash
# Skrip backup yang bisa dipercaya memeriksa exit code setiap langkahnya.
pg_isready -q || { echo "server tidak siap"; exit 1; }
# pg_dump yang sukses dan yang gagal dibedakan lewat exit code.
pg_dump "$PGDATABASE" > /dev/null
echo "exit (database ada) : $?"
pg_dump --dbname db_tidak_ada > /dev/null 2>&1
echo "exit (database tak ada) : $?"
# Pola untuk skrip cron: gagal = berhenti, jangan lanjut.
if ! pg_dump "$PGDATABASE" -f backup_harian.sql; then
echo "backup GAGAL - jangan hapus backup lama"
exit 1
fi
echo "backup OK - aman mengganti backup lama"Output yang Dihasilkan:
exit (database ada) : 0
exit (database tak ada) : 1
backup OK - aman mengganti backup lamaEmpat baris pertama menunjukkan pola pagar sebelum gerbang: pg_isready -q memastikan server hidup sebelum apa pun dikerjakan, dan || { ...; exit 1; } menghentikan skrip saat pemeriksaan gagal. Dua perbandingan berikutnya memperlihatkan exit code 0 versus 1 — nama database yang tidak ada cukup untuk membuat pg_dump gagal tanpa meninggalkan file. Blok if ! pg_dump ... adalah kerangka minimal skrip cron yang sehat: hanya tindak lanjut (menghapus backup lama, mengirim notifikasi sukses) yang berjalan setelah dump benar-benar berhasil.
Di Mana Dump Itu Dijalankan #
Satu fakta yang sering mengejutkan: pg_dump adalah program client. File hasilnya ditulis di mesin tempat perintah dijalankan, bukan di server — dan koneksi memakai jalur jaringan biasa lewat libpq (PGHOST bisa berupa nama host remote). Konsekuensinya berguna dua arah: dump bisa diambil dari laptop administrator dan langsung tersimpan di laptop itu tanpa menyentuh disk server, tetapi seluruh data mengalir melalui jaringan — pastikan jalurnya terenkripsi (TLS) bila lintas jaringan publik, dan ingat bahwa dump berisi seluruh isi tabel Anda.
Dengan pg_dump di tangan, satu lapis kebutuhan sudah terjawab: isi tiap database bisa dicadangkan kapan pun. Namun seperti dibuktikan di chapter Logical Backup
, dump per-database tidak memindahkan role, kata sandi, maupun daftar database itu sendiri. Untuk lapisan cluster itulah pg_dumpall berdiri — chapter berikutnya.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
backup_harian.sql
Unduh berkas--
-- PostgreSQL database dump
--
\restrict mXCUgZrtiYQROr5erkrK7CcYn32GtgTsXFGsh7NtVfvqMq4bPjGIk4iaSamUQpJ
-- Dumped from database version 17.11 (Debian 17.11-0+deb13u1)
-- Dumped by pg_dump version 17.11 (Debian 17.11-0+deb13u1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET transaction_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: pelanggan; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.pelanggan (
id integer NOT NULL,
nama character varying(40),
email character varying(60)
);
ALTER TABLE public.pelanggan OWNER TO postgres;
--
-- Name: pesanan; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.pesanan (
id integer NOT NULL,
pelanggan_id integer,
produk_id integer,
qty integer
);
ALTER TABLE public.pesanan OWNER TO postgres;
--
-- Name: produk; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.produk (
id integer NOT NULL,
nama character varying(40),
harga numeric(10,2)
);
ALTER TABLE public.produk OWNER TO postgres;
--
-- Data for Name: pelanggan; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.pelanggan (id, nama, email) FROM stdin;
1 Budi Santoso budi@example.com
2 Siti Aminah siti@example.com
3 Rina Wijaya rina@example.com
\.
--
-- Data for Name: pesanan; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.pesanan (id, pelanggan_id, produk_id, qty) FROM stdin;
101 1 1 2
102 2 3 1
103 1 4 5
104 3 2 3
\.
--
-- Data for Name: produk; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.produk (id, nama, harga) FROM stdin;
1 Kopi Gayo 250g 45000.00
2 Teh Melati 100g 15000.00
3 Gula Aren 500g 32000.00
4 Beras Pandan 1kg 68000.00
5 Susu Kental 375g 21000.00
\.
--
-- Name: pelanggan pelanggan_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pelanggan
ADD CONSTRAINT pelanggan_pkey PRIMARY KEY (id);
--
-- Name: pesanan pesanan_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pesanan
ADD CONSTRAINT pesanan_pkey PRIMARY KEY (id);
--
-- Name: produk produk_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.produk
ADD CONSTRAINT produk_pkey PRIMARY KEY (id);
--
-- Name: pesanan pesanan_pelanggan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pesanan
ADD CONSTRAINT pesanan_pelanggan_id_fkey FOREIGN KEY (pelanggan_id) REFERENCES public.pelanggan(id);
--
-- Name: pesanan pesanan_produk_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pesanan
ADD CONSTRAINT pesanan_produk_id_fkey FOREIGN KEY (produk_id) REFERENCES public.produk(id);
--
-- PostgreSQL database dump complete
--
\unrestrict mXCUgZrtiYQROr5erkrK7CcYn32GtgTsXFGsh7NtVfvqMq4bPjGIk4iaSamUQpJ
backup_latihan.sql
Unduh berkas--
-- PostgreSQL database dump
--
\restrict VvUPHK299B4P0bmv55E44pb8UlajkM6IyUF49vJzgnpV3YlyguYQPEkXZ4apdiV
-- Dumped from database version 17.11 (Debian 17.11-0+deb13u1)
-- Dumped by pg_dump version 17.11 (Debian 17.11-0+deb13u1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET transaction_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: pelanggan; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.pelanggan (
id integer NOT NULL,
nama character varying(40),
email character varying(60)
);
ALTER TABLE public.pelanggan OWNER TO postgres;
--
-- Name: pesanan; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.pesanan (
id integer NOT NULL,
pelanggan_id integer,
produk_id integer,
qty integer
);
ALTER TABLE public.pesanan OWNER TO postgres;
--
-- Name: produk; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.produk (
id integer NOT NULL,
nama character varying(40),
harga numeric(10,2)
);
ALTER TABLE public.produk OWNER TO postgres;
--
-- Data for Name: pelanggan; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.pelanggan (id, nama, email) FROM stdin;
1 Budi Santoso budi@example.com
2 Siti Aminah siti@example.com
3 Rina Wijaya rina@example.com
\.
--
-- Data for Name: pesanan; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.pesanan (id, pelanggan_id, produk_id, qty) FROM stdin;
101 1 1 2
102 2 3 1
103 1 4 5
104 3 2 3
\.
--
-- Data for Name: produk; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.produk (id, nama, harga) FROM stdin;
1 Kopi Gayo 250g 45000.00
2 Teh Melati 100g 15000.00
3 Gula Aren 500g 32000.00
4 Beras Pandan 1kg 68000.00
5 Susu Kental 375g 21000.00
\.
--
-- Name: pelanggan pelanggan_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pelanggan
ADD CONSTRAINT pelanggan_pkey PRIMARY KEY (id);
--
-- Name: pesanan pesanan_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pesanan
ADD CONSTRAINT pesanan_pkey PRIMARY KEY (id);
--
-- Name: produk produk_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.produk
ADD CONSTRAINT produk_pkey PRIMARY KEY (id);
--
-- Name: pesanan pesanan_pelanggan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pesanan
ADD CONSTRAINT pesanan_pelanggan_id_fkey FOREIGN KEY (pelanggan_id) REFERENCES public.pelanggan(id);
--
-- Name: pesanan pesanan_produk_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pesanan
ADD CONSTRAINT pesanan_produk_id_fkey FOREIGN KEY (produk_id) REFERENCES public.produk(id);
--
-- PostgreSQL database dump complete
--
\unrestrict VvUPHK299B4P0bmv55E44pb8UlajkM6IyUF49vJzgnpV3YlyguYQPEkXZ4apdiV
backup_produk.sql
Unduh berkas--
-- PostgreSQL database dump
--
\restrict S15UYWNOhhL1tz2dh8W5xIr0q6UaZec3g4LnF4aCM6pcvWJEEy4hPxPfFBwUf6p
-- Dumped from database version 17.11 (Debian 17.11-0+deb13u1)
-- Dumped by pg_dump version 17.11 (Debian 17.11-0+deb13u1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET transaction_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: produk; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.produk (
id integer NOT NULL,
nama character varying(40),
harga numeric(10,2)
);
ALTER TABLE public.produk OWNER TO postgres;
--
-- Data for Name: produk; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.produk (id, nama, harga) FROM stdin;
1 Kopi Gayo 250g 45000.00
2 Teh Melati 100g 15000.00
3 Gula Aren 500g 32000.00
4 Beras Pandan 1kg 68000.00
5 Susu Kental 375g 21000.00
\.
--
-- Name: produk produk_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.produk
ADD CONSTRAINT produk_pkey PRIMARY KEY (id);
--
-- PostgreSQL database dump complete
--
\unrestrict S15UYWNOhhL1tz2dh8W5xIr0q6UaZec3g4LnF4aCM6pcvWJEEy4hPxPfFBwUf6p
cek-status.sh
Unduh berkas#!/bin/bash
# Skrip backup yang bisa dipercaya memeriksa exit code setiap langkahnya.
pg_isready -q || { echo "server tidak siap"; exit 1; }
# pg_dump yang sukses dan yang gagal dibedakan lewat exit code.
pg_dump "$PGDATABASE" > /dev/null
echo "exit (database ada) : $?"
pg_dump --dbname db_tidak_ada > /dev/null 2>&1
echo "exit (database tak ada) : $?"
# Pola untuk skrip cron: gagal = berhenti, jangan lanjut.
if ! pg_dump "$PGDATABASE" -f backup_harian.sql; then
echo "backup GAGAL - jangan hapus backup lama"
exit 1
fi
echo "backup OK - aman mengganti backup lama"
data_saja.sql
Unduh berkas--
-- PostgreSQL database dump
--
\restrict bpsmfKCSkSNSzyjvpBOP2gHvjB3ze6a1etVc4Uhyfh8p7gnVWKXy3gKoc60nsmr
-- Dumped from database version 17.11 (Debian 17.11-0+deb13u1)
-- Dumped by pg_dump version 17.11 (Debian 17.11-0+deb13u1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET transaction_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
--
-- Data for Name: pelanggan; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.pelanggan (id, nama, email) FROM stdin;
1 Budi Santoso budi@example.com
2 Siti Aminah siti@example.com
3 Rina Wijaya rina@example.com
\.
--
-- Data for Name: produk; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.produk (id, nama, harga) FROM stdin;
1 Kopi Gayo 250g 45000.00
2 Teh Melati 100g 15000.00
3 Gula Aren 500g 32000.00
4 Beras Pandan 1kg 68000.00
5 Susu Kental 375g 21000.00
\.
--
-- Data for Name: pesanan; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.pesanan (id, pelanggan_id, produk_id, qty) FROM stdin;
101 1 1 2
102 2 3 1
103 1 4 5
104 3 2 3
\.
--
-- PostgreSQL database dump complete
--
\unrestrict bpsmfKCSkSNSzyjvpBOP2gHvjB3ze6a1etVc4Uhyfh8p7gnVWKXy3gKoc60nsmr
dump-custom.sh
Unduh berkas#!/bin/bash
# Format custom (-Fc): satu file terkompresi, dipulihkan dengan pg_restore.
pg_dump -Fc "$PGDATABASE" -f backup_latihan.dump
# Ukuran file SQL plain (deterministik); ukuran file custom tidak
# ditampilkan karena format custom menyisipkan stempel waktu pembuatan.
wc -c backup_latihan.sql
# Lima byte pertama file custom adalah tanda tangan format: PGDMP.
head -c 5 backup_latihan.dump
echo
dump-plain.sh
Unduh berkas#!/bin/bash
# Bentuk paling dasar: dump seluruh database sebagai file SQL (format plain).
pg_dump "$PGDATABASE" > backup_latihan.sql
# Bagian pembuka file dump.
# Baris \restrict berisi token acak (pengaman psql), kita saring dulu.
sed -n '1,8p' backup_latihan.sql | grep -v 'restrict'
# Ukuran file: jumlah baris dan jumlah byte.
wc -l backup_latihan.sql
wc -c backup_latihan.sql
opsi-filter.sh
Unduh berkas#!/bin/bash
# --table: hanya tabel yang cocok dengan pola yang ikut diambil.
pg_dump "$PGDATABASE" --table produk > backup_produk.sql
grep -E '^(CREATE TABLE|COPY )' backup_produk.sql
# --schema-only: struktur tanpa data.
pg_dump "$PGDATABASE" --schema-only > skema_saja.sql
echo "CREATE TABLE di skema_saja.sql: $(grep -c '^CREATE TABLE' skema_saja.sql)"
# --data-only: data tanpa struktur.
pg_dump "$PGDATABASE" --data-only > data_saja.sql
echo "COPY di data_saja.sql : $(grep -c '^COPY ' data_saja.sql)"
siapkan-latihan.sql
Unduh berkas-- Data latihan Toko Maju Jaya: tiga tabel berelasi.
CREATE TABLE produk (
id integer PRIMARY KEY,
nama varchar(40),
harga numeric(10,2)
);
INSERT INTO produk (id, nama, harga) VALUES
(1, 'Kopi Gayo 250g', 45000),
(2, 'Teh Melati 100g', 15000),
(3, 'Gula Aren 500g', 32000),
(4, 'Beras Pandan 1kg', 68000),
(5, 'Susu Kental 375g', 21000);
CREATE TABLE pelanggan (
id integer PRIMARY KEY,
nama varchar(40),
email varchar(60)
);
INSERT INTO pelanggan (id, nama, email) VALUES
(1, 'Budi Santoso', '[email protected]'),
(2, 'Siti Aminah', '[email protected]'),
(3, 'Rina Wijaya', '[email protected]');
CREATE TABLE pesanan (
id integer PRIMARY KEY,
pelanggan_id integer REFERENCES pelanggan(id),
produk_id integer REFERENCES produk(id),
qty integer
);
INSERT INTO pesanan (id, pelanggan_id, produk_id, qty) VALUES
(101, 1, 1, 2),
(102, 2, 3, 1),
(103, 1, 4, 5),
(104, 3, 2, 3);
SELECT (SELECT count(*) FROM produk) AS jumlah_produk,
(SELECT count(*) FROM pelanggan) AS jumlah_pelanggan,
(SELECT count(*) FROM pesanan) AS jumlah_pesanan;
skema_saja.sql
Unduh berkas--
-- PostgreSQL database dump
--
\restrict LHFYlwSoQ5I4m8oBkJhU7hELlpudgv4yDR4ZoVjCdEx8CAIXGDDjlJPQXxbkAKi
-- Dumped from database version 17.11 (Debian 17.11-0+deb13u1)
-- Dumped by pg_dump version 17.11 (Debian 17.11-0+deb13u1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET transaction_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: pelanggan; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.pelanggan (
id integer NOT NULL,
nama character varying(40),
email character varying(60)
);
ALTER TABLE public.pelanggan OWNER TO postgres;
--
-- Name: pesanan; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.pesanan (
id integer NOT NULL,
pelanggan_id integer,
produk_id integer,
qty integer
);
ALTER TABLE public.pesanan OWNER TO postgres;
--
-- Name: produk; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.produk (
id integer NOT NULL,
nama character varying(40),
harga numeric(10,2)
);
ALTER TABLE public.produk OWNER TO postgres;
--
-- Name: pelanggan pelanggan_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pelanggan
ADD CONSTRAINT pelanggan_pkey PRIMARY KEY (id);
--
-- Name: pesanan pesanan_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pesanan
ADD CONSTRAINT pesanan_pkey PRIMARY KEY (id);
--
-- Name: produk produk_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.produk
ADD CONSTRAINT produk_pkey PRIMARY KEY (id);
--
-- Name: pesanan pesanan_pelanggan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pesanan
ADD CONSTRAINT pesanan_pelanggan_id_fkey FOREIGN KEY (pelanggan_id) REFERENCES public.pelanggan(id);
--
-- Name: pesanan pesanan_produk_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pesanan
ADD CONSTRAINT pesanan_produk_id_fkey FOREIGN KEY (produk_id) REFERENCES public.produk(id);
--
-- PostgreSQL database dump complete
--
\unrestrict LHFYlwSoQ5I4m8oBkJhU7hELlpudgv4yDR4ZoVjCdEx8CAIXGDDjlJPQXxbkAKi