Открытие базы данных sqlite3 в файловой системе, доступной только для чтения, с помощью файла -journal

#sqlite #journal

#sqlite #журнал

Вопрос:

У меня есть база данных sqlite3, которую мне нужно прочитать (не записать), находящаяся в файловой системе, доступной только для чтения. С базой данных также связан файл -journal, который мешает открытию базы данных, потому что первое, что хочет сделать код sqlite, это удалить этот файл -journal, а это невозможно, поскольку файловая система доступна только для чтения. Установка journal_mode в значение off не помогает, поскольку это, по-видимому, относится только к новым транзакциям. Есть ли способ указать sqlite3 просто игнорировать все упоминания о файле -journal, связанном с БД?

Комментарии:

1. Почему в файловой системе есть файл журнала, если он доступен только для чтения?

2. Он был там, когда он был создан из файловой системы с возможностью записи.

Ответ №1:

К сожалению, нет.

Проблема в том, что существование файла журнала указывает на то, что транзакция осталась в незавершенном состоянии, и ее необходимо откатить путем переноса содержимого файла журнала обратно в файл базы данных.

Для этого требуется доступ на запись в файловую систему, и SQLite не позволит вам открыть файл без выполнения этого отката.

Подробнее об этом можно прочитать здесь: Базы данных, доступные только для чтения:

Ни одна база данных SQLite (независимо от того, находится ли она в режиме WAL или нет) не доступна для чтения, если она находится на носителе, доступном только для чтения, и требует восстановления. Так, например, если приложение выходит из строя и оставляет базу данных SQLite с горячим журналом, эта база данных не может быть открыта, если процесс открытия не имеет права записи в файл базы данных, каталог, содержащий файл базы данных, и горячий журнал. Это связано с тем, что незавершенная транзакция, оставшаяся после сбоя, должна быть откатана до чтения базы данных, и этот откат не может произойти без разрешения на запись для всех файлов и каталога, содержащего их.

Если вас не волнует возможное повреждение, к которому может привести удаление файла журнала, вы можете сделать копию файла базы данных и оставить журнал. Хотя, если у вас есть возможность это сделать, я бы на самом деле скопировал и файл журнала в файловую систему с возможностью записи и открыл эту базу данных в обычном режиме, что привело бы к правильному откату транзакции.

Однако копия в файловой системе, доступной только для чтения, недоступна в ее текущем состоянии.