삽입하는 동안 SQLite 오류 '읽기 전용 데이터베이스 쓰기 시도'?


124

웹 사이트에 사용중인 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 쿼리 를 실행하려고 할 때만 발생합니다 .

무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?


basicly httpd 실행 (아파치> PHP> PDO)가 쓰기 권한 ... 재미 ...하지 않도록이 파일을 소유하지 않도록 당신이 아닌
불꽃을

sudo chgrp www-data test.db추가 권한이 나를 위해 일했습니다
Zippp

답변:


305

이 밝혀 문제는의 PDO SQLite는 드라이버 당신이 쓰기 작업을 수행하려는 경우 (해야한다는 것입니다 INSERT, UPDATE, DELETE, DROP, 등), 다음의 데이터베이스 폴더에 상주하는 실제뿐만 아니라, 쓰기 권한이 있어야합니다 데이터베이스 파일.

이 정보 는 PDO SQLite 드라이버 매뉴얼 페이지 맨 아래 에있는 주석에서 찾았습니다 .


9
또한 SELinux (설치된 경우)가 적용되지 않아야합니다. 그것을 알아내는 데 하루 반이 걸렸습니다.
Steve V.

1
흠, 미안하지만 감사 합니다만 일시적으로 문제를 해결했습니다. 주된 문제는 제 www-data 사용자가 www-data 그룹에 없다는 것이 었습니다.
Dorian 2011

5
아시다시피 포함 폴더는 쓰기 가능해야합니다. 저널링 파일을 작성할 때 db 자체가 생성되기 때문입니다. 웹 서버와 동일한 사용자를 가지려면 파일 내용을 다른 생성 된 임시로 복사 해보십시오.
lcapra

4
또한 db 파일과 그것이 상주하는 디렉토리는 리눅스 박스에서 'www-data'가 소유해야합니다.
anisbet

1
현재 sqlite3에는 .db, a .db-shm및 한 개의 .db-wal파일, 물론 세 개의 상위 디렉토리가있을 수 있으며,이 디렉토리는 프로그램을 실행하는 사용자가 모두 쓸 수 있어야합니다.
Marcos Dione

17

이것은 SQLite 파일 자체의 소유자가 스크립트를 실행하는 사용자와 동일 하지 않을 때 발생할 수 있습니다 . 전체 디렉토리 경로 (길을 따라 각 디렉토리를 의미 함)를 쓸 수없는 경우에도 유사한 오류가 발생할 수 있습니다.

SQLite 파일은 누가 소유합니까? 당신?

스크립트는 누구로 실행됩니까? Apache 또는 Nobody?


1
나는 SQLite 파일을 소유하고 있지만 스크립트가 누구로 실행되는지 모릅니다. 어떻게 알 수 있습니까? (이는 공유 호스트에 있으며 권한이 제한되어 있습니다.)
Austin Hyde

1
아, 그게 더 재미있어 지네요. 공유 호스팅을 사용하는 경우 스크립트가 "nobody"또는 "apache"로 실행될 가능성이 매우 높습니다. 스크립트가 파일 ( file_put_contents('./foo.txt', 'Hello, world');)을 생성하도록하여 실행중인 사용자를 보여줍니다. 스크립트가 SQLite 데이터베이스를 생성해야 할 가능성이 있습니다. 이미 현재 파일의 데이터를 가지고있을 때 ... 즐거운 운동을 할 수있다
찰스

좋은 생각이지만 가보지 마세요. PHP를 실행하는 사람은 쓰기 권한이 없으므로 파일을 만들 수 없습니다. 어쨌든 PHP가 현재 실행중인 사용자를 검색 할 수 있습니까?
Austin Hyde

유일한 방법은 POSIX-y 시스템에서 기본적으로 활성화되는 POSIX 확장을 사용하는 것 같습니다 . 하지만 호스팅 제공 업체는 R'd TFM 을 사용하고 비활성화했을 수 있습니다 .
Charles

글쎄, 그들은 R'd TFM, 좋아. posix_getuid()작동하지 않습니다.
Austin Hyde

6

나에게 문제는 권한이 아닌 SELinux 시행 이었습니다 . "읽기 전용 데이터베이스"오류는 수락 된 답변 에 대한 의견에서 Steve V.의 제안에 따라 강제 실행을 비활성화 하면 사라졌습니다 .

echo 0 >/selinux/enforce

이 명령을 실행하면 모든 것이 의도 한대로 작동했습니다 (CentOS 6.3).

내가 만난 특정 문제는 Graphite를 설정하는 동안이었습니다. 나는 아파치 사용자가 소유하고 내 graphite.db와 그 부모 디렉토리 모두에 쓸 수 있는지 세 번 확인했습니다. 하지만 SELinux를 "고정"하기 전까지는 다음과 같은 결과에 대한 스택 추적 만있었습니다. DatabaseError : try to write a readonly database


8
SELinux는 보안 조치이므로 정당한 이유없이 비활성화해서는 안됩니다. SELinux가 처음에 차단되는 이유를 파악하고 비활성화하는 대신 올바르게 구성하는 것이 좋습니다.
Jens Wegar 2014

5

이것은 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

4

Android 시스템에서 데이터베이스에 쓰려고 할 때이 오류가 발생했습니다.

분명히 sqlite3는 데이터베이스 파일과 포함하는 디렉토리 (@ austin-hyde가 이미 대답에서 말했듯이)에 대한 쓰기 권한이 필요할뿐만 아니라 환경 변수 TMPDIR가 (쓰기 가능한) 디렉토리를 가리켜 야합니다.

내 Android 시스템에서 설정 TMPDIR="/data/local/tmp"하고 이제 스크립트가 예상대로 실행됩니다. :)

편집하다:

환경 변수를 설정할 수없는 경우 여기에 나열된 다른 방법 중 하나를 사용할 수 있습니다. https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations likePRAGMA temp_store_directory = 'directory-name';


2

Windows 7에서 IIS에서 동일한 오류가 발생했습니다.이 오류를 수정하려면 sqlite 데이터베이스 파일에 대한 IUSR 계정에 모든 권한을 추가해야했습니다. IIS 대신 webmatrix에서 sqlite를 사용하는 경우 권한을 변경할 필요가 없습니다.


2

요약하면 데이터베이스 파일 (* .db)을 하위 폴더에 넣어 문제를 해결했습니다.

  • 하위 폴더와 그 안의 데이터베이스 파일은 www-data 그룹의 구성원이어야합니다.
  • www-data 그룹에서 하위 폴더 및 데이터베이스 파일에 쓸 수있는 권한이 있어야합니다.


0

나는 다음을 사용했다 :

echo exec ( 'whoami');

스크립트를 실행중인 사용자 (예 : 사용자 이름)를 찾은 다음 사용자에게 다음과 같이 전체 응용 프로그램 디렉터리에 대한 권한을 부여했습니다.

sudo chown -R : 사용자 이름 / var / www / html / myapp

이것이 누군가를 돕기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.