295 votes

Comment déverrouiller une base de données SQLite ?

sqlite> DELETE FROM mails WHERE (`id` = 71);
SQL error: database is locked

Comment puis-je déverrouiller la base de données pour que cela fonctionne ?

0 votes

Il se peut qu'un autre processus accède au fichier de la base de données - avez-vous vérifié lsof ?

0 votes

J'ai eu le même problème, le problème était dans l'antivirus quand je le désactive mon application fonctionne bien, mais quand je l'active je trouve l'erreur "la base de données est verrouillée", j'espère que cela va vous aider.

15voto

Si un processus a un verrou sur une base de données SQLite et se plante, la base de données reste verrouillée en permanence. C'est là le problème. Ce n'est pas qu'un autre processus a un verrou.

13voto

Heat Miser Points 6305

Les fichiers SQLite db sont juste des fichiers, donc la première étape serait de s'assurer qu'ils ne sont pas en lecture seule. L'autre chose à faire est de s'assurer que vous n'avez pas une sorte de GUI SQLite DB viewer avec la DB ouverte. Vous pouvez avoir la base de données ouverte dans un autre shell, ou votre code peut avoir la base de données ouverte. Typiquement, vous verrez cela si un autre thread, ou une application telle que SQLite Database Browser a la base de données ouverte pour l'écriture.

12voto

Ben L Points 1208

Mon blocage a été causé par le plantage du système et non par un processus suspendu. Pour résoudre ce problème, j'ai simplement renommé le fichier, puis je l'ai recopié dans son nom et son emplacement d'origine.

En utilisant un shell linux, ce serait...

mv mydata.db temp.db
cp temp.db mydata.db

11voto

jogojapan Points 26661

J'ai eu ce problème à l'instant, en utilisant une base de données SQLite sur un serveur distant, stockée sur un montage NFS. SQLite n'a pas pu obtenir un verrou après que la session shell distante que j'ai utilisée ait planté alors que la base de données était ouverte.

Les recettes de récupération suggérées ci-dessus n'ont pas fonctionné pour moi (y compris l'idée de déplacer d'abord et de recopier ensuite la base de données). Mais après l'avoir copiée sur un système non-NFS, la base de données est devenue utilisable et aucune donnée ne semble avoir été perdue.

7voto

user1900210 Points 93

J'ai ajouté " Pooling=true " à la chaîne de connexion et cela a fonctionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X