Linux : MariaDB Dasar (Cara Kerja Database Server): Difference between revisions

Artikel baru: konsep database server MariaDB โ€” socket vs TCP, akun user@host, InnoDB, dump konsisten
ย 
m Protected "Linux : MariaDB Dasar (Cara Kerja Database Server)": Proteksi editorial: edit/move sysop ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))
ย 
(No difference)

Latest revision as of 07:03, 9 November 2026

MariaDB adalah database server yang paling sering kamu temui di server Debian dan Ubuntu. Halaman ini membahas cara kerjanya, bukan sekadar daftar perintah instalasi.

๐ŸŽฏ Tujuan

Setelah membaca dan mencoba halaman ini, kamu bisa:

  • menjelaskan beda server dan client di MariaDB;
  • menentukan kapan koneksi lewat socket dan kapan lewat port 3306;
  • membedakan user sistem operasi dan akun MariaDB;
  • membuat akun aplikasi dengan hak seperlunya, bukan memakai root;
  • memilih dump sebagai cara backup, bukan menyalin folder data.

๐Ÿ“ Konteks nyata

Bayangkan koperasi sekolah. Ada lemari besi berisi buku besar, ada petugas loket, dan ada jam layanan.

Kamu tidak membuka lemari besi sendiri. Kamu menulis di formulir, menyerahkannya ke petugas, lalu petugas yang mencatat ke buku besar dan mengembalikan jawabannya.

MariaDB bekerja persis begitu. Aplikasi (PHP, Python, aplikasi kasir) adalah pengunjung loket. mariadbd adalah petugasnya. Folder /var/lib/mysql adalah lemari besinya.

  • Aplikasi tidak pernah menyentuh file nilai. Ia hanya mengirim pertanyaan SQL ke server.
  • Server yang memutuskan boleh atau tidak. Bukan aplikasi, bukan file konfigurasi PHP.
  • Lemari besi dipegang satu petugas. Kalau kamu salin sendiri saat loket buka, isinya bisa setengah jadi.

๐Ÿ”ฅ Kasus nyata: Sebuah SMK punya aplikasi nilai berbasis PHP. Suatu sore admin menyalin folder /var/lib/mysql ke flashdisk sebagai "backup", padahal server sedang melayani input nilai. Arsipnya terlihat rapi, sekitar 400 MB. Dua bulan kemudian arsip itu dicoba dipulihkan dan InnoDB menolak membukanya, karena salinan diambil di tengah transaksi. Nilai satu kelas harus direkap manual dari kertas.

๐Ÿง  Konsep singkat

๐Ÿ”น Satu paket, dua program

Paket mariadb-server memasang server: mariadbd. Paket klien memasang client: mariadb.

Nama mysqld dan mysql masih ada sebagai symlink supaya skrip lama tetap jalan. Mengutip manpage Debian: mysqld sekarang adalah symlink ke mariadbd.

Server yang memegang data, aturan, dan riwayat transaksi. Client hanya mengirim pertanyaan dan menampilkan jawaban. Karena itu client bisa dimatikan kapan saja tanpa merusak data.

๐Ÿ”น Dua loket: socket dan port

Ada dua pintu masuk ke server yang sama:

  • Socket โ€” file /run/mysqld/mysqld.sock. Hanya untuk proses di mesin itu. Cepat, tidak lewat jaringan.
  • TCP โ€” port 3306. Bisa dari mesin lain, tergantung bind-address.

Di Debian dan Ubuntu, /etc/mysql/mariadb.conf.d/50-server.cnf berisi bind-address = 127.0.0.1. Artinya port 3306 hanya menerima sambungan dari mesin itu sendiri.

๐Ÿ“Š Angka penting: port bawaan 3306, socket /run/mysqld/mysqld.sock, datadir /var/lib/mysql, dan bind-address bawaan 127.0.0.1.

Client memilih pintu secara otomatis. Kalau kamu menulis -h localhost, client memakai socket. Kalau menulis -h 127.0.0.1, client memakai TCP. Dua-duanya menuju server yang sama, tetapi jejaknya berbeda.

