Что происходит технически, когда база данных Sqlite повреждена и как ее обнаружить?

Я выполняю задачу обработки повреждения базы данных, поэтому я прошел через SQLite Как повредить базу данных SQLite и SO Как проверить, является ли файл базы данных действительным / непротиворечивым.

Но у меня есть более конкретные вопросы, которые могут помочь и другим. Булевы ответы в порядке

  1. Если файл базы данных sqlite поврежден, смогу ли я открыть его? Иногда или всегда?
  2. Если answer1 - "да", и я его открываю, могут ли операции чтения / записи привести к сбою моего приложения или просто вернут ошибку, которую можно обработать?
  3. Если произойдет повреждение, могут ли некоторые из моих следующих (следующих) операций чтения / записи завершиться успешно или каждая операция чтения / записи вернет ошибку?
  4. Может после успешного создания и закрытия файла базы данных я использую md5sum обнаружить любое повреждение в следующем открытии файла, если я хочу избежать quick_check а также integrity_check как они медленнее?

1 ответ

Сама природа поврежденных данных заключается в том, что, если вы не выполните тщательный процесс проверки, все ставки отменены. Все может случиться. Свиньи могут летать. Кто знает.

Ответы на ваши вопросы:

  1. Иногда да. Поскольку SQLite не проверяет всю базу данных при ее открытии, у него нет возможности узнать, что файл поврежден, если только он не прочитает поврежденные данные во время открытия.
  2. Скорее всего, сбойные операции завершатся таким образом, что вы сможете справиться. Если в SQLite есть ошибки, которые можно использовать, например, ошибки переполнения буфера или тому подобное, тогда все ставки отключены, но нет никаких признаков того, что такие вещи существуют.
  3. Некоторые могут работать, некоторые могут потерпеть неудачу, нет способа узнать заранее.
  4. Вы не можете обнаружить поврежденную базу данных SQLite, используя MD5. Для начала, каким должно быть правильное значение MD5? Единственный способ узнать это - рассчитать его по файлу, что вы также должны сделать, чтобы проверить.

Короче говоря, если не выполнять pragma integrity_check; периодически у вас нет никаких гарантий того, как SQLite будет обрабатывать поврежденную базу данных.

В качестве примера, что, если происходит повреждение, из-за которого база данных выглядит корректной, за исключением того, что она больше не содержит исходных данных, хранящихся в ней пользователем?

Другие вопросы по тегам