112 votes

Quelles sont les extensions .db-shm et .db-wal dans les bases de données Sqlite ?

Je constate un comportement étrange avec mon application et l'état de sa base de données après avoir exécuté des tests qui ferment la base de données, la suppriment, et la remplacent par une configuration de test. Lorsque j'examine le fichier de base de données avec un outil sur mon PC de débogage, cela ne correspond pas à ce que l'application semble rapporter. Il est possible que ce comportement étrange soit lié à ce bug.

J'ai remarqué qu'il y a deux fichiers avec le même nom de base que la base de données (avec l'extension normale .db). Les extensions de fichiers sont .db-shm et .db-wal, et chacun est plus récent que l'horodatage du fichier .db.

Je suppose qu'il s'agit de fichiers temporaires. Cependant, je me demande si l'application étant terminée, ne devraient-ils pas être supprimés? Plus important encore, je suppose que les données qui y sont stockées sont mises à jour à l'intérieur du fichier .db avant que l'application ne soit terminée par le système d'exploitation. Est-ce correct?

65voto

satur9nine Points 3901

Vous avez raison, il s'agit de fichiers temporaires créés par SQLite. Si vous supprimez manuellement la base de données principale, vous devriez probablement supprimer ceux-ci également. D'après ce que j'ai pu comprendre, le WAL est un remplacement pour le journal de rollback qui permet à SQLite d'annuler les changements lorsqu'une transaction échoue. Comment SQLite les utilise et pourquoi ils sont conservés si longtemps relève des auteurs de SQLite, mais en général SQLite semble assez solide donc je ne m'inquiéterais pas trop à leur sujet. Pour plus d'informations, consultez ici:

http://www.sqlite.org/fileformat2.html#walindexformat

Ces fichiers sont une nouvelle fonctionnalité de SQLite 3.7. Je ne suis pas sûr si leur existence est liée au bug que vous signalez, mais le rapport de bug suggère de toute façon une solution de contournement.

MISE À JOUR:

Une meilleure documentation sur le WAL est disponible ici:

https://www.sqlite.org/wal.html

Le contenu du WAL est périodiquement déplacé vers le fichier DB, mais cela n'est pas garanti à chaque fois que le processus se termine. Ainsi, lorsque le WAL est activé, chaque base de données SQLite se compose de deux fichiers sur le disque qui doivent être préservés, à la fois le fichier .db et le fichier .db-wal.

Le fichier .db-shm est un fichier de mémoire partagée qui ne contient que des données temporaires.

32voto

Tiede Points 189

Je n'ai pas encore assez de réputation pour ajouter simplement un commentaire à la réponse de satur9nine, je vais donc ajouter le mien ici.

Conformément à la documentation SQLite, le fichier DB-SHM est un fichier de mémoire partagée, présent uniquement lorsque SQLite fonctionne en mode WAL (Write-Ahead Log). En effet, en mode WAL, les connexions de base de données partageant le même fichier de base de données doivent toutes mettre à jour le même emplacement mémoire utilisé comme index pour le fichier WAL, afin de prévenir les conflits.

Quant au fichier WAL, comme mentionné ci-dessus, il s'agit d'un journal d'écriture utile pour les opérations de commit/rollback.

2voto

Sayantan Basu Points 41

Assurez-vous d'avoir correctement fermé le curseur dans l'opération SELECT. Parfois, SQLiteOpenHelper crée des extensions de base de données .db-shm et .db-wal en raison d'un curseur non fermé.

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