#Что происходит и когда возникает
В режиме WAL подтверждённые транзакции могут некоторое время храниться в файле базы с суффиксом -wal, а основной .db отставать. Если копию сделали обычным копированием только .db, в восстановленном файле могут отсутствовать самые свежие записи, даже если PRAGMA integrity_check возвращает ok. Правильная копия работающей базы создаётся через SQLite Online Backup API или штатную команду .backup; это не то же самое, что копирование файла.
#Возможные причины: как различить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Скопирован только .db при активном WALЧасть подтверждённых транзакций ещё оставалась в журнале. | В резервной копии есть старые записи, но отсутствуют последние, а в источнике был файл -wal. | Искать согласованную копию и безопасно создавать новую через backup API. |
| Восстановили не ту версию файлаРезервные копии различаются временем и каталогами. | В журнале развертывания указан другой путь или дата. | Сопоставить контрольные идентификаторы и время копии. |
| Копию создали до завершения операцииСама транзакция могла ещё не совершить COMMIT. | В журнале приложение сообщает успешную отправку запроса, но нет подтверждённого коммита. | Проверить транзакционную семантику и источник истины. |
#Пошаговая диагностика и исправление
- Остановите запись в восстановленный экземплярЕсли пропали записи, не выполняйте повторные операции, которые могут создать дубли, особенно платежи и заказы. Сохраните восстановленную базу как вещественное свидетельство с отдельным именем. Не пытаетесь вручную склеивать WAL с другой базой — у них может быть несовместимое состояние.
- Установите источник и дату копииПо журналу резервирования выясните исходный путь, время создания, использовались ли .backup/Online Backup API либо обычное копирование. Запишите размер файлов и контрольные идентификаторы последних записей. Не путайте время создания архива и фактическое время согласованного снимка.
- Проверьте существование исходной базы с WALЕсли оригинал ещё доступен, ничего не удаляйте из его каталога. Посмотрите, присутствует ли -wal и можно ли штатным приложением прочитать последние записи. Если источник работает, сделайте новую согласованную копию через API/.backup в отдельный файл, прежде чем менять восстановление.
- Создайте новую согласованную копию штатным способомОткройте терминал Linux/macOS либо Windows Terminal с установленной официальной утилитой sqlite3. Перейдите в каталог, где есть права чтения исходной базы и создания нового файла, выполните пример .backup с конкретными именами. Проверьте, что файл назначения создан; если файл уже существует, выберите другое имя, не перезаписывайте единственную копию.
- Проверьте целостность и контрольные записиПодключите только что созданную копию в изолированном окружении и запустите PRAGMA integrity_check;. Ожидается ok. Проверьте существование 2–3 последних подтверждённых записей по их известным идентификаторам; наличие ok не гарантирует, что копия содержит нужный момент времени.
- Сравните с прежним восстановлением без замены работающей базыОткройте обе копии отдельно (желательно с mode=ro) и сравните число записей и идентификаторы на выбранный момент. Если новая копия полнее, согласуйте её восстановление через штатную процедуру приложения, учитывая изменения, появившиеся на работающем восстановленном экземпляре.
- Если оригинального WAL нет, зафиксируйте пределы восстановленияЕсли существуют только старый .db и резервная копия без WAL, отсутствующие подтверждённые транзакции могут быть невосстановимы средствами SQLite. Ищите другие проверенные резервные копии, журнал приложения и внешние подтверждения. Никакая PRAGMA integrity_check не возвращает отсутствующие данные. Передайте случай владельцу данных.
- Исправьте последующее резервное копированиеВ расписании используйте Online Backup API или .backup в новый файл, затем выполняйте контроль целостности и проверку контрольных записей. Периодически проверяйте восстановление на отдельном стенде. В отсутствие согласованного снимка не копируйте один лишь .db на работающем сервере.
#Команды и проверочные примеры
sqlite3 app.db ".backup new-consistent-backup.db"Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
PRAGMA integrity_check;PRAGMA journal_mode;#Как проверить результат
Восстановленная из согласованной копии база проходит integrity_check и содержит контрольные идентификаторы, которые были подтверждены до снимка. Повторите восстановление в тестовом каталоге и убедитесь, что сервис открывает именно эту копию.
#Если не помогло
Если свежие записи отсутствуют и в первоисточнике, установите их судьбу по журналу приложения и внешней системе. Не делайте вывод о потере всех данных по одному списку: проверьте фильтры запросов, даты и уникальные ключи.