我有一个需要读取(而不是写入)位于只读文件系统上的sqlite3数据库。还有一个与数据库相关联的-journal文件,它会干扰打开数据库,因为sqlite代码要做的第一件事就是删除-journal文件,但由于文件系统是只读的,因此无法删除该文件。将journal_mode设置为off没有帮助,因为这显然只适用于新事务。是否有一种方法可以告诉sqlite3简单地忽略与DB相关的-journal文件的所有提及?
可惜没有。
问题是日志文件的存在表明事务处于未完成状态,需要通过将日志文件的内容传输回数据库文件来回滚。
这需要对文件系统进行写访问,如果不执行此回滚,SQLite将不允许您打开文件。
你可以在这里了解更多:只读数据库:
如果SQLite数据库位于只读介质上并且需要恢复,那么它(无论是否为WAL模式)都是可读的。因此,例如,如果应用程序崩溃并留下一个带有热日志的SQLite数据库,则该数据库不能被打开,除非打开进程对数据库文件、包含数据库文件的目录和热日志具有写权限。这是因为必须在读取数据库之前回滚崩溃留下的不完整事务,并且如果没有对所有文件和包含它们的目录的写权限,则回滚不能发生。
如果你不关心丢弃日志文件可能导致的损坏,你可以做一个数据库文件的副本,并留下日志。但是,如果您有能力这样做,我实际上也会将日志文件复制到一个可写的文件系统中,并像正常一样打开该数据库,这将正确回滚事务。
只读文件系统上的副本在当前状态下是不可用的