SQLite: kapan sudah cukup
Di mana SQLite di VPS lebih baik daripada server database terpisah, cara mengaktifkan WAL dan menghindari “database is locked”, dan kapan waktunya pindah ke PostgreSQL.
Diperbarui 23 Agustus 2026
SQLite adalah database dalam satu file — tanpa layanan, tanpa port, tanpa kata sandi. Untuk bot, panel kecil, atau situs dengan penulisan jarang, ini pilihan yang tepat: tidak memakan memori, dan VDS-1 hanya punya 2 GB memori, serta tidak ada yang perlu dikonfigurasi.
Kapan menggunakannya
Cocok untuk:
- bot Telegram dan Discord, penghitung, pengaturan;
- situs dengan ribuan pembacaan dan puluhan penulisan per menit;
- proyek apa pun di satu mesin tanpa rencana untuk server kedua.
Tidak cocok untuk:
- beberapa proses yang aktif menulis secara bersamaan;
- database yang lebih besar dari beberapa puluh gigabyte;
- akses jaringan dari mesin lain — SQLite tidak bisa melakukan ini.
Pada kasus kedua dan ketiga, gunakan PostgreSQL atau MySQL.
Bekerja dengan file
apt install -y sqlite3
sqlite3 /srv/app/data/app.db
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
INSERT INTO users (name) VALUES ('test');
.tables
.schema users
.quit
File database harus berada di disk lokal mesin dan dimiliki oleh pengguna aplikasi:
chown appuser:appuser /srv/app/data/app.db
chmod 640 /srv/app/data/app.db
Direktori yang berisi database juga harus dapat ditulis: SQLite membuat file sementara -wal dan -shm di sebelahnya.
Pengaturan wajib
Dua pengaturan pragma menghilangkan sebagian besar masalah:
PRAGMA journal_mode = WAL;
PRAGMA busy_timeout = 5000;
WAL memungkinkan pembaca membaca saat penulisan sedang berlangsung — tanpanya, setiap pembaca terblokir oleh penulis. busy_timeout membuat klien menunggu lima detik alih-alih langsung gagal. Atur keduanya setiap kali Anda membuka koneksi di kode, bukan sekali di konsol.
Backup
Anda tidak bisa menyalin file dengan cp biasa saat aplikasi berjalan — Anda akan mendapatkan database yang rusak. Ada perintah aman bawaan:
sqlite3 /srv/app/data/app.db ".backup '/srv/backups/app-$(date +%F).db'"
Letakkan di cron dan pindahkan salinannya ke luar mesin: VPS tidak memiliki backup otomatis dan juga tidak memiliki snapshot. Pendekatan umumnya dibahas di backup database.
Kesalahan umum
| Gejala | Penyebab |
|---|---|
database is locked | Tidak ada WAL atau busy_timeout, atau proses kedua menahan transaksi yang lama |
attempt to write a readonly database | Tidak ada izin pada file atau direktori |
disk I/O error | Ruang disk habis — periksa cincin penggunaan disk di "Overview" |
| Database membesar setelah baris dihapus | Ruang tidak diklaim kembali secara otomatis: VACUUM |
| Database rusak setelah penyalinan | Anda menyalin dengan cp saat berjalan — gunakan hanya .backup |
Kapan bermigrasi
Tandanya: error database is locked yang rutin muncul meski WAL aktif, beberapa worker aplikasi, laporan yang butuh beberapa menit untuk dihitung. Untuk memindahkan, lihat migrasi database.
File database tidak boleh berada di direktori yang dilayani oleh web server.
/var/www/app.dbdapat diunduh melalui tautan langsung, beserta semua kata sandi dan data pengguna.