Est-il sécuritaire de supprimer le fichier WAL de sqlite?
J'ai un problème étrange avec Base de Données dans une application iOS et où, parfois, le WAL fichier devient énorme (~1 GO). Il semble qu'il ya d'autres personnes avec le problème (p. ex. Base de Données sqlite-wal fichier devient MASSIVE (>7 GO) lors de l'insertion ~5000 lignes).
Ma première pensée est de supprimer le fichier WAL au lancement de l'app. Il semble à la lecture de l'sqlite de la documentation sur la question que ce sera très bien. Mais personne ne sait tout des inconvénients à le faire?
J'aimerais bien évidemment à aller au fond de pourquoi le WAL fichier est si grand, mais je ne peux pas aller au fond de ce droit maintenant et que vous voulez mettre dans une solution de contournement alors que je creuse plus profondément dans le problème.
Il est intéressant de souligner que ma Base de Données de la base de données est plus un cache. Donc, ce n'est pas grave si je perds les données dans le WAL. Ce que j'ai vraiment besoin de savoir, c'est la base de données sera complètement corrompu si je supprime le WAL? Mon soupçon est non, sinon les WAL ne pas servir l'un de ses buts.
source d'informationauteur mattjgalloway
Vous devez vous connecter pour publier un commentaire.
WAL mode a des problèmes, ne l'utilisez pas. Les problèmes varient, mais la très grande taille de votre rapport est l'un, d'autres problèmes, notamment le non au cours de la migration (à l'aide de NSPersistentStoreCoordinators migratePersistentStore) et l'échec lors de l'importation de iCloud journaux de transactions. Ainsi, alors que il y a des avantages jusqu'à ce que ces bugs sont corrigés son sans doute imprudent d'utiliser WAL mode.
Et NON, vous ne pouvez pas supprimer l'Écrire à l'Avance du Journal, car qui contient les données les plus récentes.
Ensemble de la base de données pour l'utilisation de la fonction restauration journal de mode et je pense que vous trouverez que vous n'avez plus ces fichiers très volumineux lors du chargement d'un grand nombre de données.
Voici un extrait qui explique comment WAL œuvres. Sauf si vous pouvez garantir que votre application a exécuté un point de contrôle, je ne vois pas comment vous pouvez supprimer le fichier WAL sans courir le risque de la suppression de transactions validées.
J'ai été voir quelques rapports négatifs sur WAL dans iOS 7. J'ai dû le désactiver sur plusieurs projets jusqu'à ce que j'ai eu le temps d'explorer les questions de fond.
Je ne serait pas supprimer le fichier journal, mais vous pouvez jouer avec l'option de passer l'aspirateur sur le fichier SQLite qui sera la cause de SQLite à "consommer" le fichier journal. Vous pouvez le faire en ajoutant le
NSSQLiteManualVacuumOption
dans le cadre des options lorsque vous ajoutez leNSPersistentStore
à laNSPersistentStoreCoordinator
.Si cela finit par être beaucoup de temps alors je vous suggérons de désactiver le WAL. Je n'ai pas vu les effets néfastes de le désactiver (encore).
Il y a assez de bonnes réponses sur ce fil, mais je suis en ajoutant ce un lien vers l'Apple officielle QnA sur mode de journalisation dans iOS7 de Base de Données:
https://developer.apple.com/library/ios/qa/qa1809/_index.html
Ils donnent différentes solutions:
TRÈS IMPORTANT DE MODIFIER
Si certains de vos utilisateurs sont sur
iOS 8.1
et vous avez choisi la première solution (celui d'Apple recommande), il faut noter que leurmany-to-many
les relations entre les données seront complètement jeté. Perdu. Supprimé. Dans l'ensemble de la base de données migrée.C'est un méchant bug apparemment résolu dans
iOS 8.2
. Plus d'info ici http://mjtsai.com/blog/2014/11/22/core-data-relationships-data-loss-bug/Couple de choses:
Vous pouvez certainement supprimer le fichier WAL. Vous perdrez toutes les transactions validées qui n'ont pas été jalonné de retour pour le fichier principal. (Par conséquent une violation de la "durabilité" de la partie de l'ACIDE, mais peut-être que vous n'avez pas de soins.)
Vous pouvez contrôler la taille de l'WAL fichier sur le disque avec la journal_size_limit pragma (si cela vous dérange). Vous pouvez manuellement point de contrôle le plus souvent trop. Voir "en Évitant de Trop Grandes WAL fichiers" ici: https://www.sqlite.org/wal.html
Je n'aime pas tous les superstitieux bashing de WAL mode. WAL mode est plus rapide, plus solidaire, et beaucoup plus simple puisqu'elle dispense à tous les niveau de verrouillage manigances (et plus "de la base de données est occupé" problèmes) qui vont de pair avec la restauration des revues. WAL mode est le bon choix dans presque toutes les situations. (Le seul endroit où c'est problématique, c'est sur flash les systèmes de fichiers qui ne prennent pas en charge partagée mappés en mémoire de l'accès aux fichiers. Dans ce cas, le "non officiel" SQLITE_SHM_DIRECTORY compiler directive peut être utilisée pour déplacer la .shm fichier à un autre type de système de fichiers (par exemple, tmpfs -- mais cela ne devrait pas être un souci sur iOS.)
Vous devriez ne jamais supprimer le sqlite WAL fichier, il contient les transactions qui n'ont pas été écrites à la réelle fichier sqlite encore. Au lieu de la force de la base de données de point de contrôle, puis nettoyer les WAL fichier pour vous.
Dans CoreData la meilleure façon de le faire est d'ouvrir la base de données avec la SUPPRESSION de la revue mode de pragma. Ce sera un point de référence et ensuite supprimer le fichier WAL pour vous.
Pour la santé mentale de saké, vous devez vous assurer d'avoir une seule connexion à la persistance de la banque lorsque vous faites cela, c'est à dire un seul magasin persistant instance dans un seul magasin persistant coordonnateur.
FWIW dans votre cas particulier, vous pouvez utiliser TRUNCATE ou OFF pour votre base de données initiale, à l'importation, et de passer à WAL pour les mises à jour.
http://www.sqlite.org/pragma.html#pragma_journal_mode