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:
# -----------------------------
# MEMORI
# -----------------------------
shared_buffers = 128MB
work_mem = 4MB
# -----------------------------
# KONEKSI
# -----------------------------
max_connections = 100Nilai 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:
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:
setting: nilai mentah tanpa satuan.shared_bufferstampil sebagai16384, bukan128MB.unit: satuannya. Nilai16384dengan unit8kBberarti 16384 × 8 kB = 128 MB;checkpoint_timeoutbernilai300dengan unitsberarti 5 menit;work_membernilai4096dengan unitkBberarti 4 MB.- Nilai
-1padalog_min_duration_statementberarti fitur itu mati — banyak parameter durasi memakai-1sebagai penanda disabled. 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:
name | context
-----------------+------------
autovacuum | sighup
block_size | internal
log_statement | superuser
max_connections | postmaster
work_mem | user
(5 rows)Tabel berikut merangkum lima context tersebut:
| Context | Contoh | Perubahan berlaku setelah |
|---|---|---|
internal | block_size | Tidak bisa diubah — dibakar saat kompilasi PostgreSQL |
postmaster | max_connections, shared_buffers | restart server |
sighup | autovacuum, checkpoint_timeout | reload konfigurasi, tanpa memutus klien |
user | work_mem | SET di session sendiri, kapan saja |
superuser | log_statement, deadlock_timeout | SET/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:
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:
ALTER SYSTEM SET maintenance_work_mem = '128MB': menulis entri kepostgresql.auto.conf. Session yang sedang berjalan belum melihat perubahan apa pun sampai langkah kedua dijalankan.SELECT pg_reload_conf() AS muat_ulang, pg_sleep(0.1) AS jeda;: function pertama meminta server membaca ulang seluruh file konfigurasi — setarapg_ctl reloaddari terminal — dan mengembalikantbila sinyalnya diterima. Reload diproses postmaster secara asynchronous, sehinggapg_sleep(0.1)memberi jeda sepersepuluh detik agar pembacaan ulang benar-benar selesai sebelum hasilnya diperiksa.maintenance_work_member-contextuser, jadi nilai baru langsung aktif.sourcedansourcefile: kolom ini mencatat asal nilai sekarang. SetelahSET, sumbernyaconfiguration filedansourcefilemenunjuk kepostgresql.auto.conf.ALTER SYSTEM RESET ...: menghapus entri daripostgresql.auto.confsehingga nilai kembali mengikutipostgresql.confatau bawaan. Baris terakhir membuktikansourcekembali menjadidefaultdan nilainya65536kB (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:
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:
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:
- Kolom
appliedbernilaifpada baristimezonedandefault_text_search_configyang berasal daripostgresql.conf. Penyebabnya, parameter yang sama juga ditulis dipostgresql.auto.conf, dan nilai dari auto.conf menang. Mekanisme prioritas antar file ini kita bedah tuntas di chapter File Konfigurasi PostgreSQL. - 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, memeriksapg_file_settingslebih 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-- 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-- 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-- 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-- 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-- 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';