【问题标题】:Reading from a locked SQLite3 database从锁定的 SQLite3 数据库中读取
【发布时间】:2011-01-19 02:27:37
【问题描述】:

我正在查看第三方进程拥有的 SQLite 数据库。它看起来被锁定并且有一个 *-journal 文件。我不知道锁是共享的还是独占的。

我希望从数据库中读取数据,即使它当前已被其他进程锁定。我只会从数据库中读取数据。

目前我在这方面失败了。只要第三方进程正在运行,我就会得到一个 SQLITE_BUSY 返回码。

我查看了 sqlite3_busy_handler,但这似乎不是解决方案。据我了解,这只允许实现重试机制。它似乎没有提供一种方法来忽略数据库被锁定的事实。

如何强制 SQLite 从该数据库中读取?

顺便说一句,我目前正在使用 FMDatabase API 包装器。这不使用 sqlite3_busy_handler。只要得到 SQLITE_BUSY 返回码,它就会无限循环。

【问题讨论】:

  • 你是怎么打开数据库的?
  • int err = sqlite3_open(databasePath, &db);还有其他方法吗?
  • 您有什么方法可以判断其他进程是否已失效或处于磁盘睡眠状态(可能)?锁(AFAIK)应该只用于写入。
  • 另一个进程运行良好。从 SQLite 文档中,我了解到 SQLite 在让我阅读之前会尝试使用日志回滚。

标签: c objective-c sqlite


【解决方案1】:

我一直在对此进行一些研究,看起来有一些(非常不受欢迎的)选项。

  • 杀死已锁定数据库的进程

这可能不适合你,也不适合我。

  • 复制文件并阅读副本

这似乎是解决此问题的最佳方法。就我而言,我正在尝试读取 Firefox sqlite 数据库。 Firefox 似乎会长时间锁定文件,所以我不能等待。

因为您正在复制一个实时数据库文件,所以您可能会得到一个损坏的副本。我不认为有损坏原件的风险(但我不确定)。

只需将文件复制到shell上就可以了

copy original.sqlite copy.sqlite

cp  original.sqlite copy.sqlite

然后正常打开。

【讨论】:

猜你喜欢
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2012-10-07
  • 1970-01-01
相关资源
最近更新 更多