SQLite 데이터베이스 모드를 읽기-쓰기로 변경


101

SQLite 데이터베이스를 읽기 전용에서 읽기-쓰기로 변경하려면 어떻게해야합니까?

업데이트 문을 실행할 때 항상 다음을 얻었습니다.

SQL 오류 : 읽기 전용 데이터베이스 쓰기 시도

SQLite 파일은 파일 시스템에서 쓰기 가능한 파일입니다.


3
sqlite3를 실행하는 사용자 (또는 쿼리를 실행하는 데 사용하는 모든 사용자)에게 db에 대한 쓰기 권한이 있습니까? 파일 소유권을 다시 확인 했습니까?
Tim Post

나는 그들이 그것을 할 권한이 있다고 확신합니다.
user143482

2
데이터베이스 파일에 GID를 설정하는 것을 잊고 "www-data"계정 (Apache가 실행되는)이 파일에 대한 쓰기 액세스를 거부 한 웹 앱에서 이것을 본 적이 있습니다.
finnw

답변:


86

이 오류 메시지에는 여러 가지 이유가있을 수 있습니다.

  • 여러 프로세스에서 동시에 데이터베이스를 엽니 다 ( FAQ 참조 ).

  • 데이터베이스를 압축하고 암호화하는 플러그인이 있습니다. DB를 수정할 수 없습니다.

  • 마지막으로, 또 다른 FAQ 는 "데이터베이스 파일이 포함 된 디렉토리가 CGI 스크립트를 실행하는 사용자도 쓸 수 있는지 확인하십시오."라고 말합니다. 엔진이 디렉토리에 더 많은 파일을 만들어야하기 때문이라고 생각합니다.

  • 예를 들어 충돌 후 전체 파일 시스템이 읽기 전용 일 수 있습니다.

  • Unix 시스템에서는 다른 프로세스가 전체 파일을 대체 할 수 있습니다.


26
세 번째 항목에 입찰을하겠습니다. DB 파일이 포함 된 디렉토리도 쓰기 가능해야 잠금 파일을 만들 수 있습니다.
Kimvais

나를위한 첫 번째 총알 : D
Vinay

마지막. 나는 항상 sudo를 잊지 : P
스톰

3
이 목록에 추가 할 수 있습니다. 데이터베이스 파일은 사용 중에 교체되었습니다. 나는이 결론을 이끌어 낸 어리 석음을 설명 할 필요가 없습니다.
Wim Rijnders

이것은 답으로 표시되어야합니다. 제 경우에는 (데스크톱 앱) 메인 하드 디스크의 공간이 너무 낮아 데이터베이스를 압축하는 Windows와 관련이 있습니다. 사용자가 예라고하면 읽기 전용 데이터베이스 문제가 발생할 수있는 경우 공간을 확보하기 위해 파일을 압축 할 것인지를 묻는 메시지가 표시됩니다.
Nandostyle

10

/ db dir의 모든 파일에서 소유자를 루트에서 나로 변경하여이 문제를 해결했습니다.

그냥 할 ls -l파일러 중 하나가 소유하고있는 경우, 해당 폴더에 root그냥 당신로 변경, 사용 :sudo chown user file


5

이 오류는 일반적으로 이미 한 응용 프로그램에서 데이터베이스에 액세스하고 다른 응용 프로그램에서 액세스하려고 할 때 발생합니다.


다른 데이터베이스에서 데이터베이스에 액세스하려고하는 이유는 무엇입니까?
Peter Mortensen

나는 그가 다른 응용 프로그램에서 의미 생각
amaurymartiny

4

Android를 사용하는 경우.

만들기 확실히 당신은 당신에 대한 쓰기 권한을 추가 한 EXTERNAL_STORAGE당신에 AndroidManifest.xml.

태그 AndroidManifest.xml위와 외부 에이 줄을 파일에 추가합니다 <application>.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

이렇게하면 애플리케이션이 sdcard에 쓸 수 있습니다. 이것은 EXTERNAL_STORAGE장치에 데이터베이스를 저장 한 위치에있는 경우 도움이됩니다 .


이것은 내 문제를 해결했습니다. 나는 더 자세하고 읽기 쉽게 질문을 수정했습니다.
prolink007

감사합니다. 그것은 또한 내 문제를 해결했습니다. :)에 대한 하나의 최대 투표
Altaf 사미

4

Linux 명령 셸에서 다음을 수행했습니다.

chmod 777 <db_folder>

데이터베이스 파일이있는 위치입니다.

효과가있다. 이제 데이터베이스에 액세스하고 쿼리를 삽입 할 수 있습니다.


보안에 미치는 영향은 무엇입니까?
Peter Mortensen

이것이 adrian의 대답 과 어떻게 다른 가요?
Peter Mortensen

1
빠른 솔루션으로 작동하지만 나중에 더 나은 보안 솔루션을
찾아야합니다

4
이렇게하면 모든 사용자에게 모든 권한이 부여되며 이는 보안 관점에서 원하는 것이 아닐 수 있습니다.
Renel Chesak

3

(이 오류 메시지는 일반적으로 오해의 소지가 있으며 일반적으로 일반적인 권한 오류입니다.)

