Skip to content
VDS · Basis data

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

GejalaPenyebab
database is lockedTidak ada WAL atau busy_timeout, atau proses kedua menahan transaksi yang lama
attempt to write a readonly databaseTidak ada izin pada file atau direktori
disk I/O errorRuang disk habis — periksa cincin penggunaan disk di "Overview"
Database membesar setelah baris dihapusRuang tidak diklaim kembali secara otomatis: VACUUM
Database rusak setelah penyalinanAnda 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.db dapat diunduh melalui tautan langsung, beserta semua kata sandi dan data pengguna.