SQLite SQLiteLinuxWindowsPHPPython

SQLite: После резервного копирования не хватает последних изменений базы

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

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

Если восстановленная SQLite-база не содержит последние изменения, частая причина — копирование только основного файла .db при активном WAL. Нужна проверка снимка резервной копии, времени фиксации и правильный механизм онлайн-копирования.

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

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

Если восстановленная SQLite-база не содержит последние изменения, частая причина — копирование только основного файла .db при активном WAL. Нужна проверка снимка резервной копии, времени фиксации и правильный механизм онлайн-копирования.

Характерный признак: После восстановления база открывается без ошибок, но нет последних заказов или записей; на момент копирования рядом с исходной базой был файл -wal.

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

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

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

  1. 1. Остановите попытки перезаписать источникЕсли исходная база ещё доступна, сохраните её штатным механизмом и отдельно сохраните резервный файл для разбора. Не начинайте «восстановление поверх» и не удаляйте -wal / -shm.
  1. 2. Сравните пути, размеры и временаВ журнале резервного копирования найдите время запуска и завершения. На Linux посмотрите времена файлов; при большом расхождении проверьте часовой пояс сервера и синхронизацию времени.
  2. Дополнительная команда по теме
    Linux · Терминал (Bash)Команда
    Только чтение; файлы и пути должны существовать, вывод показывает размер и время изменения.
    stat -c '%n %s байт %y' /srv/app/data/app.db /srv/backups/app-backup.db
  1. 3. Откройте резервную копию только для чтенияПроверьте, открывается ли файл, и сравните число строк в критичной таблице. Используйте реальные имена таблиц и условие по timestamp/ID, не публикуйте персональные данные в отчёте.
  2. Ожидается ok; проверка целостности не доказывает полноту копии
    Linux · Терминал (Bash)Команда
    Ожидается ok; проверка целостности не доказывает полноту копии.
    sqlite3 -readonly /srv/backups/app-backup.db 'PRAGMA integrity_check;'
  1. 4. Найдите запись с максимальным подтверждённым временемСравните на исходнике и копии агрегаты COUNT(*), MAX(id), MAX(created_at) для одной важной таблицы; отсутствие последних строк при исправной схеме указывает на устаревший снимок.
  2. orders и id — пример; заменить на реальные таблицу и первичный ключ
    Linux · Терминал (Bash)Команда
    orders и id — пример; заменить на реальные таблицу и первичный ключ.
    sqlite3 -readonly /srv/backups/app-backup.db 'SELECT COUNT(*), MAX(id) FROM orders;'
  1. 5. Уточните режим журнала и процедуру копированияЕсли источник работает в WAL, проверьте, не используется ли простой cp, rsync одного файла или архиватор, который игнорирует -wal. SQLite рекомендует Online Backup API либо VACUUM INTO, а не копирование одного активного .db.
  1. 6. Получите свежую согласованную копию источникаНа работающем SQLite используйте встроенную команду sqlite3 .backup с новым, несуществующим именем файла назначения; перед запуском обеспечьте свободное место и проверьте путь. Команда использует Online Backup API.
    Linux · Терминал (Bash)С осторожностью
    Создаёт/перезаписывает файл назначения: убедитесь, что имя новое и нет важного файла. Команда должна завершиться без сообщения об ошибке; понадобится право читать источник и писать в каталог копии.
    sqlite3 /srv/app/data/app.db '.backup /srv/backups/app-consistent.db'

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

  1. 7. Проверьте свежую копию и зафиксируйте времяЗапустите integrity_check, сравните ключевые счётчики и при необходимости разверните копию в отдельную тестовую среду. Новые записи, сделанные после создания снимка, закономерно отсутствуют.
  1. 8. Исправьте расписание резервирования и проверьте восстановлениеНастройте регулярный API-бэкап, сохраняйте время создания, контрольную сумму и место хранения. Раз в установленный период разворачивайте архив отдельно и проверяйте целостность и актуальность тестовых данных.

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

Новая резервная копия проходит integrity_check, содержит строки до момента снимка, а регламент восстановления не копирует живой WAL отдельным файлом.

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

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

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

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

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