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