是否可能以只读模式打开一个被锁定的 SQLite 数据库?

17

我想使用 python-sqlite3 打开位于 ~/.config/chromium/Default 目录下的 Chromium 站点数据,但在 Chromium 运行时它被锁定,这是可以理解的,因为可能正在进行事务。有没有一种方法以只读模式打开它,确保我在 Chromium 使用它时不会破坏数据库的完整性?

3个回答

8

看起来我们可以通过以immutable模式打开数据库来绕过锁定,例如:

sqlite3 'file:places.sqlite?immutable=1'

如此解释https://www.sqlite.org/c3ref/open.html
如果潜在的数据库文件更改,则会导致查询错误,或者显然不能看到对文件所做的更新,但我发现在每个新查询上重新打开连接有助于解决这个问题。
要使用大多数SQLite驱动程序实现相同的功能,因为我们无法直接设置SQLITE_IOCAP_IMMUTABLE,所以最好的方法是使用标志SQLITE_OPEN_READONLY | SQLITE_OPEN_URI打开连接,以允许将file:...?immutable=1 URI作为filename传递。

不错!echo "SELECT ..." | sqlite3 'file:///home/my_user/.mozilla/firefox/12wh3gmq.work/cookies.sqlite?immutable=1' 对我有用!其他的方法,如 sqllite3 -readonly ...sqlite3 ...?mode=ro 都没有帮助。同时,sqlite3 'file://~/.mozilla/firefox/12wh3gmq.work/cookies.sqlite?immutable=1' 也不起作用。 - jhutar

8

6

Chromium长时间持有数据库锁?糟糕!这真的不是一个好主意。但这并不是你的错。

你可以尝试仅复制数据库文件(例如使用系统实用程序cp),并使用该快照进行阅读;SQLite将其所有提交状态保存在每个数据库的单个文件中。是的,有可能看到部分事务,但在Unix上,您绝对不会遇到锁定问题,因为SQLite绝对不使用强制锁定。(由于Windows上的不同锁定方案,这可能无法正常工作。)


2
这并不一定是Chromium的错。在搜寻过程中,我找到了这篇有用的信息,指出pysqlite库并没有提供所有sqlite功能的接口,因为它符合DB-API规范。所以当我使用pysqlite打开数据库时,可能没有选择读写模式。他指出可以使用APSW,在启动连接时使用SQLITE_OPEN_READONLY标志。我现在会去检查一下。 - ladaghini
3
这是我使用的解决方法,因为我在浏览器标签中迷失了15个标签页,试图找出针对Firefox的places.sqlite并发访问的“正确”解决方案。对于Firefox来说,情况是一样的,错误信息也相同。只需更改您的程序以在副本上运行,并尽情享受生活,而不必担心PRAGMA main.journal_mode=WALSQLITE_OPEN_READONLY,也不必翻阅C API文档,只能发现用Python的sqlite3库做不到这一点或那一点。 - TheDudeAbides

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接