๐Ÿ”น Tiga lapis yang harus lolos

Kegagalan koneksi database hampir selalu salah satu dari tiga lapis ini:

  1. Proses hidup dan mendengar. Ada proses mariadbd, ada file socket atau port yang listen.
  2. Akun MariaDB cocok. Nama user dan alamat asal cocok dengan akun yang terdaftar.
  3. Hak cukup. Akun itu punya izin pada database dan tabel yang dituju.

Aturannya: berhenti di lapis pertama yang gagal. Jangan mengubah hak akses kalau servernya saja belum jalan.

๐Ÿ”น Dua nama yang sering tertukar

MariaDB menyimpan akun sebagai pasangan user@host. Titik koma terpenting: 'app'@'localhost' dan 'app'@'%' adalah dua akun berbeda, bukan satu akun dengan dua izin.

Fungsi Arti Contoh hasil
USER() nama yang dikirim client app_nilai@localhost
CURRENT_USER() akun yang benar-benar dipakai server app_nilai@localhost
SHOW GRANTS hak milik akun yang sedang aktif daftar GRANT

Kalau dua nilai itu berbeda, artinya server mencocokkan permintaanmu ke akun lain. Itu petunjuk pertama saat muncul pesan "Access denied" yang membingungkan.

Aturan pencocokan host: yang paling spesifik menang. Alamat persis lebih kuat daripada wildcard, dan % paling lemah.

Pola host Untuk apa Catatan
localhost aplikasi di mesin yang sama lewat socket
127.0.0.1 aplikasi di mesin yang sama lewat TCP
192.168.100.% aplikasi di LAN wildcard satu segmen
% semua alamat hindari bila tidak perlu

๐Ÿ”น Di mana datanya benar-benar tinggal

Semua database dan tabel disimpan di datadir, biasanya /var/lib/mysql, dimiliki user mysql. Di dalamnya ada ibdata1, file .ibd per tabel, dan berkas log.

Ini bukan dokumen yang bisa dibuka dengan Word atau Notepad. Isinya struktur biner yang hanya masuk akal bagi server. Karena itu "backup" versi salin folder bukan sekadar kurang rapi, tetapi sering tidak bisa dipakai.

๐Ÿ”น InnoDB dan arti transaksi

Storage engine bawaan MariaDB adalah InnoDB. Ia yang mengurus transaksi, kunci per baris, dan pemulihan setelah listrik padam lewat redo log.

Transaksi berarti sekumpulan perubahan dianggap satu paket: semua berhasil, atau semua dibatalkan. Kalau server mati di tengah jalan, InnoDB memutar ulang log untuk menyelesaikan atau membatalkan paket itu.

Karena itu:

  • Menyalin file saat server hidup bisa menangkap paket yang setengah selesai.
  • Backup yang benar memakai alat yang meminta potret konsisten ke server, bukan mencuri file di belakangnya.

๐Ÿงฉ Istilah penting

Istilah Arti sederhana Analogi
Instance satu proses server yang mengelola satu datadir satu petugas, satu lemari
datadir folder induk semua data lemari besi
Socket jalur komunikasi lokal berbentuk file loket dalam gedung
bind-address alamat yang boleh dihubungi lewat TCP pintu mana yang dibuka
user@host akun beserta alamat asal yang diizinkan kartu anggota + lokasi
Privilege hak baca, tulis, ubah, hapus tingkat akses kunci
Storage engine mesin penyimpanan tabel rak kayu atau rak besi
Transaksi paket perubahan all-or-nothing setoran tunai sekali hitung
Dump berkas SQL berisi struktur dan isi fotokopi buku besar
Consistent snapshot potret data pada satu titik waktu foto, bukan video

Istilah lain yang akan kamu temui: max_connections (jumlah sambungan bersamaan, bawaan 151), max_allowed_packet (ukuran kiriman terbesar, bawaan 16 MB), dan tmpdir (folder kerja sementara saat mengolah query besar).

