#Что означает ошибка
Файлы -wal и -shm
В режиме WAL рядом с базой создаются файлы -wal и -shm. Не удаляйте их при работающей БД: часть данных может быть только в WAL.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Режим WAL | PRAGMA journal_mode возвращает wal | Файлы WAL/SHM не удалять |
| Незавершённая запись | Процесс записи завершился без checkpoint | Завершить подключения и согласовать checkpoint |
| Копирование только .sqlite | Копируется только основной файл .db при активной записи | Применить согласованную .backup |
| Права | Создание файлов WAL запрещено в каталоге | Проверить права и файловую систему |
#Пошаговое решение
- Определите режим журнала для своей базыОткройте терминал там, где хранится SQLite-файл, и через
sqlite3 app.db "PRAGMA journal_mode;"проверьте режим, заменивapp.dbна настоящий путь. Ответwalозначает журнал упреждающей записи: файлapp.db-walсодержит недавно записанные страницы, аapp.db-shmслужит для координации подключений. Наличие этих файлов — само по себе не ошибка и не признак вируса. - Не удаляйте -wal и -shm вручнуюПока приложение или любой другой процесс использует базу, не стирайте
-walи-shm, даже если они выглядят большими: в WAL могут находиться изменения, ещё не попавшие в основной.db. Не делайте резервную копию только.dbчерез Проводник при активной записи. Вместо этого используйте SQLite backup API либо команду.backupв sqlite3 для согласованной копии. - Если журнал растёт, найдите долгого читателяПроверьте, нет ли в приложении транзакций, оставленных открытыми после SELECT, и все ли курсоры и соединения закрываются. После устранения длительных чтений можно выполнить
sqlite3 app.db "PRAGMA wal_checkpoint(TRUNCATE);"в согласованное окно обслуживания. Эта команда может не сократить WAL, если другой процесс удерживает снимок данных; результат pragma показывает состояние контрольной точки. Не пытайтесь принудительно удалять файлы при busy. - Проверьте целостность и надёжность хранилищаЗакройте клиентские соединения штатно, запустите
sqlite3 app.db "PRAGMA integrity_check;"и убедитесь, что результатok. Если база находится на сетевой файловой системе, учтите ограничения WAL на работу между разными компьютерами; обсудите перенос на локальный диск сервера. Если приложение снова быстро накапливает WAL, проверяйте продолжительность транзакций и процесс создания резервных копий, а не размер файла как отдельную ошибку.
#Если не помогло
Не удаляйте файлы -wal и -shm у работающей базы: возможна потеря последних изменений.
#Если проблема осталась
Если «SQLite: файлы -wal и -shm — что это и можно ли их удалять» повторяется, сохраните время, состояние подключения и точный текст ошибки. Не меняйте сразу несколько настроек — иначе станет трудно понять, какое действие повлияло на результат.