Wie kann ich eine SQLite-Datenbank entsperren?
sqlite> DELETE FROM mails WHERE (`id` = 71);
SQL error: database is locked
Wie entsperre ich die Datenbank, damit dies funktioniert?
InformationsquelleAutor der Frage ryantm | 2008-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
In windows können Sie versuchen, dieses Programm http://www.nirsoft.net/utils/opened_files_view.html herauszufinden, der Prozess ist der Umgang mit db-Datei. Versuchen geschlossen, dass das Programm für die Datenbank entsperren
In Linux und macOS können Sie etwas ähnliches machen, zum Beispiel, wenn Sie Ihre gesperrte Datei ist die Entwicklung.db:
Dieser Befehl wird angezeigt, welcher Prozess die Datei gesperrt wird:
Nur den Prozess zu beenden...
...Und Ihre Datenbank freigeschaltet werden.
InformationsquelleAutor der Antwort noneno
Ließ ich meine sqlite-db werden gesperrt durch Absturz einer app, beim schreiben. Hier ist, wie ich es behoben:
Entnommen aus: http://random.kakaopor.hu/how-to-repair-an-sqlite-database
InformationsquelleAutor der Antwort robert
Die SQLite-wiki DatabaseIsLocked Seite bietet eine gute Erklärung für diese Fehlermeldung. Es besagt zum Teil, dass die Quelle des Streits ist die interne (Prozess-emitting der Fehler).
Was diese Seite nicht erklären, ist, wie SQLite entscheidet, dass etwas in Ihrem Prozess der besitzt eine Sperre, und welche Bedingungen könnte zu einem false positive.
InformationsquelleAutor der Antwort converter42
Löschen der journal-Datei klingt wie eine schreckliche Idee. Es ist es zu ermöglichen, sqlite, um ein Rollback der Datenbank in einem konsistenten Zustand nach einem Absturz. Wenn Sie es löschen, während die Datenbank in einem inkonsistenten Zustand ist, dann Sie sind Links mit einer beschädigten Datenbank. Unter Berufung auf eine Seite aus dem sqlite Website:
Das rollback soll passieren beim nächsten mal automatisch die Datenbank geöffnet wird, aber es wird scheitern, wenn der Prozess kann nicht die Datenbank sperren. Wie schon andere gesagt haben, ein möglicher Grund ist, dass ein anderer Prozess hat derzeit es zu öffnen. Eine andere Möglichkeit ist eine veraltete NFS-sperren, wenn die Datenbank auf einem NFS-Laufwerk. In diesem Fall eine Lösung ist, ersetzen Sie die Datenbank-Datei mit einer neuen Kopie, die nicht gesperrt auf dem NFS-server (mv-Datenbank.db original.db; cp original.db-Datenbank.db). Beachten Sie, dass die sqlite-FAQ empfiehlt Vorsicht in Bezug auf den gleichzeitigen Zugriff auf Datenbanken auf NFS-volumes, weil der buggy Implementierungen von NFS file locking.
Ich kann nicht erklären, warum das löschen von a-journal Datei lassen würde, sperren Sie eine Datenbank, die Sie konnte nicht vor. Ist das reproduzierbar?
Durch die Art und Weise, die Anwesenheit der a-journal-Datei nicht zwangsläufig, dass es zu einem crash kam oder dass es änderungen zurückgesetzt werden. Sqlite hat ein paar verschiedene journal-Modi und in BESTEHEN-oder TRUNCATE-Modi, die es hinterlässt, der -journal Datei immer, und ändert den Inhalt, um anzugeben, ob oder nicht es gibt teilweise Transaktionen zu Rollback.
InformationsquelleAutor der Antwort Aaron
Wenn ein Prozess einen lock auf eine SQLite-DB und Abstürze, die DB bleibt permanent gesperrt. Das ist das problem. Es ist nicht, dass ein anderer Prozess einen lock.
InformationsquelleAutor der Antwort
die SQLite-db-Dateien sind die Dateien, also der erste Schritt wäre, um sicherzustellen, dass Sie nicht nur Lesen. Die andere Sache zu tun ist, um sicherzustellen, dass Sie nicht über irgendeine Art von GUI, SQLite DB viewer mit der DB öffnen. Sie hätte die DB öffnen, in eine andere shell, oder Ihr code kann die DB öffnen. In der Regel würden Sie dies sehen, wenn ein anderer thread, oder eine Anwendung wie SQLite Database Browser hat die DB zum schreiben geöffnet.
InformationsquelleAutor der Antwort Heat Miser
Wenn Sie möchten, entfernen Sie "Datenbank ist gesperrt" - Fehler gehen Sie dann folgendermaßen vor:
InformationsquelleAutor der Antwort vinayak jadi
Ich hatte dieses problem gerade jetzt, mit einer SQLite-Datenbank auf einem remote-server, gespeichert auf einem NFS-mount. SQLite wurde nicht um eine Sperre, nachdem der remote-shell-Sitzung, die ich verwendet hatte, stürzte während die Datenbank geöffnet war.
Die Rezepte für die Verwertung oben vorgeschlagen hast, nicht für mich arbeiten (einschließlich der Idee zum ersten Schritt und dann kopieren Sie die Datenbank zurück). Aber nach kopieren auf ein nicht-NFS-system, die Datenbank wurde nutzbar und nicht Daten scheint verloren gegangen zu sein.
InformationsquelleAutor der Antwort jogojapan
Fand ich die Dokumentation der verschiedenen Staaten sperren in SQLite sehr hilfreich. Michael, wenn du durchführen können, liest sich aber nicht durchführen kann, schreibt in die Datenbank, das bedeutet, dass ein Prozess geworden ist, VORBEHALTEN, die ein lock auf die Datenbank, aber noch nicht ausgeführt, das schreiben noch. Wenn Sie mit SQLite3, es gibt ein neues Schloss genannt ANHÄNGIG, in denen nicht mehr verarbeitet werden dürfen, zu verbinden, aber können bestehende verbindungen sill führen Sie liest, so dass, wenn das ist die Frage sollte man sich ansehen, statt.
InformationsquelleAutor der Antwort Kyle Cronin
Dieser Fehler kann ausgelöst werden, wenn die Datei liegt in einem remote-Ordner, wie Sie einen freigegebenen Ordner. Ich habe die Datenbank in ein lokales Verzeichnis und es funktionierte perfekt.
InformationsquelleAutor der Antwort Zequez
Mein Schloss war bedingt durch das system abstürzt und nicht durch einen hängenden Prozess. Diese zu lösen habe ich einfach umbenannt die Datei dann kopiert es zurück zu seiner ursprünglichen Namen und Speicherort.
Mittels linux shell das wäre...
InformationsquelleAutor der Antwort Ben L
Habe ich das problem innerhalb der app, die den Zugriff auf SQLite-aus 2 verbindungen - das eine war nur-lese-und Sekunde für schreiben und Lesen. Es sieht aus wie nur-lese-Verbindung blockiert das schreiben von der zweiten Verbindung. Schließlich ist es stellt sich heraus, dass es erforderlich ist, um abzuschließen, oder zumindest zurückgesetzt prepared statements SOFORT nach Gebrauch. Bis vorbereitete Anweisung geöffnet ist, es verursacht-Datenbank wurde gesperrt für das schreiben.
VERGESSEN SIE NICHT NENNEN:
oder
InformationsquelleAutor der Antwort Mike Keskinov
Einige Funktionen, wie INDEX ' Ing, eine sehr lange Zeit - und es sperrt die gesamte Datenbank, während es läuft. In Fällen wie diesem, ist es vielleicht nicht sogar die journal-Datei!
Also die beste/einzige Weg, um zu überprüfen, ob Ihre Datenbank gesperrt ist, weil ein Prozess ist AKTIV zu schreiben (und damit lassen Sie es die Hölle allein bis zu seiner Fertigstellung der operation) ist die md5 (oder md5sum auf manchen Systemen) die Datei zweimal.
Wenn Sie eine andere Prüfsumme, die Datenbank geschrieben wird, und Sie wirklich, wirklich, WIRKLICH nicht wollen, zu töten, -9, Prozess-denn Sie können am Ende mit eine beschädigte Tabelle/Datenbank, wenn Sie tun.
Werde ich noch einmal wiederholen, weil es wichtig ist - die Lösung ist NICHT zu finden, die Verriegelung Programm und zu töten - es zu finden, wenn die Datenbank eine Schreibsperre für einen guten Grund, und gehen von dort aus. Manchmal die richtige Lösung ist, einfach eine Kaffee-Pause.
Die einzige Möglichkeit, um diese gesperrt-aber-nicht-gerade-geschrieben-situation ist, wenn das Programm ausgeführt wird
BEGIN EXCLUSIVE
weil Sie es tun wollten, einige der Tabelle änderungen oder so etwas, dann aus welchem Grund auch immer nie sendet eineEND
danach, und der Prozess nie beendet. Alle drei Bedingungen erfüllt, ist höchst unwahrscheinlich, dass in jedem richtig geschriebenen code, und als solcher 99 mal von 100, wenn jemand will kill -9 Ihren Prozess sperren, der schließ-Prozess ist eigentlich sperren Sie Ihre Datenbank für einen guten Grund. Programmierer in der Regel nicht fügen Sie dieBEGIN EXCLUSIVE
Zustand, es sei denn, Sie wirklich brauchen, um, weil es verhindert, dass die Parallelität und erhöht die user-Beschwerden. SQLite selbst fügt nur wenn es wirklich muss (wie bei einer Indizierung).Schließlich, das "gesperrt" - status ist nicht vorhanden in der Datei mehrere Antworten angegeben haben - es ist in dem Betriebssystem-kernel. Der Prozess lief
BEGIN EXCLUSIVE
angefordert hat vom System eine Sperre in der Datei platziert werden. Auch wenn Ihr EXKLUSIVER Prozess ist abgestürzt, Ihr Betriebssystem wird in der Lage sein, um herauszufinden, wenn Sie sollten erhalten die lock-Datei oder nicht!! Es ist nicht möglich, um am Ende mit einer Datenbank, die gesperrt ist aber kein Prozess aktiv sperren!!Wenn es darum geht zu sehen, welcher Prozess die Datei gesperrt ist, ist es normalerweise besser, lsof, anstatt Fixiereinheit (dies ist ein guter Beweis, warum: https://unix.stackexchange.com/questions/94316/fuser-vs-lsof-to-check-files-in-use). Alternativ, wenn Sie DTrace (OSX) können Sie iosnoop auf die Datei.
InformationsquelleAutor der Antwort J.J
Fügte ich "
Pooling=true
" Verbindungszeichenfolge und es funktionierte.InformationsquelleAutor der Antwort user1900210
Ich hatte gerade etwas ähnliches wie mir passiert - meine web-Anwendung war in der Lage, die aus der Datenbank gelesen, aber nicht durchführen konnte, alle inserts oder-updates. Ein Neustart des Apache ist das Problem gelöst, zumindest vorübergehend.
Wäre es schön, aber in der Lage sein, die Spur der Ursache.
InformationsquelleAutor der Antwort Michael Cox
lsof Befehl auf meinem Linux-Umgebung hat mir geholfen, um es herauszufinden, wurde ein Prozess hängen, halten die Datei öffnen.
Getötet der Prozess-und problem war gelöst.
InformationsquelleAutor der Antwort PinkSheep
Diesem link das problem zu lösen. : Bei Sqlite gibt : Datenbank gesperrt Fehler
Es löste mein problem für Sie nützlich sein kann.
Und man kann mit begin transaction und end transaction nicht zu machen, Datenbank gesperrt in der Zukunft.
InformationsquelleAutor der Antwort shreeji
Sollte ein Datenbank-internen problem...
Für mich war es manifestiert sich nach dem Versuch zu durchsuchen, die Datenbank mit "SQLite manager"...
Also, wenn Sie nicht finden können, ein anderer Prozess die Verbindung zur Datenbank und du kannst es nicht reparieren,
nur versuchen, diese Radikale Lösung:
rake db:migrate
"InformationsquelleAutor der Antwort Davide Ganz
Ich lief in das gleiche problem auf Mac OS X 10.5.7 laufen Python-Skripte aus einer terminal-Sitzung. Auch wenn ich aufgehört hatte, die Skripte und das terminal-Fenster, saß an der Eingabeaufforderung geben würde, diese Fehler beim nächsten mal ran. Die Lösung war es, das Terminalfenster zu schließen und dann öffnen Sie es wieder. Macht keinen Sinn für mich, aber es funktionierte.
InformationsquelleAutor der Antwort Shawn Swaner
Hatte ich gerade den gleichen Fehler.
Nach 5 minets google-ing fand ich, dass ich didun nicht geschlossen eine shell-Hexe wurden mit der db.
Einfach schließen Sie es und versuchen Sie es erneut 😉
InformationsquelleAutor der Antwort Flow
Ich hatte das gleiche problem. Offenbar ist die rollback-Funktion scheint zu überschreiben, die db-Datei mit der Zeitschrift, die dieselbe ist wie die db-Datei, aber ohne die Letzte änderung. Ich habe realisiert, das in meinem code unten, und es war in Ordnung arbeiten, da dann, während vor meinem code würde nur stecken in der Schleife, wie die Datenbank, blieb gesperrt.
Hoffe, das hilft
mein python-code
InformationsquelleAutor der Antwort Jared
Einen gemeinsamen Grund dieser Ausnahme ist, wenn Sie versuchen zu tun, eine Schreiboperation, während Sie noch die Ressourcen für eine read-operation. Zum Beispiel, wenn Sie aus einer Tabelle AUSZUWÄHLEN, und dann versuchen, zu AKTUALISIEREN etwas, das Sie ausgewählt haben, schließen Sie Ihre erste ResultSet.
InformationsquelleAutor der Antwort Martin Carney
Vor dem Abstieg den Neustart-option, die es lohnt zu sehen, wenn Sie können finden die Benutzer die sqlite-Datenbank.
Unter Linux, die man verwenden kann
fuser
zu diesem Zweck:In meinem Fall bekam ich folgende Antwort:
Welche zeigte, dass ich hatte ein anderes Python-Programm mit der pid 3556 (manage.py) mit der Datenbank.
InformationsquelleAutor der Antwort Philip Clarke
Einer alten Frage, viele Antworten, hier sind die Schritte, die ich habe vor kurzem folgte das Lesen der oben genannten Antworten, aber in meinem Fall das problem war auf cifs-Ressourcen-sharing. In diesem Fall ist nicht bereits früher berichtet, so hoffen Sie, dass es jemand hilft.
Versuchen zu zwingen, den lock-Modus auf der Verbindung der öffnung mit
Wenn Ihr mit Ihr SQLite db-Datei über einen freigegebenen NFS-Ordner, überprüfen Sie dieser Punkt der SQLite-faq, und überprüfen Sie Ihre Montage-Konfiguration-Optionen, um sicherzustellen, dass Ihre Vermeidung sperren, wie beschrieben hier:
InformationsquelleAutor der Antwort kothvandir
Ich habe diesen Fehler in einem Szenario ein wenig anders als die, die hier beschreiben.
Die SQLite-Datenbank ruhte auf einem NFS-Dateisystem geteilt durch 3 Servern. Auf 2 Servern war ich in der Lage, tun, ausführen von Abfragen auf die Datenbank erfolgreich auf die Dritte dachte, ich war immer die "Datenbank ist gesperrt" - Meldung.
Die Sache mit diesem 3. Maschine war, dass es hatte kein Speicherplatz mehr auf
/var
. Jedesmal, wenn ich versuchte, führen Sie eine Abfrage in einer BELIEBIGEN SQLite-Datenbank, die in diesem Dateisystem ich habe die "Datenbank ist gesperrt" - Meldung und auch dieser Fehler über die Protokolle:Und auch dies:
Nach Raum situation gehandhabt wurde, wurde alles wieder normal.
InformationsquelleAutor der Antwort ederribeiro
Aus Ihren vorherigen Kommentaren gesagt, ein journal-Datei vorhanden war.
Könnte dies bedeuten, dass Sie geöffnet haben und (EXKLUSIVEN?) die Transaktion, die noch nicht verpflichtet, die Daten. Habt Ihr Programm oder einen anderen Prozess zu verlassen, der -journal hinter??
Neustart die sqlite-Prozess wird sich mit der journal-Datei, und bereinigen Sie alle nicht ausgeführten Handlungen und entfernen Sie die journal-Datei.
InformationsquelleAutor der Antwort
Als Seun Osewa hat gesagt, manchmal ist ein zombie-Prozess zu sitzen in der Klemme mit einem Schloss erworben, auch wenn Sie glaube nicht, dass es möglich ist. Dein Skript läuft, stürzt ab, und gehen Sie zurück zu der Eingabeaufforderung, aber es ist ein zombie-Prozess hervorgebracht hat, die irgendwo durch einen library-call durch, und dieser Vorgang hat die Sperre.
Schließen Sie das terminal, Sie waren in (auf OSX) funktionieren könnte. Neustart funktionieren wird. Man konnte sich für "python" - Prozesse (zum Beispiel), die sind nicht etwas zu tun, und Sie töten.
InformationsquelleAutor der Antwort wisty
können Sie versuchen, diese:
.timeout 100
zu set timeout .Ich weiß nicht, was passiert in der Kommandozeile, aber in C# .Net wenn ich dies tun:
"UPDATE table-name SET column-name = value;"
bekomme ich die Datenbank gesperrt ist, aber dies"UPDATE table-name SET column-name = value"
es geht in Ordnung.Sieht es aus, wenn Sie hinzufügen, sqlite werde schauen Sie für weitere Befehl.
InformationsquelleAutor der Antwort nXqd
Bekam ich diese Fehlermeldung bei der Verwendung von Delphi mit der LiteDAC Komponenten.
Stellte sich heraus, es passiert nur beim ausführen meiner app aus der Delphi-IDE, wenn das Verbundene Eigenschaft festgelegt wurde, gilt für die SQLite-Verbindung-Komponente (in diesem Fall TLiteConnection).
InformationsquelleAutor der Antwort TheSteven
Adminer ist eine kleine (aber mächtige) phpmyadmin alternative, die ich verwenden, um zu überwachen, die sqlite-Datenbank. Für einige Grund, warum die Datenbank gesperrt habe. Hier ist, wie ich es behoben.
Es funktioniert jetzt.
InformationsquelleAutor der Antwort Mohsin