Ändern Sie den SQLite-Datenbankmodus in Lesen / Schreiben


101

Wie kann ich eine SQLite-Datenbank von schreibgeschützt in schreibgeschützt ändern?

Wenn ich die Update-Anweisung ausgeführt habe, habe ich immer Folgendes erhalten:

SQL-Fehler: Versuchen Sie, eine schreibgeschützte Datenbank zu schreiben

Die SQLite-Datei ist eine beschreibbare Datei im Dateisystem.


3
Verfügt der Benutzer, der sqlite3 ausführt (oder was auch immer Sie zum Ausführen der Abfrage verwenden), über Schreibberechtigungen für die Datenbank? Haben Sie den Dateibesitz doppelt überprüft?
Tim Post

Ich bin sicher, sie haben die Erlaubnis dazu.
user143482

2
Ich habe dies in einer Web-App gesehen, in der ich vergessen habe, die GID für die Datenbankdatei festzulegen, und dem Konto "www-data" (unter dem Apache ausgeführt wird) der Schreibzugriff auf die Datei verweigert wurde.
Finnw

Antworten:


86

Diese Fehlermeldung kann mehrere Gründe haben:

  • Bei mehreren Prozessen ist die Datenbank gleichzeitig geöffnet ( siehe FAQ ).

  • Es gibt ein Plugin zum Komprimieren und Verschlüsseln der Datenbank. Die Datenbank kann nicht geändert werden.

  • In einer weiteren FAQ heißt es schließlich: "Stellen Sie sicher, dass das Verzeichnis mit der Datenbankdatei auch für den Benutzer beschreibbar ist, der das CGI-Skript ausführt." Ich denke, das liegt daran, dass die Engine mehr Dateien im Verzeichnis erstellen muss.

  • Das gesamte Dateisystem ist möglicherweise schreibgeschützt, beispielsweise nach einem Absturz.

  • Auf Unix-Systemen kann ein anderer Prozess die gesamte Datei ersetzen.


26
Ich würde mein Gebot für das dritte Aufzählungszeichen abgeben - das Verzeichnis mit der DB-Datei sollte auch beschreibbar sein, damit die Sperrdatei erstellt werden kann.
Kimvais

Erste Kugel für mich: D
Vinay

Letzter. Ich vergesse immer sudo: P
Sturm

2
Ich kann dieser Liste hinzufügen: Die Datenbankdatei wurde während der Verwendung ersetzt. Ich möchte die Dummheit, die zu dieser Schlussfolgerung geführt hat, nicht erklären müssen.
Wim Rijnders

Dies sollte als Antwort markiert werden. In meinem Fall (Eine Desktop-App) war dies auf Windows zurückzuführen. Komprimieren der Datenbank, da die Hauptfestplatte zu wenig Speicherplatz hat. Ich denke, Windows wird den Benutzer fragen, ob er Dateien komprimieren möchte, um Speicherplatz zu erhalten, wenn der Benutzer Ja sagt, kann das Problem der schreibgeschützten Datenbank auftreten.
Nandostyle

10

Ich habe dies gelöst, indem ich den Besitzer für alle Dateien in / db dir von root auf mich geändert habe.

Machen Sie es einfach ls -lin diesem Ordner, wenn einer der Filer im Besitz von ist, rootändern Sie ihn einfach zu Ihnen, indem Sie:sudo chown user file


5

Dieser Fehler tritt normalerweise auf, wenn eine Anwendung bereits auf Ihre Datenbank zugreift und Sie versuchen, mit einer anderen Anwendung darauf zuzugreifen.


Warum sollten Sie versuchen, von einer anderen Datenbank aus auf eine Datenbank zuzugreifen?
Peter Mortensen

Ich denke, er meinte aus einer anderen Anwendung
amaurymartiny

4

Bei Verwendung von Android.

Achten Sie darauf , die Erlaubnis zu schreiben , um Ihre hinzugefügt haben , EXTERNAL_STORAGEum Ihre AndroidManifest.xml.

