SQLite SQLiteLinuxWindowsPHPPython

SQLite: Как сделать безопасную резервную копию SQLite при работающем приложении

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

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

Для резервного копирования активно используемой SQLite нужно получать согласованный снимок с помощью Online Backup API, sqlite3 .backup или VACUUM INTO, а не простым cp открытого файла .db в режиме WAL.

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

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

Для резервного копирования активно используемой SQLite нужно получать согласованный снимок с помощью Online Backup API, sqlite3 .backup или VACUUM INTO, а не простым cp открытого файла .db в режиме WAL.

Характерный признак: Нужно организовать бэкап сайта без длительной остановки, сохранив последние зафиксированные данные и возможность проверить восстановление.

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

Возможная причинаКак узнатьЧто делать
Неполная копия WALcp одного файла .db может исключить зафиксированные кадры -walВ копии нет последних строкИспользовать .backup
Копия заменяет старую хорошуюПовторный бэкап пишет поверх единственного архиваПотерян предыдущий экземплярУникальные имена и ротация
Нет теста восстановленияФайл есть, но не проверялсяintegrity_check не выполняетсяРегулярная проверка копии

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

  1. 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;'
  1. 2. Подготовьте каталог для резервных копийВыберите папку вне публичного /www, доступную только ограниченной учётной записи. Убедитесь, что хватает свободного места, и укажите новое имя файла со временем в названии; не перезаписывайте единственный архив.
  2. Только чтение
    Linux · Терминал (Bash)Команда
    Только чтение. Ожидается достаточно места под полную копию плюс запас.
    df -h /srv/backups
  1. 3. Выполните онлайн-копирование через sqlite3 .backupВ терминале с SQLite CLI используйте одноразовое имя назначения, проверив его отсутствие. .backup использует Online Backup API и формирует согласованный снимок, пока приложение продолжает работать.
    Linux · Терминал (Bash)С осторожностью
    Создаёт или ПЕРЕЗАПИСЫВАЕТ файл назначения; имя и время — пример, задайте новое и проверьте его отсутствие перед выполнением.
    sqlite3 /srv/app/data/app.db '.backup /srv/backups/app-20261102-1800.db'

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

  1. 4. Проверьте завершение команды и размерыЕсли терминал вернул ошибку прав, нехватки места или блокировки, не помечайте копию как готовую. При успехе проверьте размер и отсутствие неожиданно пустой схемы; автоматический скрипт должен проверять код завершения процесса.
  1. 5. Проверьте структурную целостность архиваОткройте именно резервный файл только на чтение и выполните PRAGMA integrity_check. Ожидается одна строка ok; отдельно проверьте foreign_key_check, если приложение использует ограничения.
  2. Только чтение
    Linux · Терминал (Bash)Команда
    Только чтение. Если есть сообщения вместо ok, не используйте этот архив для восстановления.
    sqlite3 -readonly /srv/backups/app-20261102-1800.db 'PRAGMA integrity_check;'
  1. 6. Сравните контрольные данные, не раскрывая содержимоеДля важных таблиц сравните COUNT(*) и MAX(id) на копии с ожидаемым моментом создания снимка. Учтите, что новые COMMIT после начала бэкапа не обязаны присутствовать.
  1. 7. Проведите пробное восстановление в отдельное местоЗапустите тестовую версию приложения, указывающую на копию резервной базы в отдельном каталоге, без доступа к рабочей базе; проверьте реальные запросы чтения. Никогда не заменяйте рабочую базу на этапе теста.
  1. 8. Автоматизируйте, защитите и проверяйте ротациюЗапланируйте регулярное создание копии с уникальным именем, сохранением кода выхода, журналом времени/контрольной суммы и ограниченным доступом. Ротацию проводите только после проверки нового архива; держите также внешнюю копию на другом носителе.

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

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

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

Если .backup не заканчивается на нагруженной базе, проверьте свободное место, доступ к каталогу, длительные транзакции и нагрузку; организуйте короткое согласованное окно обслуживания, не подменяйте онлайн-копирование обычным cp.

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

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

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