SQLite LinuxWindowsmacOS

Почему резервная копия SQLite не содержит последние подтверждённые записи

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

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

В режиме WAL подтверждённые транзакции могут некоторое время храниться в файле базы с суффиксом -wal, а основной .db отставать. Если копию сделали обычным копированием только .db, в восстановленном файле могут отсутствовать самые свежие записи, даже если PRAGMA integrity_check возвращает ok. Правильная копия работающей базы создаётся через SQLite Online Backup API или штатную команду .backup; это не то же самое, что копирование файла.

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

#Что происходит и когда возникает

В режиме WAL подтверждённые транзакции могут некоторое время храниться в файле базы с суффиксом -wal, а основной .db отставать. Если копию сделали обычным копированием только .db, в восстановленном файле могут отсутствовать самые свежие записи, даже если PRAGMA integrity_check возвращает ok. Правильная копия работающей базы создаётся через SQLite Online Backup API или штатную команду .backup; это не то же самое, что копирование файла.

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

Возможная причинаКак узнатьЧто делать
Скопирован только .db при активном WALЧасть подтверждённых транзакций ещё оставалась в журнале.В резервной копии есть старые записи, но отсутствуют последние, а в источнике был файл -wal.Искать согласованную копию и безопасно создавать новую через backup API.
Восстановили не ту версию файлаРезервные копии различаются временем и каталогами.В журнале развертывания указан другой путь или дата.Сопоставить контрольные идентификаторы и время копии.
Копию создали до завершения операцииСама транзакция могла ещё не совершить COMMIT.В журнале приложение сообщает успешную отправку запроса, но нет подтверждённого коммита.Проверить транзакционную семантику и источник истины.

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

  1. Остановите запись в восстановленный экземплярЕсли пропали записи, не выполняйте повторные операции, которые могут создать дубли, особенно платежи и заказы. Сохраните восстановленную базу как вещественное свидетельство с отдельным именем. Не пытаетесь вручную склеивать WAL с другой базой — у них может быть несовместимое состояние.
  2. Установите источник и дату копииПо журналу резервирования выясните исходный путь, время создания, использовались ли .backup/Online Backup API либо обычное копирование. Запишите размер файлов и контрольные идентификаторы последних записей. Не путайте время создания архива и фактическое время согласованного снимка.
  3. Проверьте существование исходной базы с WALЕсли оригинал ещё доступен, ничего не удаляйте из его каталога. Посмотрите, присутствует ли -wal и можно ли штатным приложением прочитать последние записи. Если источник работает, сделайте новую согласованную копию через API/.backup в отдельный файл, прежде чем менять восстановление.
  4. Создайте новую согласованную копию штатным способомОткройте терминал Linux/macOS либо Windows Terminal с установленной официальной утилитой sqlite3. Перейдите в каталог, где есть права чтения исходной базы и создания нового файла, выполните пример .backup с конкретными именами. Проверьте, что файл назначения создан; если файл уже существует, выберите другое имя, не перезаписывайте единственную копию.
  5. Проверьте целостность и контрольные записиПодключите только что созданную копию в изолированном окружении и запустите PRAGMA integrity_check;. Ожидается ok. Проверьте существование 2–3 последних подтверждённых записей по их известным идентификаторам; наличие ok не гарантирует, что копия содержит нужный момент времени.
  6. Сравните с прежним восстановлением без замены работающей базыОткройте обе копии отдельно (желательно с mode=ro) и сравните число записей и идентификаторы на выбранный момент. Если новая копия полнее, согласуйте её восстановление через штатную процедуру приложения, учитывая изменения, появившиеся на работающем восстановленном экземпляре.
  7. Если оригинального WAL нет, зафиксируйте пределы восстановленияЕсли существуют только старый .db и резервная копия без WAL, отсутствующие подтверждённые транзакции могут быть невосстановимы средствами SQLite. Ищите другие проверенные резервные копии, журнал приложения и внешние подтверждения. Никакая PRAGMA integrity_check не возвращает отсутствующие данные. Передайте случай владельцу данных.
  8. Исправьте последующее резервное копированиеВ расписании используйте Online Backup API или .backup в новый файл, затем выполняйте контроль целостности и проверку контрольных записей. Периодически проверяйте восстановление на отдельном стенде. В отсутствие согласованного снимка не копируйте один лишь .db на работающем сервере.

#Команды и проверочные примеры

Linux · Терминал (Bash)С осторожностью
Пример в каталоге тестовой базы; app.db и new-consistent-backup.db замените проверенными путями. Не используйте уже существующее имя целевого файла.
sqlite3 app.db ".backup new-consistent-backup.db"

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

SQLКоманда
Открывайте для проверки новую изолированную копию. Ожидается ok и текущий режим журналирования.
PRAGMA integrity_check;
PRAGMA journal_mode;

#Как проверить результат

Восстановленная из согласованной копии база проходит integrity_check и содержит контрольные идентификаторы, которые были подтверждены до снимка. Повторите восстановление в тестовом каталоге и убедитесь, что сервис открывает именно эту копию.

#Если не помогло

Если свежие записи отсутствуют и в первоисточнике, установите их судьбу по журналу приложения и внешней системе. Не делайте вывод о потере всех данных по одному списку: проверьте фильтры запросов, даты и уникальные ключи.

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

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