【问题标题】:Opening a sqlite3 DB on a read-only filesystem with a -journal file使用 -journal 文件在只读文件系统上打开 sqlite3 数据库
【发布时间】:2011-12-18 22:57:56
【问题描述】:

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

【问题讨论】:

  • 如果是只读的,为什么文件系统上有日志文件?
  • 从可写文件系统创建时它就在那里。

标签: sqlite journal


【解决方案1】:

很遗憾没有。

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

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

您可以在此处阅读更多相关信息:Read-Only Databases:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-12
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2014-06-01
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多