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