SQLite: base de datos de solo lectura


Tengo una base de datos SQLite que estoy usando para un sitio web. El problema es que cuando trato de INSERT INTO, obtengo un PDOException

SQLSTATE[HY000]: General error: 8 attempt to write a readonly database

I SSH'd en el servidor y los permisos verificados, y la base de datos tiene los permisos

-rw-rw-r--

No estoy tan familiarizado con los permisos *nix, pero estoy bastante seguro de que esto significa

  • No es un directorio
  • El propietario tiene permisos de lectura / escritura (ese soy yo, de acuerdo con ls -l)
  • El grupo ha leído / escrito permisos
  • Todos los demás solo tienen permisos de lectura

También busqué en todas partes que conocía usando el programa sqlite3, y no encontré nada relevante.

Debido a que no sabía con qué permisos PDO está tratando de abrir la base de datos, lo hice

chmod o+w supplies.db

Ahora, obtengo otro PDOException:

SQLSTATE[HY000]: General error: 14 unable to open database file

Pero SOLO ocurre cuando intento ejecutar una consulta INSERT después de que la base de datos esté abierta.

¿Alguna idea de lo que está pasando?

Author: Dorian, 2010-07-23

7 answers

El problema, como resulta, es que el controlador PDO SQLite requiere que si va a hacer una operación de escritura(INSERT,UPDATE,DELETE,DROP, etc), entonces la carpeta en la que reside la base de datos debe tener permisos de escritura, así como el archivo de base de datos real.

Encontré esta información en un comentario en la parte inferior de la página del manual del controlador PDO SQLite.

 264
Author: Austin Hyde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-25 19:08:13

Esto puede suceder cuando el propietario del archivo SQLite en sí es no el mismo que el usuario que ejecuta el script. Errores similares pueden ocurrir si no se puede escribir en toda la ruta del directorio (es decir, en cada directorio a lo largo del camino).

¿Quién es el propietario del archivo SQLite? ¿Tú?

¿Cómo se ejecuta el script? ¿Apache o Nadie?

 12
Author: Charles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-23 14:35:52

Para mí el problema era la aplicación de SELinux en lugar de los permisos. El error "base de datos de solo lectura" desapareció una vez que desactivé la aplicación, siguiendo la sugerencia hecha por Steve V. en un comentario sobre la respuesta aceptada.

echo 0 >/selinux/enforce

Al ejecutar este comando, todo funcionó como estaba previsto (CentOS 6.3).

El problema específico que había encontrado fue durante la configuración del grafito. Había comprobado tres veces que el usuario de Apache poseía y podía escribir tanto a mi grafito.db y su directorio padre. Pero hasta que" arreglé " SELinux, todo lo que obtuve fue un seguimiento de pila con el efecto de: DatabaseError: intento de escribir una base de datos de solo lectura

 4
Author: Noah Sussman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:07

Esto puede ser causado por SELinux. Si no desea deshabilitar SELinux completamente, debe establecer el directorio db fcontext en httpd_sys_rw_content_t.

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/railsapp/db(/.*)?"
restorecon -v /var/www/railsapp/db
 2
Author: Andy Fraley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-13 23:37:06

Recibí el mismo error de IIS bajo Windows 7. Para corregir este error tuve que agregar permisos de control total a la cuenta IUSR para el archivo de base de datos sqlite. No es necesario cambiar los permisos si utiliza sqlite en webmatrix en lugar de IIS.

 1
Author: l0pan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-09 18:07:51

Recibí este error cuando intenté escribir en una base de datos en un sistema Android.

Aparentemente sqlite3 no solo necesita permisos de escritura para el archivo de base de datos y el directorio que lo contiene (como ya dijo @austin-hyde en su respuesta), sino que también la variable de entorno TMPDIR tiene que apuntar a un directorio (posiblemente escribible).

En mi sistema Android lo configuré en TMPDIR="/data/local/tmp" y ahora mi script se ejecuta como se esperaba:)

 0
Author: Thilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-03 06:36:51

Obtuve esto en mi navegador cuando cambié de usar http://localhost a http://my.local.IP.dirección y luego cambió de nuevo a localhost was fue necesario permanecer con la dirección IP una vez que había cambiado a que una vez

 -1
Author: kris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-31 02:08:09