SQLite SQLiteLinuxWindowsPHPPython

SQLite: После включения WAL растут файлы -wal и -shm

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

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

Если SQLite работает в режиме WAL, размер файлов -wal и -shm может увеличиваться. Ключевая диагностика — число страниц в WAL и отставание контрольной точки при долгих читающих транзакциях, а не удаление этих файлов вручную.

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

#Что происходит и когда инструкция применима

Если SQLite работает в режиме WAL, размер файлов -wal и -shm может увеличиваться. Ключевая диагностика — число страниц в WAL и отставание контрольной точки при долгих читающих транзакциях, а не удаление этих файлов вручную.

Характерный признак: Файл app.db-wal занимает всё больше места при нормальной работе сайта, а app.db почти не меняется; рядом виден -shm.

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

Возможная причинаКак узнатьЧто делать
Долгий читательОткрытый SELECT держит старый снимок и не позволяет завершить checkpointWAL растёт во время выгрузки или длительного отчётаЗакрыть курсор и завершить транзакцию
Изменён авто-checkpointПриложение отключило автоматическую контрольную точку или увеличило порогPRAGMA wal_autocheckpoint показывает 0Пересмотреть настройку подключения
Большой поток записейЖурнал может временно расти, а его файл обычно переиспользуетсяcheckpoint завершается, но файл остаётся большимОценить максимальный размер и расписание

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

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

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

  1. 5. Найдите длительную транзакцию-читалкуПроверьте процессы, которые открыли базу; сопоставьте время начала выгрузки, долгий курсор, не закрытое соединение или ожидание пользовательского ввода внутри транзакции. lsof показывает владельцев дескрипторов, но не всегда определяет блокирующую транзакцию.
    Linux · Терминал (Bash)Команда
    Linux; требуется установленный lsof и право видеть нужные процессы. Не завершайте найденные процессы без согласования.
    lsof /srv/app/data/app.db
  1. 6. Закройте читателей штатноВ коде завершите операции чтения, освободите курсоры и выполните COMMIT/ROLLBACK для открытых транзакций, затем повторите checkpoint. Если есть фоновые задачи, перенесите тяжёлый отчёт на отдельное окно времени.
  1. 7. Уменьшите WAL только при подтверждённом отсутствии активных читателейПосле успешного резервного копирования и паузы записи выполните TRUNCATE в окно обслуживания. Успешное завершение и свободный журнал — проверка; если возвращается busy, прекратите повторные попытки и выясните, кто держит снимок.
  2. Изменяет состояние WAL; выполнять только в согласованное окно
    Linux · Терминал (Bash)С осторожностью
    Изменяет состояние WAL; выполнять только в согласованное окно. Не запускать под тяжёлой нагрузкой.
    sqlite3 /srv/app/data/app.db 'PRAGMA wal_checkpoint(TRUNCATE);'

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

  1. 8. Настройте наблюдение и повторную проверкуЗапишите размеры после контрольной точки и через сутки. Не считайте сохранение файла -wal той же длины ошибкой само по себе: SQLite часто переиспользует место. Оценивайте реальный постоянный рост и отставание checkpoint.

#Как проверить исправление

Размер журнала перестал монотонно расти при обычной нагрузке, PASSIVE показывает продвижение контрольной точки, а чтение и запись приложения не потеряли данные.

#Если исправление не помогло

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

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

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

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