Fügen Sie diese Zeile AndroidManifest.xmlüber und außerhalb Ihres <application>Tags zu Ihrer Datei hinzu .

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

Dadurch kann Ihre Anwendung auf die SD-Karte schreiben. Dies ist hilfreich, wenn EXTERNAL_STORAGESie Ihre Datenbank auf dem Gerät gespeichert haben.


Dies löste mein Problem. Ich habe die Frage geändert, um mehr Details zu erhalten und leichter zu lesen.
Prolink007

Vielen Dank. es hat auch mein Problem gelöst. eine Stimme für :)
Altaf Sami

4

In der Linux-Befehlsshell habe ich Folgendes getan:

chmod 777 <db_folder>

Wo enthält die Datenbankdatei.

Es klappt. Jetzt kann ich auf meine Datenbank zugreifen und Einfügeabfragen stellen.


Was sind die Auswirkungen auf die Sicherheit?
Peter Mortensen

Wie unterscheidet sich das von Adrians Antwort ?
Peter Mortensen

1
Es funktioniert als schnelle Lösung, muss aber später nach einer besser gesicherten Lösung
suchen

4
Dadurch werden allen Benutzern alle Berechtigungen erteilt, was aus Sicherheitsgründen wahrscheinlich nicht Ihren Wünschen entspricht.
Renel Chesak

3

(Diese Fehlermeldung ist normalerweise irreführend und in der Regel ein allgemeiner Berechtigungsfehler.)

Unter Windows

  • Wenn Sie SQL direkt für die Datenbank ausgeben, stellen Sie sicher, dass die Anwendung, mit der Sie SQL ausführen, als Administrator ausgeführt wird
  • Wenn eine Anwendung versucht, das Update durchzuführen, benötigt das Konto, mit dem sie auf die Datenbank zugreift, möglicherweise Berechtigungen für den Ordner, der Ihre Datenbankdatei enthält. Wenn IIS beispielsweise auf die Datenbank zugreift, benötigen sowohl IUSR als auch IIS_IUSRS möglicherweise entsprechende Berechtigungen (Sie können dies versuchen, indem Sie diesen Konten vorübergehend die volle Kontrolle über den Ordner geben, prüfen, ob dies funktioniert, und die Berechtigungen gegebenenfalls binden).

1
Ich musste "DB Browser" als Administrator ausführen.
Eben Roux

1
Ich habe "Jeder" unter Windows 10 "volle Kontrolle" gegeben, und es würde immer noch nicht funktionieren. Wie @EbenRoux bereits sagte, müssen Sie möglicherweise auch "DB Browser" als Administrator ausführen, damit es für mich funktioniert.
Frieden außerhalb des

2

Ich hatte dieses Problem auch heute.

Dies wurde durch ActiveSync unter Windows Mobile verursacht. Der Ordner, in dem ich arbeitete, wurde synchronisiert, sodass der AS-Prozess von Zeit zu Zeit die DB-Datei abrief und diesen Fehler verursachte.


1

Geben Sie unter Linux Lese- / Schreibberechtigungen für den gesamten Ordner, der die Datenbankdatei enthält.

Außerdem blockiert SELinux möglicherweise den Schreibvorgang. Sie müssen die richtigen Berechtigungen festlegen.

In meiner SELinux Management-Benutzeroberfläche (unter Fedora 19) habe ich das Kontrollkästchen in der Zeile httpd_unified (Unify HTTPD-Behandlung aller Inhaltsdateien) aktiviert und konnte loslegen.


Lese- / Schreibberechtigungen für wen?
Peter Mortensen

Wie überprüfe und stelle ich das ein?
SynCap

1

