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 ?
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 ?
Sous Windows, vous pouvez essayer ce programme http://www.nirsoft.net/utils/opened_files_view.html pour découvrir le processus qui traite le fichier db. Essayez de fermer ce programme pour débloquer la base de données.
Sous Linux et macOS, vous pouvez faire quelque chose de similaire, par exemple, si votre fichier verrouillé est development.db :
$ fuser development.db
Cette commande montrera quel processus verrouille le fichier :
> development.db : 5430
Il suffit de tuer le processus...
tuer -9 5430
...Et votre base de données sera déverrouillée.
... avec l'avertissement évident que vous devez savoir ce que vous faites. S'il s'agit d'un processus sans importance, alors... kill
devrait aller, mais vous devez faire attention à le tuer correctement, et kill -9
est probablement erronée et/ou excessive. Si le processus est suspendu et qu'il ne mourra pas autrement, il faut parfois kill -9
. Mais vous ne voulez pas tuer le travail de production principal juste pour pouvoir signaler que la base de données n'est plus verrouillée !
@chacham15 : vous supposez que la base de données se trouve sur "mon" ordinateur, et vous ignorez la possibilité que de nombreux processus importants s'exécutent sur le même ordinateur que celui dont la base de données est verrouillée. La solution "la plus simple" n'est jamais si simple ;)
J'ai provoqué le verrouillage de mon disque sqlite en plantant une application pendant une écriture. Voici comment je l'ai réparé :
echo ".dump" | sqlite old.db | sqlite new.db
Tiré de : http://random.kakaopor.hu/how-to-repair-an-sqlite-database
Le wiki SQLite DatabaseIsLocked offre une explication de ce message d'erreur. Elle indique, en partie, que la source de conflit est interne (au processus qui émet l'erreur). Ce que cette page n'explique pas, c'est comment SQLite décide que quelque chose dans votre processus détient un verrou et quelles conditions pourraient conduire à un faux positif.
Ce code d'erreur se produit lorsque vous essayez de faire deux choses incompatibles avec une base de données en même temps à partir de la même connexion de base de données.
Les changements relatifs au verrouillage des fichiers introduits dans la v3 et qui peuvent être utiles pour les futurs lecteurs peuvent être trouvés ici : Verrouillage des fichiers et concurrence dans SQLite Version 3
Le problème est que cette page est soit incorrecte, soit obsolète : j'ai un processus qui ne fait littéralement rien d'autre qu'un simple INSERT et qui obtient ce message de verrouillage : il est impossible que ce processus ait causé le verrouillage. Le problème se situe dans un autre processus qui parle à la même base de données.
Supprimer le fichier -journal semble être une très mauvaise idée. Il est là pour permettre à sqlite de ramener la base de données à un état cohérent après un crash. Si vous le supprimez alors que la base est dans un état incohérent, vous vous retrouvez avec une base corrompue. Citant une page du site sqlite :
Si un crash ou une perte de puissance se produit et qu'un journal à chaud est laissé sur le disque, il est essentiel que le fichier de base de données original et le journal à chaud restent sur le disque avec leurs noms originaux jusqu'à ce que le fichier de base de données soit ouvert par un autre processus SQLite et annulé. [...]
Nous soupçonnons qu'un mode d'échec courant pour la récupération de SQLite se produit comme ceci : Une panne de courant se produit. Une fois l'alimentation rétablie, un utilisateur ou un administrateur système bien intentionné commence à chercher des dégâts sur le disque. Il voit son fichier de base de données nommé "important.data". Ce fichier leur est peut-être familier. Mais après le crash, il y a aussi un hot journal nommé "important.data-journal". L'utilisateur supprime alors le journal chaud, pensant qu'il aide à nettoyer le système. Nous ne connaissons pas d'autre moyen d'empêcher cela que l'éducation des utilisateurs.
Le retour en arrière est censé se produire automatiquement lors de la prochaine ouverture de la base de données, mais il échouera si le processus ne peut pas verrouiller la base de données. Comme d'autres l'ont dit, une raison possible pour cela est qu'un autre processus l'a actuellement ouverte. Une autre possibilité est un verrou NFS périmé, si la base de données est sur un volume NFS. Dans ce cas, une solution de contournement consiste à remplacer le fichier de la base de données par une copie fraîche qui n'est pas verrouillée sur le serveur NFS (mv database.db original.db ; cp original.db database.db). Notez que la FAQ sqlite recommande la prudence en ce qui concerne l'accès simultané aux bases de données sur des volumes NFS, à cause d'implémentations boguées du verrouillage des fichiers NFS.
Je ne peux pas expliquer pourquoi la suppression d'un fichier -journal vous permet de verrouiller une base de données alors que vous ne le pouviez pas auparavant. Est-ce que cela est reproductible ?
À propos, la présence d'un fichier -journal ne signifie pas nécessairement qu'il y a eu un plantage ou que des modifications doivent être annulées. Sqlite a plusieurs modes de journal différents, et dans les modes PERSIST ou TRUNCATE, il laisse toujours le fichier -journal en place, et change son contenu pour indiquer si oui ou non il y a des transactions partielles à annuler.
Si vous voulez supprimer l'erreur "la base de données est verrouillée", suivez ces étapes :
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.
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.