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.

296voto

noneno Points 906

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.

24 votes

... 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 !

0 votes

La solution la plus simple serait de redémarrer votre ordinateur.

9 votes

@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 ;)

94voto

robert Points 915

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

6 votes

Sqlite3 : sqlite> .dump PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; /**** ERROR: (5) database is locked *****/ ROLLBACK; -- due to errors

0 votes

Ne fonctionne pas pour FOREIGN KEY constraint failed (RELEASE RESTOREPOINT)

54voto

converter42 Points 3264

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

3 votes

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.

4 votes

@converter42 Lien rompu.

33voto

Aaron Points 479

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.

30voto

vinayak jadi Points 375

Si vous voulez supprimer l'erreur "la base de données est verrouillée", suivez ces étapes :

  1. Copiez votre fichier de base de données vers un autre emplacement.
  2. Remplacez la base de données par la base de données copiée. Cela déréférencera tous les processus qui accédaient à votre fichier de base de données.

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