#Что происходит и когда инструкция применима
Для резервного копирования активно используемой SQLite нужно получать согласованный снимок с помощью Online Backup API, sqlite3 .backup или VACUUM INTO, а не простым cp открытого файла .db в режиме WAL.
Характерный признак: Нужно организовать бэкап сайта без длительной остановки, сохранив последние зафиксированные данные и возможность проверить восстановление.
#Как отличить возможные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неполная копия WALcp одного файла .db может исключить зафиксированные кадры -wal | В копии нет последних строк | Использовать .backup |
| Копия заменяет старую хорошуюПовторный бэкап пишет поверх единственного архива | Потерян предыдущий экземпляр | Уникальные имена и ротация |
| Нет теста восстановленияФайл есть, но не проверялся | integrity_check не выполняется | Регулярная проверка копии |
#Пошаговая диагностика и исправление
- 1. Определите исходный файл и режим журналаПосмотрите абсолютный путь в конфигурации приложения. Убедитесь, что он существует и содержит необходимые таблицы; SQLite с ошибочным путём может создать пустую базу, поэтому сначала выполните test -f.Linux · Терминал (Bash)КомандаLinux; чтение существующей базы. Вывод wal либо delete, в зависимости от настроек.
test -f /srv/app/data/app.db && sqlite3 -readonly /srv/app/data/app.db 'PRAGMA journal_mode;'
- 2. Подготовьте каталог для резервных копийВыберите папку вне публичного /www, доступную только ограниченной учётной записи. Убедитесь, что хватает свободного места, и укажите новое имя файла со временем в названии; не перезаписывайте единственный архив.
- Только чтениеLinux · Терминал (Bash)КомандаТолько чтение. Ожидается достаточно места под полную копию плюс запас.
df -h /srv/backups
- 3. Выполните онлайн-копирование через sqlite3 .backupВ терминале с SQLite CLI используйте одноразовое имя назначения, проверив его отсутствие. .backup использует Online Backup API и формирует согласованный снимок, пока приложение продолжает работать.Linux · Терминал (Bash)С осторожностьюСоздаёт или ПЕРЕЗАПИСЫВАЕТ файл назначения; имя и время — пример, задайте новое и проверьте его отсутствие перед выполнением.
sqlite3 /srv/app/data/app.db '.backup /srv/backups/app-20261102-1800.db'Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 4. Проверьте завершение команды и размерыЕсли терминал вернул ошибку прав, нехватки места или блокировки, не помечайте копию как готовую. При успехе проверьте размер и отсутствие неожиданно пустой схемы; автоматический скрипт должен проверять код завершения процесса.
- 5. Проверьте структурную целостность архиваОткройте именно резервный файл только на чтение и выполните PRAGMA integrity_check. Ожидается одна строка ok; отдельно проверьте foreign_key_check, если приложение использует ограничения.
- Только чтениеLinux · Терминал (Bash)КомандаТолько чтение. Если есть сообщения вместо ok, не используйте этот архив для восстановления.
sqlite3 -readonly /srv/backups/app-20261102-1800.db 'PRAGMA integrity_check;'
- 6. Сравните контрольные данные, не раскрывая содержимоеДля важных таблиц сравните COUNT(*) и MAX(id) на копии с ожидаемым моментом создания снимка. Учтите, что новые COMMIT после начала бэкапа не обязаны присутствовать.
- 7. Проведите пробное восстановление в отдельное местоЗапустите тестовую версию приложения, указывающую на копию резервной базы в отдельном каталоге, без доступа к рабочей базе; проверьте реальные запросы чтения. Никогда не заменяйте рабочую базу на этапе теста.
- 8. Автоматизируйте, защитите и проверяйте ротациюЗапланируйте регулярное создание копии с уникальным именем, сохранением кода выхода, журналом времени/контрольной суммы и ограниченным доступом. Ротацию проводите только после проверки нового архива; держите также внешнюю копию на другом носителе.
#Как проверить исправление
Каждый новый архив создан штатным API, проходит integrity_check и пробное чтение, имеет зафиксированное время и доступен для восстановления в отдельной среде.
#Если исправление не помогло
Если .backup не заканчивается на нагруженной базе, проверьте свободное место, доступ к каталогу, длительные транзакции и нагрузку; организуйте короткое согласованное окно обслуживания, не подменяйте онлайн-копирование обычным cp.