Web server yang kita rakit pada Chapter Apache HTTP Server sudah bisa melayani halaman, tetapi aplikasi nyata — inventori gudang, data kepegawaian, isi keranjang belanja — membutuhkan tempat penyimpanan yang bertahan lebih lama dari satu request. Pekerjaan itu dipegang database server: sebuah daemon yang mendengarkan di port tertentu, menerima perintah SQL dari klien, lalu menjaga penyimpanan dan konsistensi datanya. Pada Chapter ini kita berkenalan dengan dua keluarga database server paling populer di Linux, PostgreSQL dan MySQL/MariaDB, mulai dari instalasi, model autentikasi, sampai backup dasar. Mesin latihan kita tidak menjalankan daemon database, jadi file konfigurasinya kita bedah lewat fixture, sementara bahasa SQL-nya tetap kita jalankan sungguhan — modul sqlite3 bawaan Python 3 cukup untuk itu.

Peran Database Server #

Database server adalah daemon seperti web server; bedanya protokol dan bahasa yang dijawabnya. PostgreSQL mendengarkan TCP port 5432, sedangkan MySQL dan MariaDB memakai 3306. Klien — biasanya kode aplikasi web, atau program psql/mysql di terminal — membuka koneksi ke port itu, lalu mengirim perintah SQL seperti SELECT dan INSERT. Server yang mengurus sisanya: memeriksa hak akses, menjaga banyak koneksi sekaligus, dan memastikan transaksi tidak saling merusak. Daftar port yang aktif dapat kita periksa dengan ss -tlnp sebagaimana pada Chapter ss dan netstat .

Satu server biasanya menampung banyak database, dan satu database menampung banyak tabel. Dua keluarga besar di Linux punya istilah dan alat yang berbeda untuk pekerjaan yang sama:

AspekPostgreSQLMySQL / MariaDB
Daemonpostgresmysqld / mariadbd
Port TCP bawaan54323306
Klien command linepsqlmysql
Membuat databasecreatedb kantorCREATE DATABASE kantor;
Alat backuppg_dumpmysqldump

MariaDB sendiri adalah fork komunitas dari MySQL yang lahir saat Oracle mengakuisisi Sun Microsystems; keduanya kompatibel di banyak hal, dan paket Debian memakai MariaDB sebagai pilihan bawaan.

Memasang dan Menyalakan PostgreSQL #

Di Debian, PostgreSQL hadir lewat apt install postgresql. Paket ini otomatis membuat satu cluster bernama main — istilah Debian untuk satu instance PostgreSQL beserta datanya — dan mendaftarkannya ke systemd. Alat khusus Debian untuk mengelola cluster: pg_lsclusters untuk melihat status, dan pg_ctlcluster <versi> main start untuk menyalakan atau mematikannya. Perintah berikut memasang lalu membuat database latihan bernama kantor:

bash
sudo apt install postgresql
pg_lsclusters
sudo -u postgres createdb kantor

Instalasi membuat user sistem postgres yang berperan sebagai administrator cluster. Karena itulah baris ketiga dijalankan dengan sudo -u postgres — perintah createdb menyapa server sebagai user postgres. Berikut contoh tampilan sesi psql setelah database kantor berisi tabel karyawan:

console
$ sudo -u postgres psql kantor
psql (17.5 (Debian 17.5-1))
Type "help" for help.

kantor=# SELECT nama, umur FROM karyawan ORDER BY umur;
 nama  | umur
-------+------
 Ayu   |   26
 Budi  |   29
 Siti  |   34
(3 rows)

Prompt kantor=# menandakan database aktif; \q keluar dari sesi. Tabel yang sama persis akan kita bangun sendiri lewat Python beberapa bagian ke bawah.

pg_hba.conf: Gerbang Autentikasi #

Setiap koneksi yang datang diperiksa PostgreSQL terhadap file pg_hba.conf sebelum diminta password sekalipun. File ini dibaca dari atas ke bawah, dan baris pertama yang cocok yang menang — urutan menentukan hasil. File fixture berikut ada di bundle materi ini sebagai pg_hba.conf:

bash
cat pg_hba.conf

Output yang Dihasilkan:

text
# TYPE  DATABASE  USER      ADDRESS         METHOD
local   all       postgres                  peer
local   all       all                       scram-sha-256
host    all       all       127.0.0.1/32    scram-sha-256
host    all       all       192.0.2.0/24    scram-sha-256
host    all       all       ::1/128         scram-sha-256

Mari kita bedah arti tiap barisnya:

  1. local all postgres peer: koneksi lewat Unix socket (kolom TYPE local) dari user postgres diperiksa metode peer — sistem operasi memastikan nama user yang menjalankan klien memang postgres, tanpa password.
  2. local all all scram-sha-256: koneksi socket user lain harus membuktikan diri lewat password yang di-hash dengan SCRAM.
  3. host all all 127.0.0.1/32 scram-sha-256: koneksi TCP dari loopback IPv4; kolom ADDRESS membatasi sumber koneksi.
  4. host all all 192.0.2.0/24 scram-sha-256: koneksi TCP dari jaringan kantor — jarak jangkauan server dipersempit sejak gerbang pertama.
  5. host all all ::1/128 scram-sha-256: pasangan IPv6 dari baris loopback.

Audit cepat isi file ini bisa dikerjakan awk — kolom terakhir tiap baris aktif adalah metode autentikasinya:

