Что происходит технически, когда база данных Sqlite повреждена и как ее обнаружить?
Я выполняю задачу обработки повреждения базы данных, поэтому я прошел через SQLite Как повредить базу данных SQLite и SO Как проверить, является ли файл базы данных действительным / непротиворечивым.
Но у меня есть более конкретные вопросы, которые могут помочь и другим. Булевы ответы в порядке
- Если файл базы данных sqlite поврежден, смогу ли я открыть его? Иногда или всегда?
- Если answer1 - "да", и я его открываю, могут ли операции чтения / записи привести к сбою моего приложения или просто вернут ошибку, которую можно обработать?
- Если произойдет повреждение, могут ли некоторые из моих следующих (следующих) операций чтения / записи завершиться успешно или каждая операция чтения / записи вернет ошибку?
- Может после успешного создания и закрытия файла базы данных я использую
md5sum
обнаружить любое повреждение в следующем открытии файла, если я хочу избежатьquick_check
а такжеintegrity_check
как они медленнее?
1 ответ
Сама природа поврежденных данных заключается в том, что, если вы не выполните тщательный процесс проверки, все ставки отменены. Все может случиться. Свиньи могут летать. Кто знает.
Ответы на ваши вопросы:
- Иногда да. Поскольку SQLite не проверяет всю базу данных при ее открытии, у него нет возможности узнать, что файл поврежден, если только он не прочитает поврежденные данные во время открытия.
- Скорее всего, сбойные операции завершатся таким образом, что вы сможете справиться. Если в SQLite есть ошибки, которые можно использовать, например, ошибки переполнения буфера или тому подобное, тогда все ставки отключены, но нет никаких признаков того, что такие вещи существуют.
- Некоторые могут работать, некоторые могут потерпеть неудачу, нет способа узнать заранее.
- Вы не можете обнаружить поврежденную базу данных SQLite, используя MD5. Для начала, каким должно быть правильное значение MD5? Единственный способ узнать это - рассчитать его по файлу, что вы также должны сделать, чтобы проверить.
Короче говоря, если не выполнять pragma integrity_check;
периодически у вас нет никаких гарантий того, как SQLite будет обрабатывать поврежденную базу данных.
В качестве примера, что, если происходит повреждение, из-за которого база данных выглядит корректной, за исключением того, что она больше не содержит исходных данных, хранящихся в ней пользователем?