Windows에서

  • 데이터베이스에 대해 SQL을 직접 발행하는 경우 SQL을 실행하는 데 사용하는 애플리케이션이 관리자로 실행 중인지 확인하십시오.
  • 응용 프로그램이 업데이트를 시도하는 경우 데이터베이스에 액세스하는 데 사용하는 계정에 데이터베이스 파일이 포함 된 폴더에 대한 권한이 필요할 수 있습니다. 예를 들어 IIS가 데이터베이스에 액세스하는 경우 IUSR 및 IIS_IUSRS 모두 적절한 권한이 필요할 수 있습니다 (이 계정에 일시적으로 폴더에 대한 모든 권한을 부여하고 작동하는지 확인한 다음 적절한 권한을 묶음으로써 시도 할 수 있음).

1
관리자 권한으로 "DB Browser"를 실행해야했습니다.
Eben Roux

1
Windows 10에서 "Everyone"에게 "모든 권한"을 부여했지만 여전히 작동하지 않습니다. 그러나 @EbenRoux가 말했듯이 관리자로 "DB Browser"를 실행해야 할 수도 있으므로 저에게 적합합니다.
peaceoutside

2

오늘도이 문제가있었습니다.

Windows Mobile의 ActiveSync로 인해 발생했습니다. 내가 작업하던 폴더가 동기화되어 AS 프로세스가 때때로이 오류를 일으키는 DB 파일을 가져 왔습니다.


1

Linux에서는 데이터베이스 파일이 포함 된 전체 폴더에 대한 읽기 / 쓰기 권한을 부여합니다.

또한 SELinux가 쓰기를 차단할 수 있습니다. 올바른 권한을 설정해야합니다.

SELinux 관리 GUI (Fedora 19)에서 httpd_unified (모든 콘텐츠 파일의 HTTPD 처리 통합)라는 줄에있는 확인란을 선택했고 잘했습니다.


누구에 대한 읽기 / 쓰기 권한?
Peter Mortensen

그것을 확인하고 설정하는 방법?
SynCap

1

개인적인 경험을 공유하기 위해 결국 두 가지를 모두 수정하는이 오류가 발생했습니다. 반드시 귀하의 문제와 관련이있을 수는 없지만이 오류는 너무 일반적이어서 무수히 많은 것들에 기인 할 수 있습니다.

  1. 다른 응용 프로그램에서 데이터베이스 인스턴스가 열려 있습니다. 내 DB가 "잠긴"상태 인 것처럼 보였으므로 읽기 전용 모드로 전환됩니다. DB를 공유하는 애플리케이션의 두 번째 인스턴스를 중지하여 추적 할 수있었습니다.

  2. 디렉토리 트리 권한-사용자 계정이 파일 수준뿐만 아니라 전체 상위 디렉토리 수준에서 / 수준까지의 권한을 가지고 있는지 확인하십시오.

감사


1

Ubuntu에서 소유자를 Apache 그룹으로 변경하고 올바른 권한을 부여합니다 (아니요, 777이 아님).

sudo chgrp www-data <path to db.sqlite3>
sudo chmod 664 <path to db.sqlite3>

최신 정보

그룹사용자에 대한 권한도 설정할 수 있습니다 .

sudo chown www-data:www-data <path to db.sqlite3>

4
사용자가 아닌 그룹을 변경했습니다 ( 괜찮고 사용자를 변경하는 것 보다 낫지 만 대답은 오해의 소지가 있습니다).
Auspex

파일이 Apache 사용자 / 그룹에 속해야한다고 생각하는 이유는 무엇입니까?
Murphy

0

명령 줄에서 데이터베이스 파일이있는 폴더를 입력하고 다음 명령을 실행합니다.

chmod 777 databasefilename

이렇게하면 모든 사용자에게 모든 권한이 부여됩니다.


22
꽤 나쁩니다.
Marco Kerwitz 2016

완벽한 대답!
Jitesh Prajapati

이 문제를 해결할 수 있지만 보안 문제로 이어질 수 있으므로 권장하지 않습니다.
kathir raja

0

Windows의 경우 :

tl; dr : 파일을 다시 열어보십시오.

우리 시스템은이 문제를 겪고 있었고 프로그램 자체가 대부분의 경우 많은 스레드에서 쓰기 가능한 데이터베이스를 열 수 있었지만 가끔 (OSX가 아닌 Windows에서만) 데이터베이스를 열 수 있었기 때문에 확실히 권한 문제가 아니 었습니다. 프로그램의 다른 모든 스레드에 어려움이 없더라도 스레드는 이러한 오류를 받게됩니다.

결국 실패한 스레드는 다른 스레드가 데이터베이스를 닫은 직후 (3ms 이내) 데이터베이스를 열려고하는 스레드뿐이라는 사실을 발견했습니다. 우리는 Windows (또는 Windows의 sqlite 구현)가 파일을 닫을 때 파일 리소스를 즉시 정리하지 않기 때문에 문제가 발생했다고 추측했습니다. 열 때 db에 대해 테스트 쓰기 쿼리를 실행하여이 문제를 해결했습니다 (예 : 어리석은 이름으로 테이블을 만든 다음 삭제). 생성 / 삭제가 실패하면 50ms 동안 기다렸다가 다시 시도하여 성공하거나 5 초가 경과 할 때까지 반복합니다.

작동했습니다. 리소스가 디스크로 플러시되는 데 충분한 시간이 필요했습니다.


-1

DB 편집 : DB를 편집하는 데 문제가있었습니다. 나는
루트가 아닌 한 '비 루트 사용자 이름'ts3server.sqlitedb 를 sudo
해야했고 파일을 편집 할 수있었습니다. 사용자 이름은 루트가 아닌 계정의 사용자 이름입니다.

TeamSpeak 자동 시작 : 루트가 아닌 계정으로
crontab -e
@reboot / path to ts3server / aka /home/ts3server/ts3server_startscript.sh start


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