Linux : MariaDB Dasar (Cara Kerja Database Server)
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, tergantungbind-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:
- Proses hidup dan mendengar. Ada proses
mariadbd, ada file socket atau port yang listen. - Akun MariaDB cocok. Nama user dan alamat asal cocok dengan akun yang terdaftar.
- 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.
- 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
- Baca identitas server yang sebenarnya. Jangan menebak dari file konfigurasi saja:Hasilnya adalah gabungan konfigurasi default dan isi
sudo mariadb -e "SELECT @@version, @@port, @@socket, @@datadir, @@bind_address;"
mariadb.conf.d. - Buktikan dua lapis identitas. Jalankan sebagai user OS biasa, lalu bandingkan:Baris pertama menjawab "siapa OS-nya", baris kedua menjawab "akun MariaDB mana yang dipakai".
whoami sudo -u www-data mariadb -e "SELECT USER(), CURRENT_USER();"
- 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
utf8mb4penting agar nama siswa dengan karakter khusus tidak rusak. - Uji dari sudut pandang aplikasi. Masuk sebagai
app_nilai, buat tabel, lalu coba hapus database:Perintah terakhir harus ditolak. Pesannya kurang lebihmariadb -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;"Access denied ... to database 'nilai_smk'. Itu tanda hak sudah benar. - Bandingkan socket dan TCP. Perhatikan akun mana yang tercatat di masing-masing jalur:Jangan berasumsi. Baca hasilnya, lalu cocokkan dengan
sudo mariadb -e "SELECT USER(), CURRENT_USER();" sudo mariadb -h 127.0.0.1 -e "SELECT USER(), CURRENT_USER();"
SHOW GRANTS. - 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';"
- Ambil dump yang konsisten. Opsi
--single-transactionmembuat 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
- Restore ke database uji, bukan ke aslinya. Ini kebiasaan yang membedakan admin rapi dan admin panik:Jumlah barisnya harus sama dengan database asal.
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;"
- Bandingkan dengan cara yang salah. Coba salin datadir saat server hidup, lalu lihat hasilnya:Ukurannya bisa besar, tetapi isinya tidak dijamin konsisten. Simpan sebagai pembanding, lalu hapus.
sudo cp -a /var/lib/mysql /srv/backup-db/salinan-datadir ls -l /srv/backup-db/salinan-datadir | head
π‘ 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
GRANTbisa membuat nilai satu angkatan bisa dihapus dari halaman web. - Kantor: aplikasi kasir dan stok distributor memakai satu database untuk beberapa cabang.
bind-addressdan 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-addresstetap 127.0.0.1 kalau tidak ada aplikasi dari mesin lain. Membukanya ke0.0.0.0tanpa firewall sama dengan menaruh loket di pinggir jalan. - Sandi di file konfigurasi harus dibaca hanya oleh pemiliknya. File
.envdengan 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_sockettidak memakai sandi; kekuatannya adalah keamanan user OS. Dokumentasi resmi menegaskan: siapa pun yang bisa menjadi user OS itu bisa masuk. Jadi jagalahsudodan 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
- Linux : Manajemen Paket dan Repositori Debian β cara memasang dan memeriksa paket
mariadb-server. - Linux : Membuat Service Sendiri dengan systemd β memahami mengapa
mariadb.servicebisa gagal start. - Linux : Log dan journalctl untuk Troubleshooting β membaca jejak kegagalan layanan database.
- Linux : Backup Otomatis dengan rsync, tar, dan cron β menjadwalkan dump dan menyimpan salinannya.
- Linux : Praktikum Uji Restore dan Verifikasi Arsip Backup β membuktikan arsip benar-benar bisa dipulihkan.
- Linux : Nginx Dasar dan Virtual Host β memasang aplikasi web yang akan berbicara ke database ini.
- Debian : Database Server dan Shell Scripting : Mariadb dan PhpMyAdmin β panduan instalasi dan skrip pemasangan.
π 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.cnfpada MariaDB 10.11 (Ubuntu 24.04), diperiksa langsung:bind-address = 127.0.0.1,socket = /run/mysqld/mysqld.sock,datadir = /var/lib/mysql, engine bawaanInnoDB.