SQLite:只读数据库
我有一个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
查询时才会发生。
任何想法正在发生什么?
事实certificate,问题在于PDO SQLite驱动程序要求如果要执行写操作( INSERT
, UPDATE
, DELETE
, DROP
等),那么数据库所在的文件夹必须具有写权限,如以及实际的数据库文件。
我在PDO SQLite驱动程序手册页的底部发现了这个信息。
当SQLite文件的所有者与运行脚本的用户不一样时,就会发生这种情况。 如果整个目录path(意味着每个目录一路)无法写入,则会出现类似的错误。
谁拥有SQLite文件? 您?
脚本运行的是谁? Apache还是没有人?
对我来说,这个问题是SELinux执行而不是权限。 一旦我禁用了执行的“只读数据库”错误后,Steve V.在对已接受的答案发表了评论。
echo 0 >/selinux/enforce
一旦运行这个命令,一切都按照预期运行(CentOS 6.3)。
我遇到的具体问题是在安装Graphite期间。 我已经三重检查了Apache用户拥有,并可以写入我的graphite.db和它的父目录。 但直到我“固定”SELinux,我得到的是一个堆栈跟踪的效果: DatabaseError:试图写一个只读数据库
这可能是由SELinux造成的。 如果您不想完全禁用SELinux,则需要将db目录fcontext设置为httpd_sys_rw_content_t。
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/railsapp/db(/.*)?" restorecon -v /var/www/railsapp/db
我得到了同样的错误从Windows 7下的IIS。要解决这个错误,我不得不完全控制权限添加到IUSR帐户的SQLite数据库文件。 如果您在webmatrix下使用sqlite而不是IIS,则不需要更改权限。
当我尝试写入Android系统上的数据库时遇到此错误。
显然sqlite3不仅需要对数据库文件和包含目录的写权限(就像@austin-hyde在他的回答中已经说过的那样),而且环境variablesTMPDIR
也必须指向一个(可能是可写的)目录。
在我的Android系统上,我将其设置为TMPDIR="/data/local/tmp"
,现在我的脚本按预期运行:)
当我从http:// localhost更改为http://my.local.ip.address ,然后又改回本地主机时,我在浏览器中得到了这个信息 – 一旦我改变了IP地址那一次