๐Ÿ”ง Praktik: menyiapkan database untuk aplikasi sekolah

Latihan ini memakai VM Debian atau Ubuntu, bukan server produksi. Pakai aplikasi nilai sekolah sebagai contoh supaya konteksnya terasa.

  1. Potret keadaan awal. Catat versi, layanan, dan jalur:
    systemctl status mariadb --no-pager | head -5
    mariadb --version
    ss -lntp | grep 3306
    ls -ld /var/lib/mysql
    
  2. Baca identitas server yang sebenarnya. Jangan menebak dari file konfigurasi saja:
    sudo mariadb -e "SELECT @@version, @@port, @@socket, @@datadir, @@bind_address;"
    
    Hasilnya adalah gabungan konfigurasi default dan isi mariadb.conf.d.
  3. Buktikan dua lapis identitas. Jalankan sebagai user OS biasa, lalu bandingkan:
    whoami
    sudo -u www-data mariadb -e "SELECT USER(), CURRENT_USER();"
    
    Baris pertama menjawab "siapa OS-nya", baris kedua menjawab "akun MariaDB mana yang dipakai".
  4. Buat database dan akun aplikasi. Akun khusus, bukan root:
    sudo mariadb <<'SQL'
    CREATE DATABASE nilai_smk
      CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    CREATE USER 'app_nilai'@'localhost' IDENTIFIED BY 'GantiDenganSandiPanjang';
    GRANT SELECT, INSERT, UPDATE, DELETE ON nilai_smk.* TO 'app_nilai'@'localhost';
    SQL
    
    utf8mb4 penting agar nama siswa dengan karakter khusus tidak rusak.
  5. Uji dari sudut pandang aplikasi. Masuk sebagai app_nilai, buat tabel, lalu coba hapus database:
    mariadb -u app_nilai -p nilai_smk -e "
    CREATE TABLE siswa (id INT PRIMARY KEY AUTO_INCREMENT, nama VARCHAR(80));
    INSERT INTO siswa (nama) VALUES ('Rina'), ('Bagas');"
    mariadb -u app_nilai -p -e "DROP DATABASE nilai_smk;"
    
    Perintah terakhir harus ditolak. Pesannya kurang lebih Access denied ... to database 'nilai_smk'. Itu tanda hak sudah benar.
  6. Bandingkan socket dan TCP. Perhatikan akun mana yang tercatat di masing-masing jalur:
    sudo mariadb -e "SELECT USER(), CURRENT_USER();"
    sudo mariadb -h 127.0.0.1 -e "SELECT USER(), CURRENT_USER();"
    
    Jangan berasumsi. Baca hasilnya, lalu cocokkan dengan SHOW GRANTS.
  7. Periksa engine tabel. Pastikan tabel baru benar-benar InnoDB:
    sudo mariadb -e "SHOW ENGINES\G" | grep -E "InnoDB|DEFAULT"
    sudo mariadb -e "SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES
      WHERE TABLE_SCHEMA='nilai_smk';"
    
  8. Ambil dump yang konsisten. Opsi --single-transaction membuat potret tanpa mengunci tabel InnoDB:
    sudo mkdir -p /srv/backup-db
    sudo mariadb-dump --single-transaction --routines --events \
      nilai_smk > /srv/backup-db/nilai-$(date +%F).sql
    head -20 /srv/backup-db/nilai-$(date +%F).sql
    
  9. Restore ke database uji, bukan ke aslinya. Ini kebiasaan yang membedakan admin rapi dan admin panik:
    sudo mariadb -e "CREATE DATABASE nilai_uji"
    sudo mariadb nilai_uji < /srv/backup-db/nilai-$(date +%F).sql
    sudo mariadb -e "SELECT COUNT(*) FROM nilai_uji.siswa;"
    
    Jumlah barisnya harus sama dengan database asal.
  10. Bandingkan dengan cara yang salah. Coba salin datadir saat server hidup, lalu lihat hasilnya:
    sudo cp -a /var/lib/mysql /srv/backup-db/salinan-datadir
    ls -l /srv/backup-db/salinan-datadir | head
    
    Ukurannya bisa besar, tetapi isinya tidak dijamin konsisten. Simpan sebagai pembanding, lalu hapus.

