SQLite SQLiteLinuxWindowsPHPPython

SQLite: Как проверить целостность SQLite через PRAGMA integrity_check

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

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

PRAGMA integrity_check позволяет проверить внутреннюю согласованность SQLite и выявить повреждения страниц и индексов. Проверку желательно делать на согласованной копии; результат ok не гарантирует корректности внешних ключей, бизнес-данных или актуальности резервной копии.

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

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

PRAGMA integrity_check позволяет проверить внутреннюю согласованность SQLite и выявить повреждения страниц и индексов. Проверку желательно делать на согласованной копии; результат ok не гарантирует корректности внешних ключей, бизнес-данных или актуальности резервной копии.

Характерный признак: Требуется проверить здоровье SQLite после сбоя, перед миграцией или регулярно в рамках проверки резервных копий; видимой ошибки может не быть.

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

Возможная причинаКак узнатьЧто делать
Повреждены страницы или индексыНакопитель или аварийное завершение могло повредить структуру SQLiteintegrity_check возвращает текст о нарушенияхИзолировать копию и восстановить
Ошибки внешних ключейintegrity_check не проверяет FKintegrity_check = ok, foreign_key_check выдаёт строкиПроверить внешние ключи отдельно
Проверена неправильная копияОтносительный путь указывает на новую пустую базуФайл необычно мал или список таблиц пустОткрывать только существующий файл

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

  1. 1. Найдите конкретный файл SQLiteУзнайте абсолютный путь из настроек приложения, затем проверьте его существование и размер. Не запускайте sqlite3 с ошибочным путём: без флага только чтения можно случайно создать пустой файл.
  2. Linux; выводит путь и размер, не изменяет файл
    Linux · Терминал (Bash)Команда
    Linux; выводит путь и размер, не изменяет файл.
    test -f /srv/app/data/app.db && stat -c '%n %s' /srv/app/data/app.db
  1. 2. Сделайте согласованную копию для проверкиЕсли база активно используется, используйте штатную команду .backup с новым целевым файлом, а не копирование одного .db без WAL. Убедитесь, что в месте назначения достаточно свободного пространства.
  2. Дополнительная команда по теме
    Linux · Терминал (Bash)С осторожностью
    Создаёт/перезаписывает файл назначения: перед запуском проверьте его отсутствие или безопасное имя.
    sqlite3 /srv/app/data/app.db '.backup /srv/backups/app-check.db'

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

  1. 3. Запустите полную проверку на копииВ терминале выполнить integrity_check: единственная строка ok означает, что проверяемые внутренние структуры прошли тест; любые другие строки — повод остановить обновления.
  2. Ожидается одна строка ok
    Linux · Терминал (Bash)Команда
    Ожидается одна строка ok. Не является доказательством отсутствия логических ошибок данных.
    sqlite3 -readonly /srv/backups/app-check.db 'PRAGMA integrity_check;'
  1. 4. Если проверка слишком долгая, используйте быструю предварительнуюquick_check делает сокращённую проверку и может пропускать ошибки индексов и уникальности. Это дополнение для мониторинга, а не замена полной проверки перед восстановлением.
  2. Чтение; ожидается ok в пределах сокращённой проверки
    Linux · Терминал (Bash)Команда
    Чтение; ожидается ok в пределах сокращённой проверки.
    sqlite3 -readonly /srv/backups/app-check.db 'PRAGMA quick_check;'
  1. 5. Проверяйте внешние ключи отдельноВ sqlite3 на копии запросите foreign_key_check; отсутствие строк означает, что нарушения внешних ключей не обнаружены. Если строки есть, зафиксируйте таблицу, rowid, родителя и индекс ограничения.
    Linux · Терминал (Bash)Команда
    При отсутствии нарушений вывод пустой. Не исправляет данные.
    sqlite3 -readonly /srv/backups/app-check.db 'PRAGMA foreign_key_check;'
  1. 6. Сохраните диагностический результатЗапишите дату, абсолютный путь исходной и контрольной копий, версию SQLite, число строк-ошибок и контрольные суммы. Не включайте пользовательские записи в общедоступные логи.
  1. 7. При обнаружении повреждений остановите изменяющие операцииСначала проверьте наличие более свежей исправной резервной копии. Если её нет, согласуйте восстановление .recover с экспертом строго на отдельном файле; затем проверяйте полноту таблиц и ссылок. Повреждённый оригинал не переписывайте.
  1. 8. Настройте повторную проверку восстановлениемРегулярно проверяйте отдельные резервные копии и выборочные контрольные данные после тестового восстановления. Значение ok подтверждает только определённый набор структурных проверок, не отсутствие потери свежих транзакций.

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

Для проверенной копии integrity_check выводит ровно ok, foreign_key_check не выводит нарушений, а тестовое приложение читает необходимые таблицы.

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

При любом выводе кроме ok передайте копию и журнал системных ошибок специалисту, проверьте носитель и предыдущие архивы; не запускайте VACUUM на повреждённом оригинале.

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

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

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