"데이터베이스 파일을 열 수 없습니다"라는 sqlite 오류가 발생하는 이유는 무엇입니까?


65

Django 앱을 사용하면 데이터베이스에서 잘 읽을 수 있습니다. 응용 프로그램에 파일에 대한 액세스 권한이 없으면 다음과 같은 오류가 발생했습니다.

읽기 전용 데이터베이스 쓰기 시도

말이 되네요. 그래서 파일에 대한 권한을 편집하여 Apache 프로세스가 쓰기 권한을 갖도록했습니다. 그러나 작성하는 대신이 암호 오류가 발생합니다.

데이터베이스 파일을 열 수 없습니다

유용한 경우 전체 출력은 다음과 같습니다.

Request Method: POST
Request URL:    http://home-sv-1/hellodjango1/polls/1/vote/
Exception Type: OperationalError
Exception Value:    
unable to open database file
Exception Location: /usr/lib/pymodules/python2.5/django/db/backends/sqlite3/base.py in execute, line 193
Python Executable:  /usr/bin/python
Python Version: 2.5.2
Python Path:    ['/var/www', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/pymodules/python2.5', '/usr/lib/pymodules/python2.5/gtk-2.0']
Server time:    Sun, 23 Aug 2009 07:06:08 -0500

스택 추적이 필요한지 알려주세요.


배포 할 때이 문제가 발생했다고 생각합니다.
Mohammed Shareef C

답변:


79

아하, 방금 이것을 설명 하는 기사를 발견 했습니다. 또한 장고는 NewbieMistakes 페이지 에 정보를 가지고 있습니다 .

해결책은 데이터베이스 파일이 포함 된 디렉토리에 프로세스에 대한 쓰기 액세스 권한이 있는지 확인하는 것입니다.

필자의 경우이 명령을 실행하면 문제가 해결되었습니다.

sudo chown www-data .

3
이것은 여러분이 debian / ubuntu에 있다고 가정합니다. 만약 CentOS를 사용한다면 'www-data'대신 'apache'를 사용하고 싶을 것입니다
Luke Chadwick

3
@ nbolton 참고 : chown www-data. .실제로 chown www-data .그렇지 않으면 내가 모르는 chown 명령의 마법사가 있습니다 ... 제발 나를 계몽하십시오.
Jeff Sheffield

3
추가 점은 그룹을 소유자의 기본 그룹으로 설정하는 것입니다. 그렇지 않으면 그룹이 변경되지 않습니다. 이것은 단지 메모리에서 온 것이므로 직접 시도해 보는 것이 좋습니다.
Nick Bolton

향후 링크 rot 또는 tl; dr의 경우에 여기에 요약되어 있습니다. SQLite3은 트랜잭션이 열릴 때 저널 파일을 작성할 수 있도록 DB 파일의 디렉토리에 대한 쓰기 액세스를 원합니다.
user1454265

Linux 사용자에게 적합합니다. Windows 용 Bupkiss.
Jay Blanchard

7

이것에 대한 나의 해결책은 더 비슷했습니다. 나는이 디렉토리의 소유권을 바꾸고 싶지 않았다. (주로 pi 사용자를 사용하여 git과 같은 일을하기 때문에)

/var/www/mysite $ ls -la sql*
-rw-rw-r-- 1 pi       pi       25600 Jan  2 22:57 sqlite.db

(또는 사용중인 DB)

여기서 pi는 모든 파일을 만든 사용자입니다 (예 : 라즈베리 파이).

www-data에 대한 권한을 변경하는 대신 다음과 같이 권한을 변경하기 만하면된다는 것을 알았습니다.

sudo chmod 775 /var/www/mysite
sudo chmod 664 /var/www/mysite/sqlite.db
sudo usermod -a -G pi www-data

이렇게하면 필요한 파일에 그룹 쓰기 권한이 부여되고 www-data 사용자가 pi 그룹에 추가됩니다.

참고 : 로깅이있는 경우 django 로그 파일에 대해서도이 작업을 수행해야하거나 아파치가별로 좋아하지 않습니다.


1
방금 pi 사용자를 www-data 그룹에 추가했을 수 있다고 생각합니다. 또한 파일을 그대로두고 setfacl 명령을 사용하여 파일 및 / 또는 디렉토리에 pi에 대한 액세스 제어 목록을 추가 할 수 있습니다.
slm

setfacl은 잠재적으로 좋은 옵션 인 것 같습니다. 이것을 지침 답변으로 열거하는 것이 좋습니다. 내가 직면 한 문제는 테스트 할 때 종종 .db 파일을 삭제해야한다는 것입니다. 재생성되면 다시 수정해야합니다.
SpiRail

이 질문에 대한 대답은 serverfault.com/a/462970/2518 을 참조하십시오 . 도움이 될만한 것들이 더 있습니까?
slm

7

로부터 장고 sqlite3를를 사용하는 경우 "데이터베이스 파일을 열 수 없습니다"라는 섹션신참 실수 장고 위키 페이지 :

  1. Apache가 데이터베이스의 상위 디렉토리에도 쓸 수 있는지 확인하십시오.
  2. 데이터베이스 파일의 전체 경로 폴더가 숫자로 시작하지 않도록하십시오
  3. db디렉토리가 존재 하는 전체 경로를 확인하십시오
  4. /tmp디렉토리가 쓰기 가능한지 확인하십시오
  5. 에 지정된 데이터베이스 settings.py경로가 전체 경로 인지 확인하십시오.
  6. 경로에 특수 문자가 없는지 확인하십시오
  7. Windows에서 db 디렉토리 경로가 이중 백래시로 작성되었는지 확인하십시오.

링크의 관련 부분을 여기에 복사 / 붙여 넣기하십시오.
Christophe De Troyer

그리고 그것은 공감입니다! :)
Christophe De Troyer