๐Ÿ’ก Tips: Beri nama akun sesuai aplikasinya, misalnya app_nilai, app_kasir, app_absensi. Saat ada masalah, kamu langsung tahu aplikasi mana yang harus diperiksa.

โš ๏ธ Hati-hati: FLUSH PRIVILEGES tidak wajib setelah CREATE USER atau GRANT. Perintah itu hanya perlu kalau kamu mengubah tabel hak akses secara langsung dengan INSERT atau UPDATE.

๐Ÿญ Dipakai di dunia kerja

  • Sekolah: aplikasi ujian berbasis komputer dan e-rapor menyimpan soal serta nilai di MariaDB. Akun aplikasi wajib terbatas, karena satu salah GRANT bisa membuat nilai satu angkatan bisa dihapus dari halaman web.
  • Kantor: aplikasi kasir dan stok distributor memakai satu database untuk beberapa cabang. bind-address dan akun per cabang menentukan siapa boleh masuk dari mana.
  • Klinik dan puskesmas: rekap kunjungan dan stok obat disimpan di database. Data ini termasuk data pribadi, jadi akses dan backup-nya diatur ketat.
  • ISP dan warnet: aplikasi billing mencatat sesi dan pembayaran pelanggan. Server yang tumbang berarti transaksi tidak tercatat, jadi backup dan uji restore masuk rutinitas.
  • Industri: mesin produksi mengirim data ke database untuk laporan harian. Beban tulis tinggi menuntut pemahaman transaksi dan index, bukan hanya perintah SELECT.
  • Hosting dan pengembang aplikasi: banyak aplikasi PHP, Laravel, dan WordPress memakai MariaDB. Kemampuan membaca pesan error dan hak akses mempercepat pekerjaan sehari-hari.

โœ… Verifikasi

Yang dicek Perintah Hasil yang benar
Layanan hidup systemctl is-active mariadb active
Port dan socket ss -lntp | grep 3306 listen di 127.0.0.1:3306
Identitas server SELECT @@datadir, @@socket; jalur sesuai kenyataan
Akun terpakai SELECT CURRENT_USER(); akun yang kamu buat
Hak akun SHOW GRANTS FOR 'app_nilai'@'localhost'; hanya SELECT, INSERT, UPDATE, DELETE
Uji tolak hak DROP DATABASE nilai_smk; ERROR 1044
Engine tabel SELECT ENGINE FROM information_schema.TABLES ... InnoDB
Isi dump grep -c "CREATE TABLE" file.sql jumlah tabel sesuai

๐Ÿงช Uji cepat: satu baris untuk memastikan server benar-benar melayani, bukan hanya prosesnya ada.

mariadb -e "SELECT 1 AS hidup, NOW() AS waktu_server;"

โš ๏ธ Kesalahan umum & troubleshooting

Gejala Penyebab Perbaikan
Can't connect ... socket layanan mati atau socket beda jalur cek systemctl status dan @@socket
Connection refused ke 127.0.0.1 hanya socket yang aktif periksa bind-address dan skip-networking
Access denied for user sandi salah atau akun beda host baca CURRENT_USER(), cek SHOW GRANTS
Host ... is not allowed tidak ada akun untuk alamat asal buat akun @ yang tepat
ERROR 1044 akun ada, hak kurang tambah GRANT seperlunya
Unknown database nama salah atau belum dibuat SHOW DATABASES;
Too many connections sambungan menumpuk tutup koneksi aplikasi, cek max_connections
No space left on device disk penuh cek df -h, bersihkan log dan dump lama
Table ... is marked as crashed server mati keras saat menulis hentikan layanan, periksa dengan alat recovery InnoDB
Can't create/write to file tmpdir penuh atau izin salah cek ruang dan pemilik folder

