web-dev-qa-db-fra.com

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 son fichier de base de données après avoir exécuté des tests qui ferment la base de données, la suppriment et la remplacent par un dispositif de test. Lorsque j'examine le fichier de base de données avec un outil sur mon PC de débogage, il ne correspond pas à ce que l'application elle-même semble signaler. 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 .db Normale.) Les extensions de fichier sont .db-shm Et .db-wal, Et chacune est plus récente que l'horodatage du fichier .db.

Je suppose que ce sont des types de fichiers temporaires. Cependant, je me demande si l'application est terminée, ne devrait-elle pas être supprimée? Plus important encore, je suppose que toutes les données qui y sont stockées sont mises à jour dans le fichier .db Avant que l'application ne soit arrêtée par le système d'exploitation. Est-ce correct?

51
Jeff Axelrod

Vous avez raison, ce sont des fichiers temporaires créés par SQLite. Si vous supprimez manuellement la base de données principale, vous devriez probablement aussi les supprimer. D'après ce que je peux comprendre, le WAL est un remplacement du journal de restauration qui permet à SQLite d'annuler les modifications lorsqu'une transaction échoue. La façon dont SQLite les utilise et pourquoi ils sont conservés pendant si longtemps dépend 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 jetez un œil ici:

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

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

28
satur9nine

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

Selon les documents SQLite , le fichier DB-SHM est un fichier de mémoire partagée, uniquement présent lorsque SQLite s'exécute en mode WAL (Write-Ahead Log). En effet, en mode WAL, les connexions db partageant le même fichier db doivent toutes mettre à jour le même emplacement mémoire utilisé comme index pour le fichier WAL, pour éviter les conflits.

Quant au fichier WAL, comme indiqué ci-dessus, il s'agit d'un journal/journal d'écriture, utile à des fins de validation/annulation. Si la base de données n'est pas en cours d'exécution, il est parfaitement correct de supprimer ce fichier, et en fait, il serait automatiquement supprimé lors du redémarrage de la base de données s'il en existe un (car il n'est utile que lorsque la base de données écrit/valide activement des données).

4
Tiede