5

www-data 그룹에 운영 사용자를 추가하는 것이 테스트 환경에서 잘 작동합니다. 또한 sqlite3.db 파일을 별도의 하위 폴더 에 저장하여 더 안전합니다.

데이터베이스 파일은 www-data가 소유해야합니다.

sudo chown www-data mysite/db_sqlite3/
sudo chown www-data mysite/db_sqlite3/my.db

운영 사용자 hape가 www-data 그룹의 구성원을 얻습니다.

sudo usermod -a -G www-data hape

www-data 그룹의 구성원에 대한 데이터베이스 파일 쓰기 액세스를 허용하십시오.

sudo chmod u+w+x,g+w+x mysite/db_sqlite3/
sudo chmod u+w+x,g+w+x mysite/db_sqlite3/my.db

결과적으로, 프로젝트 루트 폴더에 대한 권한을 부여하지 않고 apache2-daemon (사용자 www-data)이 데이터베이스에 읽기 + 쓰기에 액세스 할 수 있으며, 반면에 앱은 운영에 의해 개발 모드에서 실행될 수 있습니다 예. 사용자 방해

./manage.py runserver

또한.


1

SO 질문에서 차용 : https : //.com/questions/4283132/apache-instance-user-permission-issue

아파치 사용자가 파일을 시작한다고 가정합니다.

% chown -R apache.apache /var/www/mysite

설정 한 ACLs사용자 / 그룹에 대한 PI :

% setfacl -d -m u:pi:rwx /var/www/mysite
% setfacl -d -m g:pi:rwx /var/www/mysite

% getfacl /var/www/mysite
# file: /var/www/mysite
# owner: apache
# group: apache
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:pi:rwx
default:group::r-x
default:group:pi:rwx
default:mask::rwx
default:other::r-x

권한 비트의 끝에 '+' 가있는 ACLwith 가 있음을 알 수 있습니다 ls -l.

# ls -la /var/www
drwxr-xr-x   3 apache   apache   80 26. Nov 12:43 .
drwxrwxrwt  15 root     root 360 26. Nov 12:40 ..
drwxrwxr-x+  2 apache   apache   40 26. Nov 12:43 mysite

장고 프로젝트 전체에 대해 소유자 / 그룹을 아파치 프로세스로 설정하는 것은 좋지 않은 생각이며 불필요한 권한을 부여 할 필요가 없습니다.
benjaoming

1

해결책은 데이터베이스 파일이 포함 된 디렉토리에 프로세스에 대한 쓰기 액세스 권한이 있는지 확인하는 것입니다.

들어 윈도우 등 7, 8.1, 10, 서버 2012, 추적 보노보 설치 방향 :

IIS 사용자가 C : \ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data 폴더를 수정하도록 허용하십시오.

그렇게하려면 :

  1. App_Data 폴더의 속성을 선택하고
  2. 보안 탭으로 이동하여
  3. 편집을 클릭하십시오.
  4. IIS 사용자 (내 경우에는 IIS_IUSRS)를 선택하고 수정 및 쓰기 권한을 추가하십시오.
  5. 적용 버튼으로 이러한 설정을 확인하십시오.

0

개발 서버는 데이터베이스 폴더에 쓰기 권한을 가진 동일한 사용자로 실행해야하므로 처음에 데이터베이스를 루트로 만든 경우 다음을 실행할 때 루트 여야합니다.

python manage.py runserver

기술적으로는 정확하지만 서버를 실행하는 root것은 끔찍한 생각 chown입니다. 일반적으로 서버를 실행하는 권한이없는 일반 사용자에게 데이터베이스 가 더 좋습니다 .
voretaq7

0

작업 디렉토리에 서브 디렉토리를 작성하십시오

mkdir db-folder 

하위 디렉토리에서 sqlite 데이터베이스 생성

sqlite3 db-folder/db.db

하위 디렉토리의 소유자를 debain의 www-data 또는 centOS의 Apache로 변경

chown -R www-data db-folder

그리고 시원한 맥주를 사십시오.

P / S : 절차가 성공했는지 확인

ls -l data-folder

당신은 그런 것을보아야합니다

-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder

답변을 게시하려면 동일한 질문에 대한 다른 답변과 실질적으로 다른 답변을 제공하십시오.
masegaloeh

-1

그냥 쓰면 sudo sqlite3 databaseFilename.sql효과가 있습니다


대화 형 사용자 세션에서는 작동하지만 웹 응용 프로그램에는 적합하지 않습니다 ...
HBruijn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.