Server PostgreSQL bukan kotak hitam; seluruh perilakunya — berapa memori yang dipakai, koneksi berapa banyak yang ditampung, di mana data disimpan — dikendalikan oleh pengaturan (parameter) yang nilainya bisa kita baca dan ubah. Sebagai administrator maupun pengembang, kita akan sering perlu menjawab pertanyaan seperti “berapa work_mem di server ini?” atau “berapa koneksi maksimum yang ditampung?”. Chapter ini membahas di mana konfigurasi disimpan, cara membacanya dari dalam SQL, dan cara mengubahnya dengan aman lewat ALTER SYSTEM.

Tiga File Penting dalam Instalasi #

Konfigurasi sebuah cluster PostgreSQL tersebar di beberapa file yang letaknya bisa ditanyakan langsung kepada server. Tiga yang paling sering kita sentuh:

FileIsiKapan diubah
postgresql.confParameter utama server: memori, koneksi, log, dan sebagainyaSaat setup awal atau tuning
pg_hba.confAturan autentikasi koneksi: siapa boleh masuk dengan metode apaSaat mengatur akses user
postgresql.auto.confParameter yang diubah lewat ALTER SYSTEMDikelola server sendiri; jangan diedit tangan

File ketiga sengaja dipisah dari file utama supaya perubahan yang dilakukan lewat perintah SQL tidak tertimpa ketika administrator mengedit postgresql.conf secara manual. Saat server menyala, PostgreSQL membaca keduanya dan menggabungkan isinya.

Lokasi ketiga file itu berbeda-beda tergantung cara instalasi: /etc/postgresql/17/main/ di Ubuntu, /opt/homebrew/var/postgresql@17/ di macOS dengan Homebrew, dan data directory yang kita pilih sendiri di Windows. Karena letaknya berbeda-beda itu, cara paling andal menemukannya adalah bertanya kepada server yang sedang berjalan.

Membaca Konfigurasi dengan SHOW #

Perintah SHOW adalah cara tercepat membaca satu parameter dari dalam SQL. Nama parameter yang dibaca mengikuti penamaan di postgresql.conf, jadi SHOW work_mem; membaca baris work_mem di file konfigurasi. File berikut memakai SHOW untuk menemukan lokasi ketiga file tadi, membaca satu parameter, lalu membaca beberapa parameter sekaligus dari catalog pg_settings:

-- Lokasi file konfigurasi utama server
SHOW config_file;

-- Lokasi file aturan autentikasi koneksi
SHOW hba_file;

-- Lokasi data directory tempat seluruh data tersimpan
SHOW data_directory;

-- Nilai satu parameter secara langsung
SHOW work_mem;

-- Membaca beberapa parameter sekaligus dari catalog server
SELECT name, setting, unit, context
FROM pg_settings
WHERE name IN ('max_connections', 'port', 'shared_buffers', 'work_mem')
ORDER BY name;

Output yang Dihasilkan:

text
                config_file                
-------------------------------------------
 /home/z/my-project/pgdata/postgresql.conf
(1 row)

               hba_file                
---------------------------------------
 /home/z/my-project/pgdata/pg_hba.conf
(1 row)

      data_directory       
---------------------------
 /home/z/my-project/pgdata
(1 row)

 work_mem 
----------
 4MB
(1 row)

      name       | setting | unit |  context   
-----------------+---------+------+------------
 max_connections | 100     |      | postmaster
 port            | 54329   |      | postmaster
 shared_buffers  | 16384   | 8kB  | postmaster
 work_mem        | 4096    | kB   | user
(4 rows)

Empat hasil pertama memperlihatkan pola SHOW: satu parameter, satu nilai. Perlu dicatat bahwa path pada tiga hasil pertama adalah lokasi di lingkungan tempat materi ini diuji — di komputer Anda, lokasi itu mengikuti cara instalasi seperti dibahas di atas.

