启用 WAL 的 SQLite 数据库在读取时阻止用户

Posted

技术标签:

【中文标题】启用 WAL 的 SQLite 数据库在读取时阻止用户【英文标题】:WAL-enabled SQLite database blocking user on read 【发布时间】:2021-12-31 01:32:45 【问题描述】:

这是背景:

我目前在 Linux 服务器 (CentOS 8) 上运行 ETL 进程,该服务器还托管从本地 SQLite 数据库读取的应用程序。 在 ETL 运行并写入 SQLite 数据库的某些时候,应用程序也在从数据库中读取数据。

为了避免应用程序使用 SQLite 数据库时数据库锁定,我在 SQLite 数据库上启用了 WAL,以便 ETL 可以在应用程序使用时写入数据库。

但是现在存在以下问题,即 ETL 进程在建立连接后无法查询数据库。发生这种情况时,我已记录以下信息:

“shinysuite”用户运行 ETL 过程。 “闪亮”用户运行应用程序。 根据管理员的说法,这些用户属于同一个组。

来自 /etc/groups 的输出

首先,我不明白为什么“闪亮”用户拥有 -wal 文件,即使它只是读取。 其次,我不明白为什么 ETL 进程('shinysuite')即使不拥有该文件,也无法从 -wal 文件中读取。

这可能是什么问题?

【问题讨论】:

【参考方案1】:

首先,我不明白为什么“闪亮”用户拥有 -wal 文件,即使它只是读取。

从 WAL 模式 sqlite3 数据库读取时,如果辅助程序 -wal 和 -shm 文件不存在,则会创建它们。

它们归shiny 用户所有,属于shiny 组,但shinysuite 不是该组的成员,因此它无权使用这些文件。如果您的应用程序由shiny 运行在shinysuite 组中而不是shiny (如果它是二进制可执行文件,使用chgrp(1) 更改文件组,然后使用@987654328 将其设置为gid @ 是一种方法,或者只是将 shinysuite 添加到 shiny 组。)它应该可以工作。

【讨论】:

以上是关于启用 WAL 的 SQLite 数据库在读取时阻止用户的主要内容,如果未能解决你的问题,请参考以下文章

GRDB使用SQLite的WAL模式

当连接未正确关闭时,为啥使用 WAL 模式的 SQLite 数据库中的数据会丢失?

浅析SQLite的锁机制和WAL技术

Sqlite 数据库中的 .db-shm 和 .db-wal 扩展名是啥?

通读我的应用程序的核心数据文件(.sqlite、.sqlite-wal)

系统开机显示无法定位程序输入点sqlite3_wal_ckpoint与动态链接库SQllite3.dll上