如何为SQLite的WAL、SHM文件设置全局可写权限
解决方案
方案1:使用SQLite官方权限配置参数(兼容3.31.0及以上版本)
SQLite从3.31.0版本开始新增了journal_file_permissions配置项,可以直接指定WAL、SHM文件的创建权限,在建立数据库连接后执行一次以下PRAGMA命令即可:
PRAGMA journal_file_permissions = 0664;
这里设置的0664代表文件所有者和同组用户拥有读写权限,其他用户仅可读,你可以根据实际需求调整为0666给所有用户开放读写权限(请提前评估安全风险)。该配置仅对生效后新创建的WAL、SHM文件生效,如果已有旧的临时文件,需要先关闭所有数据库连接,等待SQLite自动删除旧的WAL/SHM文件后再重新建立连接即可。
方案2:目录权限继承(兼容所有SQLite版本)
如果使用的SQLite版本低于3.31.0,可以通过操作系统目录的setgid权限实现文件权限继承:
- 先将两个操作数据库的操作系统用户加入同一个用户组,例如命名为
sqlite-group - 修改数据库所在目录的所属组,同时开启setgid权限:
chgrp sqlite-group /path/to/db_directory chmod 2775 /path/to/db_directory - 同步修改数据库主文件的权限,确保同组用户可写:
chmod 664 /path/to/target.db chgrp sqlite-group /path/to/target.db
配置完成后,该目录下新创建的所有文件都会自动继承父目录的所属组,两个同组用户都可以正常读写SQLite自动生成的WAL/SHM文件。
方案3:调整进程umask值
启动操作SQLite的业务进程前,先将进程的umask值调整为0002(如果需要给所有用户开放权限可调整为0000),这样进程创建的所有新文件默认权限就会是664/666,也能解决临时文件权限不足的问题。
注意:该配置会影响当前进程创建的所有文件的默认权限,非特殊场景不推荐使用。
内容的提问来源于stack exchange,提问作者hifkanotiks
相关产品推荐
相关产品推荐

