SQLite: когда его достаточно
Где SQLite на VDS лучше отдельного сервера базы, как включить WAL и не поймать «database is locked», и когда пора переезжать на PostgreSQL.
Обновлено 23 августа 2026 г.
SQLite — база в одном файле, без службы, без порта и без пароля. Для бота, небольшой панели или сайта с редкими записями это правильный выбор: она не ест память, которой на VDS-1 всего 2 ГБ, и её нечего настраивать.
Когда подходит
Подходит:
- телеграм- и дискорд-боты, счётчики, настройки;
- сайты с тысячами чтений и десятками записей в минуту;
- любой проект на одной машине без планов на второй сервер.
Не подходит:
- несколько процессов, активно пишущих одновременно;
- база больше нескольких десятков гигабайт;
- доступ с другой машины по сети — этого SQLite не умеет в принципе.
Во втором и третьем случае берите PostgreSQL или MySQL.
Работа с файлом
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
Файл базы должен лежать на локальном диске машины и принадлежать пользователю приложения:
chown appuser:appuser /srv/app/data/app.db
chmod 640 /srv/app/data/app.db
Каталог с базой тоже должен быть доступен на запись: SQLite создаёт рядом временные файлы -wal и -shm.
Обязательные настройки
Два прагма-параметра снимают большую часть проблем:
PRAGMA journal_mode = WAL;
PRAGMA busy_timeout = 5000;
WAL позволяет читать во время записи — без него любой читатель блокируется пишущим. busy_timeout заставляет клиента подождать пять секунд вместо мгновенной ошибки. Задавайте их при каждом открытии соединения в коде, а не однократно в консоли.
Резервная копия
Копировать файл обычным cp во время работы приложения нельзя — получите повреждённую базу. Есть встроенная безопасная команда:
sqlite3 /srv/app/data/app.db ".backup '/srv/backups/app-$(date +%F).db'"
Ставьте её в cron и увозите копию с машины: автоматических резервных копий VDS нет, снимков состояния тоже. Общая схема — резервные копии баз.
Частые ошибки
| Симптом | Причина |
|---|---|
database is locked | Нет WAL и busy_timeout, либо второй процесс держит длинную транзакцию |
attempt to write a readonly database | Прав нет на файл или на каталог |
disk I/O error | Кончилось место — проверьте кольцо занятости диска в «Обзоре» |
| База растёт после удаления строк | Место не возвращается само: VACUUM |
| Битая база после копирования | Копировали cp на ходу — только .backup |
Когда переезжать
Признаки: регулярные database is locked при включённом WAL, несколько воркеров приложения, отчёты, которые считаются минутами. Перенос — миграция базы.
Файл базы не должен лежать в каталоге, который отдаёт веб-сервер.
/var/www/app.dbскачивается по прямой ссылке вместе со всеми паролями и данными пользователей.