Открытие базы данных sqlite3 в файловой системе только для чтения с файлом -journal - PullRequest
2 голосов
/ 31 октября 2011

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

1 Ответ

3 голосов
/ 01 ноября 2011

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

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

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

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

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

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

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

...