#sqlite #journal
#sqlite #журнал
Вопрос:
У меня есть база данных sqlite3, которую мне нужно прочитать (не записать), находящаяся в файловой системе, доступной только для чтения. С базой данных также связан файл -journal, который мешает открытию базы данных, потому что первое, что хочет сделать код sqlite, это удалить этот файл -journal, а это невозможно, поскольку файловая система доступна только для чтения. Установка journal_mode в значение off не помогает, поскольку это, по-видимому, относится только к новым транзакциям. Есть ли способ указать sqlite3 просто игнорировать все упоминания о файле -journal, связанном с БД?
Комментарии:
1. Почему в файловой системе есть файл журнала, если он доступен только для чтения?
2. Он был там, когда он был создан из файловой системы с возможностью записи.
Ответ №1:
К сожалению, нет.
Проблема в том, что существование файла журнала указывает на то, что транзакция осталась в незавершенном состоянии, и ее необходимо откатить путем переноса содержимого файла журнала обратно в файл базы данных.
Для этого требуется доступ на запись в файловую систему, и SQLite не позволит вам открыть файл без выполнения этого отката.
Подробнее об этом можно прочитать здесь: Базы данных, доступные только для чтения:
Ни одна база данных SQLite (независимо от того, находится ли она в режиме WAL или нет) не доступна для чтения, если она находится на носителе, доступном только для чтения, и требует восстановления. Так, например, если приложение выходит из строя и оставляет базу данных SQLite с горячим журналом, эта база данных не может быть открыта, если процесс открытия не имеет права записи в файл базы данных, каталог, содержащий файл базы данных, и горячий журнал. Это связано с тем, что незавершенная транзакция, оставшаяся после сбоя, должна быть откатана до чтения базы данных, и этот откат не может произойти без разрешения на запись для всех файлов и каталога, содержащего их.
Если вас не волнует возможное повреждение, к которому может привести удаление файла журнала, вы можете сделать копию файла базы данных и оставить журнал. Хотя, если у вас есть возможность это сделать, я бы на самом деле скопировал и файл журнала в файловую систему с возможностью записи и открыл эту базу данных в обычном режиме, что привело бы к правильному откату транзакции.
Однако копия в файловой системе, доступной только для чтения, недоступна в ее текущем состоянии.