SQLite: kada je dovoljan
Gde je SQLite na VPS-u bolji od zasebnog servera baze, kako da uključiš WAL i izbegneš „database is locked“ i kada je vreme da pređeš na PostgreSQL.
Ažurirano 23. avgust 2026.
SQLite je baza podataka u jednoj datoteci — bez servisa, bez porta, bez lozinke. Za bota, mali panel ili sajt sa retkim upisima, to je pravi izbor: ne troši memoriju, a VDS-1 ima samo 2 GB, i nema šta da se konfiguriše.
Kada ga koristiti
Dobar izbor:
- Telegram i Discord botovi, brojači, podešavanja;
- sajtovi sa hiljadama čitanja i desetinama upisa u minuti;
- svaki projekat na jednoj mašini bez planova za drugi server.
Nije dobar izbor:
- više procesa koji aktivno upisuju u isto vreme;
- baza podataka veća od nekoliko desetina gigabajta;
- mrežni pristup sa druge mašine — SQLite to jednostavno ne može.
U drugom i trećem slučaju koristi PostgreSQL ili MySQL.
Rad sa datotekom
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
Datoteka baze podataka mora da bude na lokalnom disku mašine i da pripada korisniku aplikacije:
chown appuser:appuser /srv/app/data/app.db
chmod 640 /srv/app/data/app.db
Direktorijum u kome se nalazi baza podataka takođe mora da bude upisiv: SQLite pored nje pravi privremene -wal i -shm datoteke.
Obavezna podešavanja
Dve pragma postavke otklanjaju većinu problema:
PRAGMA journal_mode = WAL;
PRAGMA busy_timeout = 5000;
WAL omogućava čitaocima da čitaju dok je upis u toku — bez toga svakog čitaoca blokira onaj koji upisuje. busy_timeout tera klijenta da čeka pet sekundi umesto da odmah pukne. Postavljaj ih svaki put kada otvoriš konekciju u kodu, ne samo jednom u konzoli.
Rezervne kopije
Ne možeš da kopiraš datoteku običnim cp dok aplikacija radi — dobićeš oštećenu bazu podataka. Postoji ugrađena bezbedna komanda:
sqlite3 /srv/app/data/app.db ".backup '/srv/backups/app-$(date +%F).db'"
Stavi je u cron i prebaci kopiju van mašine: VPS nema automatske rezervne kopije niti snimke stanja. Opšti pristup je opisan u rezervne kopije baze podataka.
Česte greške
| Simptom | Uzrok |
|---|---|
database is locked | Nema WAL ili busy_timeout, ili drugi proces drži dugu transakciju |
attempt to write a readonly database | Nema dozvola na datoteci ili direktorijumu |
disk I/O error | Nema mesta na disku — proveri prsten zauzetosti diska u „Pregledu“ |
| Baza raste nakon brisanja redova | Prostor se ne oslobađa automatski: VACUUM |
| Oštećena baza nakon kopiranja | Kopirao si sa cp dok je radila — koristi samo .backup |
Kada migrirati
Znaci: redovne greške database is locked čak i sa uključenim WAL-om, više radnika aplikacije, izveštaji koji se računaju minutima. Za prelazak pogledaj migracija baze podataka.
Datoteka baze podataka ne sme da stoji u direktorijumu koji servira veb server.
/var/www/app.dbmože da se preuzme preko direktnog linka, zajedno sa svim lozinkama i korisničkim podacima.