SQLite LinuxWindowsmacOS

Почему SQLite не сокращает журнал -wal после записи

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

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

В режиме WAL записи сначала попадают в файл базы с суффиксом -wal. Завершение INSERT или COMMIT не обязано мгновенно уменьшать физический размер файла: контрольная точка (checkpoint) может перенести страницы обратно в основной файл, но файл WAL остаётся прежнего размера и повторно используется. Если долго живущие читатели мешают контрольным точкам, -wal может расти без ограничений. Удалять его вручную нельзя.

В этой статье
  1. Что происходит и когда возникает
  2. Возможные причины: как различить
  3. Пошаговая диагностика и исправление
  4. Команды и проверочные примеры
  5. Как проверить результат
  6. Если не помогло

#Что происходит и когда возникает

В режиме WAL записи сначала попадают в файл базы с суффиксом -wal. Завершение INSERT или COMMIT не обязано мгновенно уменьшать физический размер файла: контрольная точка (checkpoint) может перенести страницы обратно в основной файл, но файл WAL остаётся прежнего размера и повторно используется. Если долго живущие читатели мешают контрольным точкам, -wal может расти без ограничений. Удалять его вручную нельзя.

#Возможные причины: как различить

Возможная причинаКак узнатьЧто делать
Длинная читающая транзакцияЧитатель удерживает старую точку снимка и препятствует завершению checkpoint.Приложение держит cursor/SELECT или открытую транзакцию; число перенесённых кадров меньше числа кадров в PRAGMA wal_checkpoint.Закрыть ненужное чтение штатно; проверить checkpoint в период затишья.
Пиковая запись при редких checkpointЗаписи растут быстрее автоматических контрольных точек.Журнал растёт при нагрузке, но потом стабилизируется или переиспользуется.Измерить нагрузку и настроить обслуживание после анализа.
Долгоживущее соединениеРазмер WAL может сохраняться, пока есть открытые соединения; это не всегда ошибка.Нет активной записи, размер стабилен; PRAGMA wal_checkpoint не сообщает отставания.Не удалять файл, оценивать свободное место и штатно закрывать соединения.

#Пошаговая диагностика и исправление

  1. Проверьте свободное место и сохраните файлыЕсли -wal быстро растёт и свободного места мало, сначала приостановите необязательные новые операции записи штатными средствами приложения, не завершайте процессы принудительно. Посмотрите размер файла базы и -wal в файловом менеджере или командой ls -lh в каталоге базы. Если место почти закончилось, обратитесь к администратору до запуска тяжёлых операций.
  2. Убедитесь в режиме журналированияОткройте штатную консоль sqlite3 на копии или подключитесь к базе с правами для чтения и выполните PRAGMA journal_mode;. Ответ wal подтверждает режим WAL. Если ответ delete/truncate, рост одноимённого файла может иметь другую причину; не меняйте режим без плана и резервной копии.
  3. Проверьте состояние контрольных точекНа разрешённом соединении к базе выполните PRAGMA wal_checkpoint(PASSIVE);. Результат содержит три числа: признак занятости, общее число страниц в WAL и число страниц, перенесённых в основной файл. В режиме PASSIVE операция не должна ждать читателей; при отставании изучайте долгие SELECT и транзакции, не повторяйте checkpoint бесконечно.
  4. Найдите удерживаемую читающую транзакциюЕсли checkpoint переносит не все страницы, проверьте код: не остаются ли открытыми курсоры и соединения, не начинается ли BEGIN перед долгим сетевым запросом. В приложении завершите чтение, закройте курсор и соединение штатным способом; в Python используйте явный con.close() после завершения всех операций. Не прекращайте неизвестный процесс на рабочем сервере.
  5. Сделайте правильную копию перед обслуживаниемДля резервного копирования запущенной базы используйте SQLite Online Backup API или команду sqlite3 с .backup (точный пример ниже). Записывайте копию в новый файл и убедитесь, что она открывается. Копирование только файла .db при активном WAL может потерять последние подтверждённые транзакции.
  6. Проведите обслуживание в согласованное окноЕсли приложение допускает окно без долгих читателей и копия проверена, администратор может выполнить PRAGMA wal_checkpoint(TRUNCATE);. Эта операция может ждать блокировок; при занятой базе результат не гарантирован. Не запускайте её в цикле; не трогайте вручную файлы -wal и -shm.
  7. Оцените результат и повторите измерениеСравните размер -wal до и после при обычной нагрузке и результат wal_checkpoint(PASSIVE). Уменьшение файла необязательно: отсутствие постоянного роста и перенос страниц — тоже нормальная работа. Если число не перенесённых страниц растёт, передайте администратору сведения о длительных соединениях и объёме записи.

#Команды и проверочные примеры

SQLКоманда
Запускайте в консоли SQLite либо клиенте приложения, подключённом к нужной базе; PASSIVE может выполнять I/O. Не путайте проверку со сменой PRAGMA journal_mode = WAL.
PRAGMA journal_mode;
PRAGMA wal_checkpoint(PASSIVE);
SQLС осторожностью
Только на обслуживаемой базе после проверенной копии, с разрешения администратора; возможны блокировки и ожидание.
PRAGMA wal_checkpoint(TRUNCATE);

Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

Linux · Терминал (Bash)С осторожностью
В каталоге своей тестовой базы; замените имена на проверенные реальные пути. Файл назначения должен быть новым; не перезаписывайте прежнюю копию.
sqlite3 app.db ".backup backup-verified.db"

Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

#Как проверить результат

База открывается, новые записи видны, PRAGMA wal_checkpoint(PASSIVE) показывает перенос кадров; файл WAL стабилизируется либо уменьшается в согласованное окно. Проверьте, что резервная копия проходит PRAGMA integrity_check и содержит контрольную запись.

#Если не помогло

Если WAL снова растёт, запишите размеры и число неперенесённых кадров в нескольких точках времени. Проверьте длительные читающие транзакции, свободное место, настройки автоматической контрольной точки и подключённые приложения. Не перезапускайте сервер до понимания, какие операции будут прерваны.

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

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