SQLite LinuxWindowsmacOS

SQLite: размер файла не уменьшается после удаления данных — VACUUM

  • Обновлено
  • Чтение ≈ 2 минуты

Краткий ответ

SQLite не возвращает место автоматически. Выполните VACUUM (нужно место под копию) или включите auto_vacuum.

В этой статье
  1. Что означает ошибка
  2. Причины и признаки
  3. Пошаговое решение
  4. Если проблема осталась

#Что означает ошибка

Сообщение
Размер БД не уменьшается

SQLite не возвращает место автоматически. Выполните VACUUM (нужно место под копию) или включите auto_vacuum.

#Причины и признаки

Возможная причинаКак узнатьЧто делать
Свободные страницыfreelist_count показывает много свободных страницПровести VACUUM после резервного копирования
auto_vacuum выключенФайл не перестраивается автоматически после DELETEИзучить auto_vacuum до миграции
Нет места на VACUUMДля перестроения нет свободного местаПодготовить дополнительный объём
БлокировкаЕсть активная транзакция, VACUUM возвращает lockedЗакрыть транзакции штатно

#Пошаговое решение

  1. Убедитесь, что удалены строки, а не только помеченыВ клиенте sqlite3 или панели управления откройте нужную базу и проверьте число строк запросом SELECT COUNT(*) FROM имя_таблицы;, подставив реальную таблицу. После DELETE SQLite часто сохраняет освобождённые страницы внутри файла для дальнейших вставок; это нормальное поведение. Командой PRAGMA freelist_count; посмотрите число свободных страниц, а PRAGMA page_count; — общее число страниц. Сначала сохраните резервную копию базы.
  2. Подготовьте свободное место и остановку писателейОперация VACUUM перестраивает базу и требует дополнительного места на томе; ориентируйтесь на размер базы и временных файлов, оставляя запас. Согласуйте кратковременную недоступность и остановите процессы, которые активно пишут в файл; длительные транзакции мешают операции. При режиме WAL сначала выполните штатное закрытие соединений или согласованный checkpoint, но не удаляйте файлы -wal и -shm вручную.
  3. Выполните VACUUM из отдельного соединенияОткройте терминал в каталоге с БД и запустите sqlite3 app.db "VACUUM;", заменив app.db на фактическое имя и предварительно проверив, что выбрали нужный файл. VACUUM нельзя запускать внутри активной транзакции; при сообщении database is locked не удаляйте файлы блокировки, а дождитесь завершения других соединений. Отсутствие сообщения об ошибке обычно означает успех; закройте клиент штатно.
  4. Проверьте размер, целостность и будущий ростСравните размер файла на диске до и после и проверьте sqlite3 app.db "PRAGMA integrity_check;" — ожидаемый ответ ok. Если файл не стал существенно меньше, возможно, свободных страниц было мало или данные занимают индексы. auto_vacuum не включается задним числом одной настройкой без перестроения файла; сначала изучите документацию и протестируйте на копии, если нужно регулярное освобождение места.

#Если проблема осталась

Если «SQLite: размер файла не уменьшается после удаления данных — VACUUM» повторяется, сохраните время, состояние подключения и точный текст ошибки. Не меняйте сразу несколько настроек — иначе станет трудно понять, какое действие повлияло на результат.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.