#Что происходит и когда инструкция применима
PRAGMA integrity_check позволяет проверить внутреннюю согласованность SQLite и выявить повреждения страниц и индексов. Проверку желательно делать на согласованной копии; результат ok не гарантирует корректности внешних ключей, бизнес-данных или актуальности резервной копии.
Характерный признак: Требуется проверить здоровье SQLite после сбоя, перед миграцией или регулярно в рамках проверки резервных копий; видимой ошибки может не быть.
#Как отличить возможные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Повреждены страницы или индексыНакопитель или аварийное завершение могло повредить структуру SQLite | integrity_check возвращает текст о нарушениях | Изолировать копию и восстановить |
| Ошибки внешних ключейintegrity_check не проверяет FK | integrity_check = ok, foreign_key_check выдаёт строки | Проверить внешние ключи отдельно |
| Проверена неправильная копияОтносительный путь указывает на новую пустую базу | Файл необычно мал или список таблиц пуст | Открывать только существующий файл |
#Пошаговая диагностика и исправление
- 1. Найдите конкретный файл SQLiteУзнайте абсолютный путь из настроек приложения, затем проверьте его существование и размер. Не запускайте sqlite3 с ошибочным путём: без флага только чтения можно случайно создать пустой файл.
- Linux; выводит путь и размер, не изменяет файлLinux · Терминал (Bash)КомандаLinux; выводит путь и размер, не изменяет файл.
test -f /srv/app/data/app.db && stat -c '%n %s' /srv/app/data/app.db
- 2. Сделайте согласованную копию для проверкиЕсли база активно используется, используйте штатную команду .backup с новым целевым файлом, а не копирование одного .db без WAL. Убедитесь, что в месте назначения достаточно свободного пространства.
- Дополнительная команда по темеLinux · Терминал (Bash)С осторожностьюСоздаёт/перезаписывает файл назначения: перед запуском проверьте его отсутствие или безопасное имя.
sqlite3 /srv/app/data/app.db '.backup /srv/backups/app-check.db'Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 3. Запустите полную проверку на копииВ терминале выполнить integrity_check: единственная строка ok означает, что проверяемые внутренние структуры прошли тест; любые другие строки — повод остановить обновления.
- Ожидается одна строка okLinux · Терминал (Bash)КомандаОжидается одна строка ok. Не является доказательством отсутствия логических ошибок данных.
sqlite3 -readonly /srv/backups/app-check.db 'PRAGMA integrity_check;'
- 4. Если проверка слишком долгая, используйте быструю предварительнуюquick_check делает сокращённую проверку и может пропускать ошибки индексов и уникальности. Это дополнение для мониторинга, а не замена полной проверки перед восстановлением.
- Чтение; ожидается ok в пределах сокращённой проверкиLinux · Терминал (Bash)КомандаЧтение; ожидается ok в пределах сокращённой проверки.
sqlite3 -readonly /srv/backups/app-check.db 'PRAGMA quick_check;'
- 5. Проверяйте внешние ключи отдельноВ sqlite3 на копии запросите foreign_key_check; отсутствие строк означает, что нарушения внешних ключей не обнаружены. Если строки есть, зафиксируйте таблицу, rowid, родителя и индекс ограничения.Linux · Терминал (Bash)КомандаПри отсутствии нарушений вывод пустой. Не исправляет данные.
sqlite3 -readonly /srv/backups/app-check.db 'PRAGMA foreign_key_check;'
- 6. Сохраните диагностический результатЗапишите дату, абсолютный путь исходной и контрольной копий, версию SQLite, число строк-ошибок и контрольные суммы. Не включайте пользовательские записи в общедоступные логи.
- 7. При обнаружении повреждений остановите изменяющие операцииСначала проверьте наличие более свежей исправной резервной копии. Если её нет, согласуйте восстановление .recover с экспертом строго на отдельном файле; затем проверяйте полноту таблиц и ссылок. Повреждённый оригинал не переписывайте.
- 8. Настройте повторную проверку восстановлениемРегулярно проверяйте отдельные резервные копии и выборочные контрольные данные после тестового восстановления. Значение ok подтверждает только определённый набор структурных проверок, не отсутствие потери свежих транзакций.
#Как проверить исправление
Для проверенной копии integrity_check выводит ровно ok, foreign_key_check не выводит нарушений, а тестовое приложение читает необходимые таблицы.
#Если исправление не помогло
При любом выводе кроме ok передайте копию и журнал системных ошибок специалисту, проверьте носитель и предыдущие архивы; не запускайте VACUUM на повреждённом оригинале.