2

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

4

1 回答 1

3

很不幸的是,不行。

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

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

您可以在此处阅读有关此内容的更多信息:只读数据库

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

如果您不关心丢弃日志文件可能导致的损坏,您可以制作数据库文件的副本,并将日志留在后面。但是,如果您有能力这样做,我实际上也会将日志文件复制到可写文件系统,然后正常打开该数据库,这将正确回滚事务。

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

于 2011-11-01T15:20:26.117 回答