Hasil terakhir memakai table pg_settings, yaitu catalog yang menyimpan seluruh parameter beserta statusnya. Mari kita bedah kolom-kolomnya:

  1. name dan setting: nama parameter dan nilainya saat ini. Nilai ditampilkan dalam bentuk mentah — work_mem tampil sebagai 4096, bukan 4MB.
  2. unit: satuannya. Nilai 4096 dengan unit kB berarti 4 MB; shared_buffers bernilai 16384 dengan unit 8kB berarti 128 MB. Parameter tanpa unit seperti max_connections dan port memang berupa bilangan polos.
  3. context: bagaimana parameter itu boleh diubah — pembahasan ini ada di subbab berikutnya.

Membaca lewat pg_settings sangat berguna ketika kita ingin membandingkan banyak parameter sekaligus atau memfilternya dengan WHERE, hal yang tidak bisa dilakukan SHOW.

Konteks Parameter: Restart atau Reload #

Kolom context pada pg_settings menentukan kapan perubahan sebuah parameter mulai berlaku. Ini yang sering menjebak pemula: mengubah nilai di file konfigurasi tidak serta-merta mengubah perilaku server yang sedang berjalan.

ContextArtiPerubahan berlaku setelah
postmasterStruktur yang dibangun saat server dinyalakanrestart server
sighupDibaca ulang tanpa memutus koneksireload konfigurasi
userBoleh diubah per session oleh user mana punSET langsung di session

Parameter shared_buffers dan max_connections ber-context postmaster karena memori dan slot koneksi dialokasikan saat server menyala; mengubahnya menuntut restart. Sementara work_mem ber-context user, sehingga setiap session bahkan bisa menaikkannya sendiri untuk query berat tanpa menyentuh file konfigurasi.

Mengubah Konfigurasi dengan ALTER SYSTEM #

Sejak PostgreSQL 9.4 ada cara mengubah parameter tanpa membuka editor teks: ALTER SYSTEM. Perintah ini menulis nilai baru ke postgresql.auto.conf, dan setelah konfigurasi dibaca ulang, nilai baru berlaku di seluruh session. File berikut mendemonstrasikan siklus lengkapnya — mengubah work_mem, memuat ulang, memeriksa hasilnya, lalu mengembalikan nilai bawaan supaya file ini aman dijalankan berulang kali. Karena pg_reload_conf() bersifat asinkron (mengirim sinyal, bukan menunggu selesai), pengembalian nilai di akhir file memakai SET work_mem = DEFAULT yang sinkron di level session:

-- Simpan pengaturan baru lewat ALTER SYSTEM
ALTER SYSTEM SET work_mem = '16MB';

-- Minta semua session membaca ulang konfigurasi.
-- pg_sleep(0.2) memberi waktu bagi server memproses sinyal sebelum
-- nilai dibaca kembali (reload bersifat asinkron).
SELECT pg_reload_conf(), pg_sleep(0.2);

-- Nilai baru kini berlaku di session ini
SHOW work_mem;

-- Kembalikan work_mem ke nilai bawaan
ALTER SYSTEM RESET work_mem;

-- Baca ulang konfigurasi sekali lagi (dengan jeda yang sama)
SELECT pg_reload_conf(), pg_sleep(0.2);

-- Nilai bawaan kembali berlaku untuk session-session baru;
-- session lama bisa sempat masih melihat 16MB karena pemuaian
-- ulang berjalan asinkron (SIGHUP), bukan sinkron.
SET work_mem = DEFAULT;

-- Nilai kembali seperti semula untuk session ini
SHOW work_mem;

Output yang Dihasilkan:

text
ALTER SYSTEM
 pg_reload_conf | pg_sleep 
----------------+----------
 t              | 
(1 row)

 work_mem 
----------
 16MB
(1 row)

ALTER SYSTEM
 pg_reload_conf | pg_sleep 
----------------+----------
 t              | 
(1 row)

SET
 work_mem 
