VDS · Базы данных

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 скачивается по прямой ссылке вместе со всеми паролями и данными пользователей.