2011-10-31 68 views
2

我有一个sqlite3数据库,需要读取(不能写入)坐在只读文件系统上。还有一个与数据库相关的-journal文件,它干扰打开数据库,因为sqlite代码想要做的第一件事是删除该-journal文件,并且它不能因为该文件系统是只读的。将journal_mode设置为off不会有帮助,因为这显然只适用于新事务。有没有办法告诉sqlite3简单地忽略与数据库关联的-journal文件的所有提及?使用-journal文件在只读文件系统上打开sqlite3数据库

+0

为什么在文件系统上存在日志文件(如果它是只读的)? –

+0

它是从可写文件系统创建的。 – ericg

回答

3

不幸的是没有。

问题是日志文件的存在表明事务处于未完成状态,需要通过将日志文件的内容传回数据库文件来回退。

这需要对文件系统的写入权限,并且SQLite将不允许您在不执行此回滚的情况下打开文件。

你可以阅读更多关于此这里:Read-Only Databases

没有SQLite数据库(不论它是否是WAL模式)是可读的,如果它位于只读介质,它需要恢复。因此,例如,如果应用程序崩溃并使用热日志保留SQLite数据库,则除非打开过程对数据库文件,包含数据库文件的目录和热日志具有写权限,否则无法打开该数据库。这是因为在读取数据库之前必须回滚崩溃遗留的未完成事务,并且如果没有对所有文件和包含它们的目录的写入权限,则无法执行回滚。

如果您不关心丢弃日志文件可能导致的损坏情况,则可以复制数据库文件并留下日记。但是,如果您有能力这样做,我实际上也会将日志文件复制到可写入的文件系统,然后像平常一样打开该数据库,这将正确地回滚事务。

只读文件系统上的副本虽然在当前状态下不可用。

相关问题