当前位置:  开发笔记 > 数据库 > 正文

在插入期间SQLite错误'尝试编写只读数据库'?

如何解决《在插入期间SQLite错误'尝试编写只读数据库'?》经验,为你挑选了3个好方法。

我有一个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查询时.

关于发生了什么的任何想法?



1> Austin Hyde..:

这个问题,因为它的出现,就是PDO SQLite的驱动程序要求,如果你打算做一个写操作(INSERT,UPDATE,DELETE,DROP,等),则数据库驻留在该文件夹必须具有写权限,以及实际数据库文件.

我在PDO SQLite驱动程序手册页的最底部的注释中找到了这些信息.


此外,SELinux(如果已安装)不得强制执行.花了我一天半的时间想出那一个.
据我所知,包含文件夹必须是可写的,因为在编写日志文件时会创建数据库本身.要使用户与Web服务器相同,请尝试将文件内容复制到另一个创建的ad hoc.
db文件和它所在的目录也必须由linux盒子上的'www-data'拥有.

2> Charles..:

当SQLite文件的所有者本身与运行脚本的用户同时,就会发生这种情况.如果无法写入整个目录路径(意味着沿途的每个目录),则会发生类似的错误.

谁拥有SQLite文件?您?

脚本运行的是谁?Apache还是没人?



3> Noah Sussman..:

对我来说,问题是SELinux执行而不是权限.根据Steve V.在对已接受答案的评论中提出的建议,一旦我禁用了执法, "只读数据库"错误就消失了.

echo 0 >/selinux/enforce

运行此命令后,一切都按预期工作(CentOS 6.3).

我遇到的具体问题是在Graphite的设置过程中.我已经三次检查了apache用户拥有并可以写入我的graphite.db及其父目录.但在我"修复"SELinux之前,我得到的只是一个堆栈跟踪效果:DatabaseError:尝试编写只读数据库


SELinux是一种安全措施,因此不应该在没有充分理由的情况下禁用.最好先弄清楚为什么SELinux会阻塞并正确配置它而不是禁用它.
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有