#Что происходит и когда инструкция применима
Если SQLite работает в режиме WAL, размер файлов -wal и -shm может увеличиваться. Ключевая диагностика — число страниц в WAL и отставание контрольной точки при долгих читающих транзакциях, а не удаление этих файлов вручную.
Характерный признак: Файл app.db-wal занимает всё больше места при нормальной работе сайта, а app.db почти не меняется; рядом виден -shm.
#Как отличить возможные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Долгий читательОткрытый SELECT держит старый снимок и не позволяет завершить checkpoint | WAL растёт во время выгрузки или длительного отчёта | Закрыть курсор и завершить транзакцию |
| Изменён авто-checkpointПриложение отключило автоматическую контрольную точку или увеличило порог | PRAGMA wal_autocheckpoint показывает 0 | Пересмотреть настройку подключения |
| Большой поток записейЖурнал может временно расти, а его файл обычно переиспользуется | checkpoint завершается, но файл остаётся большим | Оценить максимальный размер и расписание |
#Пошаговая диагностика и исправление
- 1. Подтвердите, что база использует WALОткройте терминал непосредственно на хосте приложения и выясните реальный путь .db. На существующей базе выполните запрос; ожидается wal. Если вывод delete, причиной крупных -wal могут быть остаточные файлы после аварии, не удаляйте их.
- Путь заменить; открытие только существующей базы, проверка режима чтениемLinux · Терминал (Bash)КомандаПуть заменить; открытие только существующей базы, проверка режима чтением.
sqlite3 -readonly /srv/app/data/app.db 'PRAGMA journal_mode;'
- 2. Измерьте файлы и свободное местоНа Linux запишите размер app.db, app.db-wal и app.db-shm, затем повторите измерение через несколько минут обычной нагрузки. Если место заканчивается — ограничьте новые записи на уровне приложения и подготовьте место для штатного обслуживания.
- Чтение; шаблон app.db* может захватить и резервные файлы, поэтому проверяйте именаLinux · Терминал (Bash)КомандаЧтение; шаблон app.db* может захватить и резервные файлы, поэтому проверяйте имена.
ls -lh /srv/app/data/app.db* && df -h /srv/app/data
- 3. Проверьте автоматическую контрольную точкуУзнайте значение для того соединения, которое пишет. Через CLI это только значение конкретной сессии, не гарантия конфигурации всех процессов. Обычно значение по умолчанию — 1000 страниц.
- Чтение текущей сессииLinux · Терминал (Bash)КомандаЧтение текущей сессии. Значение 0 означает отключение автоматического checkpoint для данного соединения.
sqlite3 -readonly /srv/app/data/app.db 'PRAGMA wal_autocheckpoint;'
- 4. Получите показатели checkpoint на согласованном окне обслуживанияНа тестовом клоне либо в согласованное время выполните PASSIVE и запишите три результата: busy, число страниц журнала и сколько перенесено. PASSIVE может записывать страницы в основной файл, поэтому это не чистая диагностика без изменений.
- Только с резервной копией и разрешением на обслуживаниеLinux · Терминал (Bash)С осторожностьюТолько с резервной копией и разрешением на обслуживание. Ожидается строка из трёх чисел, например 0|1200|500; вывод зависит от состояния.
sqlite3 /srv/app/data/app.db 'PRAGMA wal_checkpoint(PASSIVE);'Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 5. Найдите длительную транзакцию-читалкуПроверьте процессы, которые открыли базу; сопоставьте время начала выгрузки, долгий курсор, не закрытое соединение или ожидание пользовательского ввода внутри транзакции. lsof показывает владельцев дескрипторов, но не всегда определяет блокирующую транзакцию.Linux · Терминал (Bash)КомандаLinux; требуется установленный lsof и право видеть нужные процессы. Не завершайте найденные процессы без согласования.
lsof /srv/app/data/app.db
- 6. Закройте читателей штатноВ коде завершите операции чтения, освободите курсоры и выполните COMMIT/ROLLBACK для открытых транзакций, затем повторите checkpoint. Если есть фоновые задачи, перенесите тяжёлый отчёт на отдельное окно времени.
- 7. Уменьшите WAL только при подтверждённом отсутствии активных читателейПосле успешного резервного копирования и паузы записи выполните TRUNCATE в окно обслуживания. Успешное завершение и свободный журнал — проверка; если возвращается busy, прекратите повторные попытки и выясните, кто держит снимок.
- Изменяет состояние WAL; выполнять только в согласованное окноLinux · Терминал (Bash)С осторожностьюИзменяет состояние WAL; выполнять только в согласованное окно. Не запускать под тяжёлой нагрузкой.
sqlite3 /srv/app/data/app.db 'PRAGMA wal_checkpoint(TRUNCATE);'Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 8. Настройте наблюдение и повторную проверкуЗапишите размеры после контрольной точки и через сутки. Не считайте сохранение файла -wal той же длины ошибкой само по себе: SQLite часто переиспользует место. Оценивайте реальный постоянный рост и отставание checkpoint.
#Как проверить исправление
Размер журнала перестал монотонно расти при обычной нагрузке, PASSIVE показывает продвижение контрольной точки, а чтение и запись приложения не потеряли данные.
#Если исправление не помогло
Если TRUNCATE блокируется, изучите длительные транзакции, резервные копии, синхронизацию, соединения и частоту записи. WAL на разных хостах через сетевой диск не поддерживается.