我有一个sqlite3数据库,我需要读取(不写)坐在只读文件系统上。还有一个与数据库关联的-journal文件,它干扰了打开数据库,因为sqlite代码想要做的第一件事是删除-journal文件,但它不能,因为文件系统是只读的。将journal_mode设置为off无济于事,因为这显然只适用于新事务。有没有办法告诉sqlite3简单地忽略所有提及与数据库关联的-journal文件?
答案 0 :(得分:3)
不幸的是没有。
问题是日志文件的存在表明事务处于不完整状态,需要通过将日志文件的内容传回数据库文件来回滚。
这需要对文件系统进行写访问,并且SQLite不允许您在不执行此回滚的情况下打开文件。
您可以在此处详细了解:Read-Only Databases:
如果SQLite数据库位于只读介质上并且需要恢复,则它是否可读(无论是否为WAL模式)。因此,例如,如果应用程序崩溃并使用热日志离开SQLite数据库,则除非打开进程对数据库文件,包含数据库文件的目录和热日志具有写权限,否则无法打开该数据库。这是因为必须在读取数据库之前回滚从崩溃中遗留的未完成事务,并且如果没有对所有文件和包含它们的目录的写权限,则不会发生回滚。
如果您不关心丢弃日志文件可能导致的损坏,您可以复制数据库文件,并将日记留在后面。但是,如果您有能力这样做,我实际上也会将日志文件复制到可写文件系统,并正常打开该数据库,这将正确回滚事务。
虽然只读文件系统上的副本在当前状态下不可用。