Um persönliche Erfahrungen auszutauschen, bin ich auf diesen Fehler gestoßen, der schließlich beide behebt. Könnte nicht unbedingt mit Ihrem Problem zusammenhängen, aber es scheint, dass dieser Fehler so allgemein ist, dass er auf Millionen von Dingen zurückgeführt werden kann.

  1. Datenbankinstanz in einer anderen Anwendung geöffnet. Meine Datenbank schien sich in einem "gesperrten" Zustand zu befinden, sodass sie in den schreibgeschützten Modus überging. Ich konnte es aufspüren, indem ich die zweite Instanz der Anwendung stoppte, die die Datenbank gemeinsam nutzt.

  2. Verzeichnisbaumberechtigung - Stellen Sie sicher, dass das Benutzerkonto nicht nur auf Dateiebene, sondern auf der gesamten oberen Verzeichnisebene bis zur Ebene / über Berechtigungen verfügt.

Vielen Dank


1

Ändern Sie unter Ubuntu den Eigentümer in die Apache-Gruppe und erteilen Sie die richtigen Berechtigungen (nein, es ist nicht 777):

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

Aktualisieren

Sie können die Berechtigungen auch für Gruppen und Benutzer festlegen .

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

4
Sie haben gerade die Gruppe geändert , nicht den Benutzer (was in Ordnung ist und wahrscheinlich besser als das Ändern des Benutzers, aber Ihre Antwort ist irreführend).
Auspex

Was lässt Sie denken, dass die Datei dem Apache-Benutzer / der Apache-Gruppe gehören sollte?
Murphy

0

Geben Sie in der Befehlszeile den Ordner ein, in dem sich Ihre Datenbankdatei befindet, und führen Sie den folgenden Befehl aus:

chmod 777 databasefilename

Dadurch werden allen Benutzern alle Berechtigungen erteilt.


22
Welches ist ziemlich schlecht.
Marco Kerwitz

perfekte Antwort !
Jitesh Prajapati

Es könnte dieses Problem lösen, wird jedoch nicht empfohlen, da dies zu Sicherheitsproblemen führen kann.
Kathir Raja

0

Unter Windows:

tl; dr: Versuchen Sie erneut, die Datei zu öffnen.

Unser System hatte dieses Problem, und es war definitiv kein Berechtigungsproblem, da das Programm selbst die Datenbank die meiste Zeit als beschreibbar von vielen Threads aus öffnen konnte, aber gelegentlich (nur unter Windows, nicht unter OSX). Ein Thread würde diese Fehler erhalten, obwohl alle anderen Threads im Programm keine Schwierigkeiten hatten.

Wir stellten schließlich fest, dass die fehlgeschlagenen Threads nur diejenigen waren, die versuchten, die Datenbank sofort zu öffnen, nachdem ein anderer Thread sie geschlossen hatte (innerhalb von 3 ms). Wir spekulierten, dass das Problem auf die Tatsache zurückzuführen ist, dass Windows (oder die SQLite-Implementierung unter Windows) beim Schließen einer Datei nicht immer sofort die Dateiressourcen bereinigt. Wir haben dies umgangen, indem wir beim Öffnen eine Testschreibabfrage für die Datenbank ausgeführt haben (z. B. Erstellen und Löschen einer Tabelle mit einem albernen Namen). Wenn das Erstellen / Löschen fehlgeschlagen ist, haben wir 50 ms gewartet und es erneut versucht. Wir haben es wiederholt, bis wir erfolgreich waren oder 5 Sekunden vergangen sind.

Es funktionierte; Anscheinend musste nur genügend Zeit vorhanden sein, damit die Ressourcen auf die Festplatte übertragen werden konnten.


-1

DB bearbeiten: Ich hatte Probleme beim Bearbeiten der Datenbank.
Am Ende musste ich sudo chown 'non root username' ts3server.sqlitedb
solange es nicht root war, konnte ich die Datei bearbeiten. Benutzername ist der Benutzername meines Nicht-Root-Kontos.

TeamSpeak automatisch starten: Als Ihr Nicht-Root-Konto wird
crontab -e
@reboot / path to ts3server / aka /home/ts3server/ts3server_startscript.sh gestartet


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.