我有一个SQLite数据库,我用于一个网站.问题是,当我尝试INSERT INTO
它时,我会得到一个PDOException
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
我通过SSH连接到服务器并检查权限,数据库具有权限
-rw-rw-r--
我不熟悉*nix权限,但我很确定这意味着
不是目录
所有者具有读/写权限(根据我的说法ls -l
)
组具有读/写权限
其他人只有读取权限
我也看到了我知道使用该sqlite3
程序的所有地方,并没有发现任何相关内容.
因为我不知道PDO试图打开数据库的权限,我做到了
chmod o+w supplies.db
现在,我得到另一个PDOException
:
SQLSTATE[HY000]: General error: 14 unable to open database file
但它只发生在我打开数据库后尝试执行INSERT
查询时.
关于发生了什么的任何想法?
这个问题,因为它的出现,就是PDO SQLite的驱动程序要求,如果你打算做一个写操作(INSERT
,UPDATE
,DELETE
,DROP
,等),则数据库驻留在该文件夹必须具有写权限,以及实际数据库文件.
我在PDO SQLite驱动程序手册页的最底部的注释中找到了这些信息.
当SQLite文件的所有者本身与运行脚本的用户不同时,就会发生这种情况.如果无法写入整个目录路径(意味着沿途的每个目录),则会发生类似的错误.
谁拥有SQLite文件?您?
脚本运行的是谁?Apache还是没人?
对我来说,问题是SELinux执行而不是权限.根据Steve V.在对已接受答案的评论中提出的建议,一旦我禁用了执法, "只读数据库"错误就消失了.
echo 0 >/selinux/enforce
运行此命令后,一切都按预期工作(CentOS 6.3).
我遇到的具体问题是在Graphite的设置过程中.我已经三次检查了apache用户拥有并可以写入我的graphite.db及其父目录.但在我"修复"SELinux之前,我得到的只是一个堆栈跟踪效果:DatabaseError:尝试编写只读数据库