Is it possible to open a locked sqlite database in read only mode?

Question:

I’d like to open the chromium site data (in ~/.config/chromium/Default) with python-sqlite3 but it gets locked whenever chromium is running, which is understandable since transactions may be made. Is there a way to open it in read-only mode, ensuring that I can’t corrupt the integrity of the db while chromium is using it?

Asked By: ladaghini

||

Answers:

I believe it depends on the lock set by the transaction.

https://www.sqlite.org/lockingv3.html#shared_lock
https://www.sqlite.org/lang_transaction.html

SQLite exclusive transactions lock both read and write where immediate and deferred transactions will still allow readers.

So it really depends on the transactions used by Chromium.

Answered By: NtscCobalt

Chromium is holding a database lock for long periods of time? Yuck! That’s really not a very good idea at all. Still, not your fault…

You could try just copying the database file (e.g., with the system utility cp) and using that snapshot for reading purposes; SQLite keeps all its committed state in a single file per database. Yes, there’s a chance of seeing a partial transaction, but you will definitely not have lock problems on Unix as SQLite definitely doesn’t use mandatory locks. (This might well not work on Windows due to the different locking scheme there.)

Answered By: Donal Fellows

It seems we can bypass the lock by opening the database in immutable mode, e.g.:

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

As explained here https://www.sqlite.org/c3ref/open.html

This can cause querying errors if the underlying database file changes, or obviously not seeing updates that are made to the file, but I found that re-opening the connection on each new query helps with that.

To achieve the same thing with most SQLite drivers, because we can’t directly set SQLITE_IOCAP_IMMUTABLE, the best way is to open the connection with the flag SQLITE_OPEN_READONLY | SQLITE_OPEN_URI to allow passing the file:...?immutable=1 URI as filename.

Answered By: Val
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.