웹 사이트에 사용중인 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
쿼리 를 실행하려고 할 때만 발생합니다 .
무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?
답변
이 밝혀 문제는의 PDO SQLite는 드라이버 당신이 쓰기 작업을 수행하려는 경우 (해야한다는 것입니다 INSERT
, UPDATE
, DELETE
, DROP
, 등), 다음의 데이터베이스 폴더에 상주하는 실제뿐만 아니라, 쓰기 권한이 있어야합니다 데이터베이스 파일.
이 정보 는 PDO SQLite 드라이버 매뉴얼 페이지 맨 아래 에있는 주석에서 찾았습니다 .
답변
이것은 SQLite 파일 자체의 소유자가 스크립트를 실행하는 사용자와 동일 하지 않을 때 발생할 수 있습니다 . 전체 디렉토리 경로 (길을 따라 각 디렉토리를 의미 함)를 쓸 수없는 경우에도 유사한 오류가 발생할 수 있습니다.
SQLite 파일은 누가 소유합니까? 당신?
스크립트는 누구로 실행됩니까? Apache 또는 Nobody?
답변
나에게 문제는 권한이 아닌 SELinux 시행 이었습니다 . “읽기 전용 데이터베이스”오류는 수락 된 답변 에 대한 의견에서 Steve V.의 제안에 따라 강제 실행을 비활성화 하면 사라졌습니다 .
echo 0 >/selinux/enforce
이 명령을 실행하면 모든 것이 의도 한대로 작동했습니다 (CentOS 6.3).
내가 만난 특정 문제는 Graphite를 설정하는 동안이었습니다. 나는 아파치 사용자가 소유하고 내 graphite.db와 그 부모 디렉토리 모두에 쓸 수 있는지 세 번 확인했습니다. 하지만 SELinux를 “고정”하기 전까지는 다음과 같은 결과에 대한 스택 추적 만있었습니다. DatabaseError : try to write a readonly database
답변
이것은 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
답변
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';
답변
Windows 7에서 IIS에서 동일한 오류가 발생했습니다.이 오류를 수정하려면 sqlite 데이터베이스 파일에 대한 IUSR 계정에 모든 권한을 추가해야했습니다. IIS 대신 webmatrix에서 sqlite를 사용하는 경우 권한을 변경할 필요가 없습니다.
답변
요약하면 데이터베이스 파일 (* .db)을 하위 폴더에 넣어 문제를 해결했습니다.
- 하위 폴더와 그 안의 데이터베이스 파일은 www-data 그룹의 구성원이어야합니다.
- www-data 그룹에서 하위 폴더 및 데이터베이스 파일에 쓸 수있는 권한이 있어야합니다.