Chapter Konfigurasi PostgreSQL Server pada section persiapan sudah memperkenalkan SHOW, pg_settings, dan siklus ALTER SYSTEM secara ringkas. Sekarang kita masuk ke pekerjaan administrasi yang sesungguhnya: membaca parameter secara sistematis, menerjemahkan satuannya, memahami kapan sebuah perubahan benar-benar berlaku, dan memeriksa isi file konfigurasi langsung dari SQL. Keempat keterampilan itu adalah bekal harian setiap administrator PostgreSQL — dari tuning memori sampai memastikan perubahan konfigurasi tidak menuntut restart di jam sibuk.

Anatomi postgresql.conf #

File postgresql.conf berisi baris-baris berpola nama_parameter = nilai. Semua baris yang diawali tanda pagar (#) adalah komentar, dan nilai boleh ditulis dengan satuan yang mudah dibaca manusia:

text
# -----------------------------
# MEMORI
# -----------------------------
shared_buffers = 128MB
work_mem = 4MB

# -----------------------------
# KONEKSI
# -----------------------------
max_connections = 100

Nilai dengan satuan ditulis tanpa spasi (128MB, bukan 128 MB). PostgreSQL mengenali satuan memori (B, kB, MB, GB, TB) dan satuan waktu (ms, s, min, h, d). Bilangan tanpa satuan seperti max_connections = 100 dianggap polos. Satu parameter cukup ditulis satu kali; penulisan ulang membuat nilai yang muncul terakhir menang.

Membaca Parameter dengan SHOW dan pg_settings #

Perintah SHOW menampilkan nilai jadi dalam bentuk yang mudah dibaca, sedangkan table pg_settings menampilkan nilai mentah beserta satuannya terpisah. File berikut membandingkan keduanya:

-- SHOW menampilkan nilai jadi beserta satuannya
SHOW shared_buffers;
SHOW checkpoint_timeout;
SHOW work_mem;

-- pg_settings menyimpan nilai mentah dengan satuan terpisah
SELECT name, setting, unit, context
FROM pg_settings
WHERE name IN ('shared_buffers', 'checkpoint_timeout', 'work_mem',
               'deadlock_timeout', 'log_min_duration_statement',
               'max_connections')
ORDER BY name;

Output yang Dihasilkan:

text
 shared_buffers 
----------------
 128MB
(1 row)

 checkpoint_timeout 
--------------------
 5min
(1 row)

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

            name            | setting | unit |  context   
----------------------------+---------+------+------------
 checkpoint_timeout         | 300     | s    | sighup
 deadlock_timeout           | 1000    | ms   | superuser
 log_min_duration_statement | -1      | ms   | superuser
 max_connections            | 100     |      | postmaster
 shared_buffers             | 16384   | 8kB  | postmaster
 work_mem                   | 4096    | kB   | user
(6 rows)

Tiga hasil pertama memperlihatkan gaya SHOW: satu parameter, satu nilai siap baca. Hasil terakhir dari pg_settings tampak berbeda — mari kita bedah cara membacanya:

  1. setting: nilai mentah tanpa satuan. shared_buffers tampil sebagai 16384, bukan 128MB.
  2. unit: satuannya. Nilai 16384 dengan unit 8kB berarti 16384 × 8 kB = 128 MB; checkpoint_timeout bernilai 300 dengan unit s berarti 5 menit; work_mem bernilai 4096 dengan unit kB berarti 4 MB.
  3. Nilai -1 pada log_min_duration_statement berarti fitur itu mati — banyak parameter durasi memakai -1 sebagai penanda disabled.
  4. context: kapan perubahan parameter boleh mulai berlaku — pokok bahasan subbab berikutnya.

Dengan pola WHERE name IN (...) ORDER BY name, kita bisa membandingkan lusinan parameter sekaligus dan hasilnya selalu terurut — hal yang tidak bisa dilakukan SHOW.

Context Parameter: Kapan Perubahan Berlaku #

Mengubah nilai di file konfigurasi tidak serta-merta mengubah server yang sedang berjalan. Kolom context di pg_settings menentukan momen sebuah perubahan mulai berlaku:

-- Lima context yang paling sering dijumpai di kolom pg_settings
SELECT name, context
FROM pg_settings
WHERE name IN ('block_size', 'max_connections', 'autovacuum',
               'work_mem', 'log_statement')
ORDER BY name;

Output yang Dihasilkan:

text
      name       |  context   
-----------------+------------
 autovacuum      | sighup
 block_size      | internal
 log_statement   | superuser
 max_connections | postmaster
 work_mem        | user
(5 rows)

Tabel berikut merangkum lima context tersebut:

ContextContohPerubahan berlaku setelah
internalblock_sizeTidak bisa diubah — dibakar saat kompilasi PostgreSQL
postmastermax_connections, shared_buffersrestart server
sighupautovacuum, checkpoint_timeoutreload konfigurasi, tanpa memutus klien
userwork_memSET di session sendiri, kapan saja
superuserlog_statement, deadlock_timeoutSET/ALTER SYSTEM oleh superuser

Dua context langka juga ada: backend (diatur saat koneksi dibuka) dan superuser-backend (gabungan keduanya). Yang perlu diingat praktisnya: parameter postmaster menuntut restart karena memorinya dialokasikan saat server menyala, sedangkan parameter user bisa dinaikkan turunkan per session tanpa menyentuh file sama sekali.

Mengubah Parameter dengan ALTER SYSTEM #

ALTER SYSTEM menulis nilai baru ke file postgresql.auto.conf tanpa membuka editor teks. File berikut mendemonstrasikan siklus lengkapnya pada maintenance_work_mem (memori untuk VACUUM, CREATE INDEX, dan ALTER TABLE) — mengubah, memuat ulang, memeriksa sumber nilainya, lalu mengembalikan:

-- Simpan nilai baru ke postgresql.auto.conf
ALTER SYSTEM SET maintenance_work_mem = '128MB';

-- Minta seluruh session membaca ulang konfigurasi, lalu beri jeda
-- supaya proses reload di sisi server benar-benar selesai
SELECT pg_reload_conf() AS muat_ulang, pg_sleep(0.1) AS jeda;

-- Nilai baru aktif dan sumbernya tercatat jelas
SELECT name, setting, source, sourcefile
FROM pg_settings
WHERE name = 'maintenance_work_mem';

-- Kembalikan ke nilai bawaan agar contoh bisa dijalankan ulang
ALTER SYSTEM RESET maintenance_work_mem;
SELECT pg_reload_conf() AS muat_ulang, pg_sleep(0.1) AS jeda;

-- Sumbernya kembali menjadi default
SELECT name, setting, source
FROM pg_settings
WHERE name = 'maintenance_work_mem';

Output yang Dihasilkan:

text
ALTER SYSTEM
 muat_ulang | jeda 
------------+------
 t          | 
(1 row)

         name         | setting |       source       |                   sourcefile                   
----------------------+---------+--------------------+------------------------------------------------
 maintenance_work_mem | 131072  | configuration file | /home/z/my-project/pgdata/postgresql.auto.conf
(1 row)

ALTER SYSTEM
 muat_ulang | jeda 
------------+------
 t          | 
(1 row)

         name         | setting | source  
----------------------+---------+---------
 maintenance_work_mem | 65536   | default
(1 row)

Mari kita bedah alurnya:

  1. ALTER SYSTEM SET maintenance_work_mem = '128MB': menulis entri ke postgresql.auto.conf. Session yang sedang berjalan belum melihat perubahan apa pun sampai langkah kedua dijalankan.
  2. SELECT pg_reload_conf() AS muat_ulang, pg_sleep(0.1) AS jeda;: function pertama meminta server membaca ulang seluruh file konfigurasi — setara pg_ctl reload dari terminal — dan mengembalikan t bila sinyalnya diterima. Reload diproses postmaster secara asynchronous, sehingga pg_sleep(0.1) memberi jeda sepersepuluh detik agar pembacaan ulang benar-benar selesai sebelum hasilnya diperiksa. maintenance_work_mem ber-context user, jadi nilai baru langsung aktif.
  3. source dan sourcefile: kolom ini mencatat asal nilai sekarang. Setelah SET, sumbernya configuration file dan sourcefile menunjuk ke postgresql.auto.conf.
  4. ALTER SYSTEM RESET ...: menghapus entri dari postgresql.auto.conf sehingga nilai kembali mengikuti postgresql.conf atau bawaan. Baris terakhir membuktikan source kembali menjadi default dan nilainya 65536 kB (64 MB).

Menandai Kebutuhan Restart dengan pending_restart #

Bagaimana jika kita mengubah parameter ber-context postmaster? Server yang sedang berjalan tidak akan berubah — tetapi PostgreSQL menandainya lewat kolom pending_restart. File berikut menulis nilai shared_buffers yang berbeda, lalu membatalkannya sebelum restart terjadi:

-- Tulis nilai shared_buffers yang berbeda dari nilai yang sedang berjalan
ALTER SYSTEM SET shared_buffers = '256MB';
SELECT pg_reload_conf() AS muat_ulang, pg_sleep(0.1) AS jeda;

-- Server yang berjalan masih memakai 128 MB; restart ditandai
SELECT name, setting, unit, pending_restart
FROM pg_settings
WHERE name = 'shared_buffers';

-- Batalkan perubahan sebelum server benar-benar direstart
ALTER SYSTEM RESET shared_buffers;
SELECT pg_reload_conf() AS muat_ulang, pg_sleep(0.1) AS jeda;

-- Tanda restart hilang karena isi file kembali sama dengan nilai berjalan
SELECT name, setting, unit, pending_restart
FROM pg_settings
WHERE name = 'shared_buffers';

Output yang Dihasilkan:

text
ALTER SYSTEM
 muat_ulang | jeda 
------------+------
 t          | 
(1 row)

      name      | setting | unit | pending_restart 
----------------+---------+------+-----------------
 shared_buffers | 16384   | 8kB  | t
(1 row)

ALTER SYSTEM
 muat_ulang | jeda 
------------+------
 t          | 
(1 row)

      name      | setting | unit | pending_restart 
----------------+---------+------+-----------------
 shared_buffers | 16384   | 8kB  | f
(1 row)

Perhatikan polanya: setelah reload, setting tetap 16384 (128 MB yang sedang berjalan) tetapi pending_restart bernilai t — pesan bahwa nilai baru di file baru berlaku setelah pg_ctl restart. Setelah RESET dan reload kedua, tanda itu hilang karena isi file kembali cocok dengan nilai yang berjalan. Jeda pg_sleep(0.1) dipakai lagi karena penanda pending_restart baru terpasang setelah postmaster selesai membaca ulang file. Monitor berbasis SQL biasa memakai query WHERE pending_restart untuk mendeteksi server yang menunggu restart tanpa sepengetahuan administratornya.

Melihat Isi File dari SQL: pg_file_settings #

View pg_file_settings memuat setiap entri yang diparse dari file konfigurasi, lengkap dengan file asal dan status penerapannya:

-- Isi file konfigurasi dilihat dari dalam SQL
SELECT name, setting, applied, sourcefile
FROM pg_file_settings
WHERE name IN ('max_connections', 'shared_buffers', 'timezone',
               'default_text_search_config')
ORDER BY name, sourcefile;

Output yang Dihasilkan:

text
            name            |      setting       | applied |                   sourcefile                   
----------------------------+--------------------+---------+------------------------------------------------
 default_text_search_config | pg_catalog.english | t       | /home/z/my-project/pgdata/postgresql.auto.conf
 default_text_search_config | pg_catalog.english | f       | /home/z/my-project/pgdata/postgresql.conf
 max_connections            | 100                | t       | /home/z/my-project/pgdata/postgresql.conf
 shared_buffers             | 128MB              | t       | /home/z/my-project/pgdata/postgresql.conf
 timezone                   | Asia/Jakarta       | t       | /home/z/my-project/pgdata/postgresql.auto.conf
 timezone                   | Etc/UTC            | f       | /home/z/my-project/pgdata/postgresql.conf
(6 rows)

Dua pengamatan penting dari hasilnya:

  1. Kolom applied bernilai f pada baris timezone dan default_text_search_config yang berasal dari postgresql.conf. Penyebabnya, parameter yang sama juga ditulis di postgresql.auto.conf, dan nilai dari auto.conf menang. Mekanisme prioritas antar file ini kita bedah tuntas di chapter File Konfigurasi PostgreSQL.
  2. Kolom error (tidak tampil karena tidak ada masalah) akan terisi pesan galat bila ada baris konfigurasi yang tidak bisa diparse — misalnya nilai tidak valid. Setelah mengedit file secara manual, memeriksa pg_file_settings lebih aman daripada menebak kenapa reload tidak berpengaruh.

Path yang tampil pada kolom sourcefile mengikuti lokasi instalasi di lingkungan tempat materi ini diuji; di server Anda nilainya bisa berbeda, misalnya /etc/postgresql/17/main/ di Ubuntu.

Dari parameter tunggal kita kini naik satu tingkat: memahami file-file yang menyimpan seluruh konfigurasi, urutan prioritas pembacaannya, serta pilihan reload atau restart. Chapter berikutnya, File Konfigurasi PostgreSQL, membahas trio postgresql.conf, pg_hba.conf, dan pg_ident.conf beserta konvensi include dan conf.d.

Referensi #

Berkas Sumber

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

alter-system.sql

Unduh berkas
sql
-- Simpan nilai baru ke postgresql.auto.conf
ALTER SYSTEM SET maintenance_work_mem = '128MB';

-- Minta seluruh session membaca ulang konfigurasi, lalu beri jeda
-- supaya proses reload di sisi server benar-benar selesai
SELECT pg_reload_conf() AS muat_ulang, pg_sleep(0.1) AS jeda;

-- Nilai baru aktif dan sumbernya tercatat jelas
SELECT name, setting, source, sourcefile
FROM pg_settings
WHERE name = 'maintenance_work_mem';

-- Kembalikan ke nilai bawaan agar contoh bisa dijalankan ulang
ALTER SYSTEM RESET maintenance_work_mem;
SELECT pg_reload_conf() AS muat_ulang, pg_sleep(0.1) AS jeda;

-- Sumbernya kembali menjadi default
SELECT name, setting, source
FROM pg_settings
WHERE name = 'maintenance_work_mem';

baca-parameter.sql

Unduh berkas
sql
-- SHOW menampilkan nilai jadi beserta satuannya
SHOW shared_buffers;
SHOW checkpoint_timeout;
SHOW work_mem;

-- pg_settings menyimpan nilai mentah dengan satuan terpisah
SELECT name, setting, unit, context
FROM pg_settings
WHERE name IN ('shared_buffers', 'checkpoint_timeout', 'work_mem',
               'deadlock_timeout', 'log_min_duration_statement',
               'max_connections')
ORDER BY name;

file-settings.sql

Unduh berkas
sql
-- Isi file konfigurasi dilihat dari dalam SQL
SELECT name, setting, applied, sourcefile
FROM pg_file_settings
WHERE name IN ('max_connections', 'shared_buffers', 'timezone',
               'default_text_search_config')
ORDER BY name, sourcefile;

konteks-parameter.sql

Unduh berkas
sql
-- Lima context yang paling sering dijumpai di kolom pg_settings
SELECT name, context
FROM pg_settings
WHERE name IN ('block_size', 'max_connections', 'autovacuum',
               'work_mem', 'log_statement')
ORDER BY name;

pending-restart.sql

Unduh berkas
sql
-- Tulis nilai shared_buffers yang berbeda dari nilai yang sedang berjalan
ALTER SYSTEM SET shared_buffers = '256MB';
SELECT pg_reload_conf() AS muat_ulang, pg_sleep(0.1) AS jeda;

-- Server yang berjalan masih memakai 128 MB; restart ditandai
SELECT name, setting, unit, pending_restart
FROM pg_settings
WHERE name = 'shared_buffers';

-- Batalkan perubahan sebelum server benar-benar direstart
ALTER SYSTEM RESET shared_buffers;
SELECT pg_reload_conf() AS muat_ulang, pg_sleep(0.1) AS jeda;

-- Tanda restart hilang karena isi file kembali sama dengan nilai berjalan
SELECT name, setting, unit, pending_restart
FROM pg_settings
WHERE name = 'shared_buffers';