Błąd SQLite 'próba zapisu bazy danych readonly' podczas wstawiania?

Mam bazę danych SQLite, której używam na stronie internetowej. Problem polega na tym, że kiedy próbuję INSERT INTO to, dostaję PDOException

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

I SSH na serwer i sprawdzane uprawnienia, a baza danych ma uprawnienia

-rw-rw-r--

Nie jestem tak obeznany z uprawnieniami * nix, ale jestem prawie pewien, że to oznacza

  • nie Katalog
  • właściciel ma uprawnienia do odczytu/zapisu (to ja, zgodnie z ls -l)
  • grupa ma Odczyt/Zapis uprawnienia
  • wszyscy inni mają tylko uprawnienia do odczytu

Szukałam też wszędzie, gdzie mogłam, używając programu sqlite3 i nie znalazłam nic istotnego.

Ponieważ nie wiedziałem z jakimi uprawnieniami PDO próbuje otworzyć bazę danych, zrobiłem

chmod o+w supplies.db

Teraz dostaję kolejny PDOException:

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

Ale występuje tylko wtedy, gdy próbuję wykonać INSERT zapytaniepo baza danych jest otwarta.

Jakieś pomysły co się dzieje?

Author: StayOnTarget, 2010-07-23

9 answers

Problem, jak się okazuje, polega na tym, że sterownik PDO SQLite wymaga, aby Jeśli zamierzasz wykonać operację zapisu(INSERT,UPDATE,DELETE,DROP, itd), wtedy folder, w którym znajduje się baza danych, musi mieć prawa zapisu, jak również rzeczywisty plik bazy danych.

Znalazłem tę informację w komentarzu na samym dole strony podręcznika sterownika PDO SQLite .

 320
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/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-25 19:08:13

Może się to zdarzyć, gdy właścicielem samego pliku SQLITE jest , a nie ten sam użytkownik, który uruchamia skrypt. Podobne błędy mogą wystąpić, jeśli nie można zapisać całej ścieżki katalogu (czyli każdego katalogu po drodze).

Kto jest właścicielem pliku SQLite? Ty?

Jak działa skrypt? Apacz czy nikt?

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

Dla mnie problemem było egzekwowanie SELinux , a nie uprawnienia. Błąd "baza danych tylko do odczytu" zniknął, gdy wyłączyłem egzekwowanie, zgodnie z sugestią Steve ' a V. w komentarzu do zaakceptowanej odpowiedzi.

echo 0 >/selinux/enforce

Po uruchomieniu tego polecenia wszystko działało zgodnie z przeznaczeniem (CentOS 6.3).

Konkretny problem, który napotkałem, był podczas konfiguracji grafitu. Trzy razy sprawdzałem, czy użytkownik apache jest właścicielem i może pisać zarówno do mojego grafit.db i jego Katalog nadrzędny. Ale dopóki nie "naprawiłem" SELinux ' a, wszystko co dostałem to ślad stosu w efekcie: DatabaseError: attempt to write a readonly database

 6
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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:07

To może być spowodowane przez SELinux. Jeśli nie chcesz całkowicie wyłączyć SELinux, musisz ustawić katalog db fcontext na httpd_sys_rw_content_t.

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/railsapp/db(/.*)?"
restorecon -v /var/www/railsapp/db
 5
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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-13 23:37:06

Dostałem ten błąd, gdy próbowałem napisać do bazy danych na systemie Android.

Najwyraźniej sqlite3 nie tylko potrzebuje uprawnień do zapisu do pliku bazy danych i katalogu zawierającego (jak już powiedział @austin-hyde w swojej odpowiedzi), ale także zmienna środowiskowa TMPDIR musi wskazywać na (być może zapisywalny) katalog.

Na moim systemie Android ustawiłem go na TMPDIR="/data/local/tmp" i teraz mój skrypt działa zgodnie z oczekiwaniami:)

Edit:

Jeśli nie możesz ustawić zmiennych środowiskowych możesz użyć jednej z innych metod wymienionych tutaj: https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations jak PRAGMA temp_store_directory = 'directory-name';

 4
Author: Thilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-08 17:53:47

Dostałem ten sam błąd z IIS pod windows 7. Aby naprawić ten błąd musiałem dodać pełne uprawnienia kontrolne do konta IUSR dla pliku bazy danych SQLite. Nie musisz zmieniać uprawnień, jeśli używasz sqlite pod webmatrix zamiast IIS.

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

Podsumowując, naprawiłem problem umieszczając plik bazy danych ( * .db) w podfolderze.

  • podfolder i plik bazy danych w nim musi być członkiem www-GRUPA danych.
  • w grupie www-data musisz mieć prawo do napisania do podfolder i plik bazy danych.
 2
Author: Erkan Hürnalı,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-12 14:59:14

Użyłem:

Echo exec ("whoami');

Aby dowiedzieć się, kto uruchamia skrypt (powiedzmy nazwa użytkownika), a następnie dał użytkownikowi uprawnienia do całego katalogu aplikacji, jak:

Sudo chown-R :nazwa użytkownika /var / www / html / myapp

Mam nadzieję, że to komuś pomoże.

 1
Author: shasi kanth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-12 09:55:25

Mam to w przeglądarce po zmianie z using http://localhost do http://145.900.50.20 (gdzie 145.900.50.20 to mój lokalny adres IP), a następnie zmieniono z powrotem na localhost-konieczne było pozostanie z adresem IP, gdy zmieniłem go raz

 0
Author: kris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-30 03:43:13