----------
 4MB
(1 row)

Mari kita bedah alur perintah di file tersebut:

  1. ALTER SYSTEM SET work_mem = '16MB': menulis entri work_mem = '16MB' ke postgresql.auto.conf. Sampai di sini, session yang sedang berjalan belum melihat perubahan apa pun.
  2. SELECT pg_reload_conf();: function ini meminta server membaca ulang seluruh file konfigurasi — setara dengan menjalankan pg_ctl reload dari terminal — dan mengembalikan t (benar) bila perintahnya diterima.
  3. SHOW work_mem; pertama: setelah reload, nilai baru 16MB sudah berlaku, termasuk di session yang sedang berjalan, karena work_mem ber-context user.
  4. ALTER SYSTEM RESET work_mem;: menghapus entri work_mem dari postgresql.auto.conf sehingga nilai kembali mengikuti postgresql.conf, yaitu bawaan 4MB. Dua perintah terakhir memuat ulang dan membuktikan nilainya memang kembali.

pg_ctl: Mengelola Proses Server #

Dari sisi terminal, proses server diurus oleh pg_ctl. Perintahnya selalu menyertakan lokasi data directory lewat flag -D:

bash
pg_ctl -D /path/ke/data-directory status
pg_ctl -D /path/ke/data-directory reload
pg_ctl -D /path/ke/data-directory restart

Subperintah reload mengirim sinyal agar konfigurasi dibaca ulang tanpa memutus koneksi yang sedang ada — persis kerja pg_reload_conf() di subbab sebelumnya. Subperintah restart mematikan lalu menyalakan kembali server; ini diperlukan setelah mengubah parameter ber-context postmaster. Di Ubuntu dan macOS tugas serupa sudah terbungkus systemctl dan brew services seperti tabel di chapter instalasi, jadi pg_ctl paling sering kita jumpai pada server tanpa manajer layanan.

Dengan konfigurasi yang kini bisa kita baca dan ubah, satu alat masih belum kita sentuh secara serius: psql. Sejauh ini kita hanya memakainya sebagai pengantar perintah; chapter Menggunakan psql akan membedah meta-command dan kebiasaan kerja yang membuat terminal ini jauh lebih produktif.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

lihat-konfigurasi.sql

Unduh berkas
sql
-- Lokasi file konfigurasi utama server
SHOW config_file;

-- Lokasi file aturan autentikasi koneksi
SHOW hba_file;

-- Lokasi data directory tempat seluruh data tersimpan
SHOW data_directory;

-- Nilai satu parameter secara langsung
SHOW work_mem;

-- Membaca beberapa parameter sekaligus dari catalog server
SELECT name, setting, unit, context
FROM pg_settings
WHERE name IN ('max_connections', 'port', 'shared_buffers', 'work_mem')
ORDER BY name;

ubah-work-mem.sql

Unduh berkas
sql
-- Simpan pengaturan baru lewat ALTER SYSTEM
ALTER SYSTEM SET work_mem = '16MB';

-- Minta semua session membaca ulang konfigurasi.
-- pg_sleep(0.2) memberi waktu bagi server memproses sinyal sebelum
-- nilai dibaca kembali (reload bersifat asinkron).
SELECT pg_reload_conf(), pg_sleep(0.2);

-- Nilai baru kini berlaku di session ini
SHOW work_mem;

-- Kembalikan work_mem ke nilai bawaan
ALTER SYSTEM RESET work_mem;

-- Baca ulang konfigurasi sekali lagi (dengan jeda yang sama)
SELECT pg_reload_conf(), pg_sleep(0.2);

-- Nilai bawaan kembali berlaku untuk session-session baru;
-- session lama bisa sempat masih melihat 16MB karena pemuaian
-- ulang berjalan asinkron (SIGHUP), bukan sinkron.
SET work_mem = DEFAULT;

-- Nilai kembali seperti semula untuk session ini
SHOW work_mem;