bash
echo '== metode autentikasi yang dipakai =='
awk '!/^[[:space:]]*#/ && NF {print $NF}' pg_hba.conf | sort | uniq -c
echo '== sumber koneksi TCP yang diizinkan =='
awk '$1 == "host" {print $4}' pg_hba.conf

Output yang Dihasilkan:

text
== metode autentikasi yang dipakai ==
      1 peer
      4 scram-sha-256
== sumber koneksi TCP yang diizinkan ==
127.0.0.1/32
192.0.2.0/24
::1/128

MySQL dan MariaDB: Jalur Lain #

Instalasi MariaDB di Debian berjalan lewat apt install mariadb-server. Berbeda dengan PostgreSQL, akun root bawaannya diautentikasi lewat unix_socket: hanya user sistem root yang boleh masuk tanpa password. Sesi berikut membuat database, user aplikasi, lalu menganugerahkan hak aksesnya — pola GRANT yang juga berlaku di MySQL:

console
$ sudo mysql -u root
MariaDB [(none)]> CREATE DATABASE aplikasi;
MariaDB [(none)]> CREATE USER 'budi'@'localhost' IDENTIFIED BY 'CONTOH_PASSWORD_KUAT';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON aplikasi.* TO 'budi'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;

Tanda 'budi'@'localhost' membatasi user tersebut hanya boleh terhubung dari mesin yang sama; ganti dengan 'budi'@'192.0.2.0/255.255.255.0' bila aplikasi berjalan di server lain. Prinsipnya sama dengan pg_hba.conf di PostgreSQL: hak akses ditolak sejak gerbang, sebelum menyentuh data.

SQL yang Bisa Kita Jalankan Hari Ini #

Kita tidak bisa memasang server database di mesin latihan, tetapi bahasanya tidak boleh luput. Modul sqlite3 bawaan Python 3 menjalankan SQL asli tanpa daemon — SQLite menyimpan seluruh database dalam satu file. Blok berikut membuat tabel karyawan, mengisinya tiga baris, lalu membacanya kembali:

bash
python3 - <<'PY'
import sqlite3

con = sqlite3.connect("kantor.db")
cur = con.cursor()
cur.execute("CREATE TABLE karyawan (id INTEGER PRIMARY KEY, nama TEXT, umur INTEGER)")
cur.executemany("INSERT INTO karyawan (nama, umur) VALUES (?, ?)",
                [("Budi", 29), ("Siti", 34), ("Ayu", 26)])
con.commit()

print("== isi tabel, diurutkan umur ==")
for nama, umur in cur.execute("SELECT nama, umur FROM karyawan ORDER BY umur"):
    print(f"{nama:<5} {umur}")

print("== agregasi ==")
jumlah, rata = cur.execute("SELECT COUNT(*), AVG(umur) FROM karyawan").fetchone()
print(f"jumlah baris : {jumlah}")
print(f"rata-rata    : {rata:.1f}")
con.close()
PY

Output yang Dihasilkan:

text
== isi tabel, diurutkan umur ==
Ayu   26
Budi  29
Siti  34
== agregasi ==
jumlah baris : 3
rata-rata    : 29.7

Mari kita bedah baris per baris:

  1. import sqlite3: memuat modul bawaan Python yang menyediakan database SQL dalam satu file — tidak ada daemon, tidak ada port.
  2. sqlite3.connect("kantor.db"): membuka (atau membuat) file database di direktori kerja; bandingkan dengan psql kantor yang justru menghubungi server di port 5432.
  3. cur.execute("CREATE TABLE ..."): mendefinisikan struktur tabel: id kunci utama yang menomori diri sendiri, nama teks, umur bilangan.
  4. cur.executemany("INSERT ...", [...]): memasukkan tiga baris sekaligus; tanda ? adalah parameter yang diisi aman oleh pustaka, bukan digabung jadi satu string — kebiasaan yang mencegah SQL injection.
  5. con.commit(): mengukuhkan transaksi — tanpa ini, perubahan hilang saat koneksi ditutup.
  6. SELECT ... ORDER BY umur: membaca kembali data yang sudah terurut; hasilnya diulang dengan for dan dicetak rata kolom lewat format :<5.
  7. SELECT COUNT(*), AVG(umur): agregasi dilakukan server-side (di SQLite), dan .fetchone() mengambil satu baris hasilnya.

Backup Dasar: pg_dump dan mysqldump #

Kedua keluarga server menyediakan alat backup yang mengeluarkan seluruh database menjadi satu file. pg_dump -Fc kantor > kantor.dump menghasilkan format khusus PostgreSQL yang terkompresi dan dipulihkan dengan pg_restore -d kantor kantor.dump; mysqldump aplikasi > aplikasi.sql menghasilkan file SQL polos yang bisa diputar ulang dengan mysql aplikasi < aplikasi.sql. Terakhir, pg_dumpall mengamankan seluruh cluster termasuk definisi user — jadwalkan dengan systemd timer atau cron sebagaimana dibahas di Chapter systemd timers .

Data kini punya rumah yang rapi di server. Rumah berikutnya yang perlu kita bangun adalah tempat file kerja bersama — folder yang dipakai seluruh tim lewat jaringan — dan pemetaan opsinya kita mulai pada Chapter File Server .

Referensi lanjut: wiki Debian tentang PostgreSQL , halaman manual psql(1) , serta dokumentasi database Ubuntu Server .