โš ๏ธ Hati-hati: pesan "Access denied" tidak selalu berarti sandi salah. Di banyak kasus, sandi benar tetapi server mencocokkan ke akun lain karena alamat asalnya berbeda.

๐Ÿ”ฅ Kasus nyata: Sebuah kantor distributor memindahkan aplikasi kasir ke server baru. Aplikasi menulis localhost, tetapi pustaka kliennya menerjemahkan itu ke TCP.

Akun yang dibuat hanya 'kasir'@'localhost', sehingga koneksi ditolak setiap pagi selama tiga hari. Tim menuduh jaringan, padahal penyebabnya satu baris pola host. Solusinya bukan memberi '%', tetapi membuat akun untuk alamat yang benar-benar dipakai.

๐Ÿ” Catatan keamanan & etika

  • Jangan pakai root untuk aplikasi. Akun aplikasi cukup SELECT, INSERT, UPDATE, DELETE pada satu database. Root hanya untuk pekerjaan administrasi di mesin itu.
  • Biarkan bind-address tetap 127.0.0.1 kalau tidak ada aplikasi dari mesin lain. Membukanya ke 0.0.0.0 tanpa firewall sama dengan menaruh loket di pinggir jalan.
  • Sandi di file konfigurasi harus dibaca hanya oleh pemiliknya. File .env dengan mode 644 dan isi sandi database adalah kebocoran yang menunggu waktu.
  • Dump berisi data pribadi. Nilai, nomor telepon, dan riwayat pembayaran ada di dalamnya. Simpan dengan izin ketat, jangan di folder web yang bisa diunduh, dan jangan dikirim ke grup chat.
  • Autentikasi unix_socket tidak memakai sandi; kekuatannya adalah keamanan user OS. Dokumentasi resmi menegaskan: siapa pun yang bisa menjadi user OS itu bisa masuk. Jadi jagalah sudo dan akun sistem.
  • Etika: data nilai, pasien, dan pelanggan bukan bahan latihan. Uji di VM sendiri, dan jangan pernah mencoba memulihkan dump produksi ke server orang lain tanpa izin.

๐Ÿ“Š Angka penting: di instalasi baru paket Debian dan Ubuntu, root@localhost dibuat memakai plugin unix_socket. Kalau seseorang pernah menjalankan mysql_secure_installation, plugin itu bisa berubah menjadi autentikasi sandi. Karena itu selalu periksa, jangan mengandalkan asumsi.

๐Ÿ“Œ Kesimpulan

MariaDB adalah layanan, bukan aplikasi yang dibuka: satu proses memegang datadir, dan semua permintaan lewat loket socket atau port 3306.

Kunci memahami masalahnya ada tiga lapis: proses, akun user@host, lalu hak. Berhenti di lapis pertama yang gagal, dan baca CURRENT_USER() sebelum menebak.

Backup yang sah adalah dump yang pernah direstore, bukan folder yang berhasil disalin.

Langkah berikutnya: ambil satu database latihan, buat akun aplikasi dengan hak terbatas, lalu buktikan dump-nya bisa dipulihkan ke database uji.

๐Ÿ”— Materi terkait

๐Ÿ“š Referensi

  • MariaDB Documentation โ€” Authentication Plugin - Unix Socket.
  • MariaDB Documentation โ€” Differences in MariaDB in Debian (and Ubuntu).
  • MariaDB Documentation โ€” mariadb-dump.
  • Debian Manpages bookworm โ€” mariadbd(8), mariadb(1), mariadb-dump(1).
  • Berkas konfigurasi /etc/mysql/mariadb.conf.d/50-server.cnf pada MariaDB 10.11 (Ubuntu 24.04), diperiksa langsung: bind-address = 127.0.0.1, socket = /run/mysqld/mysqld.sock, datadir = /var/lib/mysql, engine bawaan InnoDB.