#Что происходит и когда возникает
В режиме WAL записи сначала попадают в файл базы с суффиксом -wal. Завершение INSERT или COMMIT не обязано мгновенно уменьшать физический размер файла: контрольная точка (checkpoint) может перенести страницы обратно в основной файл, но файл WAL остаётся прежнего размера и повторно используется. Если долго живущие читатели мешают контрольным точкам, -wal может расти без ограничений. Удалять его вручную нельзя.
#Возможные причины: как различить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Длинная читающая транзакцияЧитатель удерживает старую точку снимка и препятствует завершению checkpoint. | Приложение держит cursor/SELECT или открытую транзакцию; число перенесённых кадров меньше числа кадров в PRAGMA wal_checkpoint. | Закрыть ненужное чтение штатно; проверить checkpoint в период затишья. |
| Пиковая запись при редких checkpointЗаписи растут быстрее автоматических контрольных точек. | Журнал растёт при нагрузке, но потом стабилизируется или переиспользуется. | Измерить нагрузку и настроить обслуживание после анализа. |
| Долгоживущее соединениеРазмер WAL может сохраняться, пока есть открытые соединения; это не всегда ошибка. | Нет активной записи, размер стабилен; PRAGMA wal_checkpoint не сообщает отставания. | Не удалять файл, оценивать свободное место и штатно закрывать соединения. |
#Пошаговая диагностика и исправление
- Проверьте свободное место и сохраните файлыЕсли -wal быстро растёт и свободного места мало, сначала приостановите необязательные новые операции записи штатными средствами приложения, не завершайте процессы принудительно. Посмотрите размер файла базы и -wal в файловом менеджере или командой ls -lh в каталоге базы. Если место почти закончилось, обратитесь к администратору до запуска тяжёлых операций.
- Убедитесь в режиме журналированияОткройте штатную консоль sqlite3 на копии или подключитесь к базе с правами для чтения и выполните PRAGMA journal_mode;. Ответ wal подтверждает режим WAL. Если ответ delete/truncate, рост одноимённого файла может иметь другую причину; не меняйте режим без плана и резервной копии.
- Проверьте состояние контрольных точекНа разрешённом соединении к базе выполните PRAGMA wal_checkpoint(PASSIVE);. Результат содержит три числа: признак занятости, общее число страниц в WAL и число страниц, перенесённых в основной файл. В режиме PASSIVE операция не должна ждать читателей; при отставании изучайте долгие SELECT и транзакции, не повторяйте checkpoint бесконечно.
- Найдите удерживаемую читающую транзакциюЕсли checkpoint переносит не все страницы, проверьте код: не остаются ли открытыми курсоры и соединения, не начинается ли BEGIN перед долгим сетевым запросом. В приложении завершите чтение, закройте курсор и соединение штатным способом; в Python используйте явный con.close() после завершения всех операций. Не прекращайте неизвестный процесс на рабочем сервере.
- Сделайте правильную копию перед обслуживаниемДля резервного копирования запущенной базы используйте SQLite Online Backup API или команду sqlite3 с .backup (точный пример ниже). Записывайте копию в новый файл и убедитесь, что она открывается. Копирование только файла .db при активном WAL может потерять последние подтверждённые транзакции.
- Проведите обслуживание в согласованное окноЕсли приложение допускает окно без долгих читателей и копия проверена, администратор может выполнить PRAGMA wal_checkpoint(TRUNCATE);. Эта операция может ждать блокировок; при занятой базе результат не гарантирован. Не запускайте её в цикле; не трогайте вручную файлы -wal и -shm.
- Оцените результат и повторите измерениеСравните размер -wal до и после при обычной нагрузке и результат wal_checkpoint(PASSIVE). Уменьшение файла необязательно: отсутствие постоянного роста и перенос страниц — тоже нормальная работа. Если число не перенесённых страниц растёт, передайте администратору сведения о длительных соединениях и объёме записи.
#Команды и проверочные примеры
PRAGMA journal_mode;PRAGMA wal_checkpoint(PASSIVE);PRAGMA wal_checkpoint(TRUNCATE);Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
sqlite3 app.db ".backup backup-verified.db"Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
База открывается, новые записи видны, PRAGMA wal_checkpoint(PASSIVE) показывает перенос кадров; файл WAL стабилизируется либо уменьшается в согласованное окно. Проверьте, что резервная копия проходит PRAGMA integrity_check и содержит контрольную запись.
#Если не помогло
Если WAL снова растёт, запишите размеры и число неперенесённых кадров в нескольких точках времени. Проверьте длительные читающие транзакции, свободное место, настройки автоматической контрольной точки и подключённые приложения. Не перезапускайте сервер до понимания, какие операции будут прерваны.