启用 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 数据库在读取时阻止用户的主要内容,如果未能解决你的问题,请参考以下文章
当连接未正确关闭时,为啥使用 WAL 模式的 SQLite 数据库中的数据会丢失?
Sqlite 数据库中的 .db-shm 和 .db-wal 扩展名是啥?