Was sind die Erweiterungen .db-shm und .db-wal in Sqlite-Datenbanken?

Lesezeit: 4 Minuten

Benutzer-Avatar
Jeff Axelrod

Ich sehe ein seltsames Verhalten bei meiner Anwendung und dem Status ihrer Datenbankdatei, nachdem ich einige Tests ausgeführt habe, die die Datenbank schließen, löschen und durch eine Testvorrichtung ersetzen. Wenn ich die Datenbankdatei mit einem Tool auf meinem Debugging-PC untersuche, stimmt sie nicht mit dem überein, was die Anwendung selbst zu melden scheint. Es ist möglich, dass dieses seltsame Verhalten damit zusammenhängt dieser Fehler.

Mir ist aufgefallen, dass es zwei Dateien mit demselben Basisnamen wie die Datenbank gibt (mit der normalen .db Erweiterung.) Die Dateierweiterungen sind .db-shm und .db-walund jeder ist neuer als die .db Zeitstempel der Datei.

Ich gehe davon aus, dass es sich um temporäre Dateien handelt. Ich frage mich jedoch, ob die Anwendung beendet ist, sollten sie nicht gelöscht werden? Noch wichtiger ist, dass ich davon ausgehe, dass alle darin gespeicherten Daten in der aktualisiert werden .db Datei, bevor die Anwendung vom Betriebssystem beendet wird. Ist das richtig?

  • @satur9nine das ist wirklich seltsam.. Ich wurde gebeten, den Code eines anderen zu aktualisieren.. und während des Testens wurde mir klar, dass seine Verwendung von Kerndaten mit iOS 6.x einwandfrei funktionierte.. aber dann, als ich es auf iOS 7.x testete. Es führte zu dem oben Gesagten .db-shm und .db-wal.. ist das noch jemandem passiert?

    – abbod

    11. November 2013 um 10:59 Uhr

  • Unter iOS 7 scheinen diese alle Transaktionen zu enthalten. Die db-Datei ist für mich eine leere Datenbank. Ich muss alle drei Dateien greifen, um den “echten” Inhalt der Datenbank zu sehen.

    – Ryan Booker

    15. Januar 2014 um 3:39 Uhr

Benutzer-Avatar
satur99

Sie haben Recht, dies sind temporäre Dateien, die von SQLite erstellt wurden. Wenn Sie die Hauptdatenbank manuell löschen, sollten Sie diese wahrscheinlich auch löschen. Soweit ich weiß, ist die WAL ein Ersatz für das Rollback-Journal, das es SQLite ermöglicht, Änderungen rückgängig zu machen, wenn eine Transaktion fehlschlägt. Wie SQLite sie verwendet und warum sie so lange aufbewahrt werden, ist den Autoren von SQLite überlassen, aber im Allgemeinen scheint SQLite ziemlich felsenfest zu sein, sodass ich mir darüber keine allzu großen Sorgen machen würde. Weitere Informationen finden Sie hier:

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

Diese Dateien sind ein neues Feature von SQLite 3.7. Ich bin mir nicht sicher, ob ihre Existenz mit dem Fehler zusammenhängt, auf den Sie hinweisen, aber der Fehlerbericht schlägt trotzdem eine Problemumgehung vor.

AKTUALISIEREN:

Eine bessere Dokumentation über die WAL ist hier:

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

Der Inhalt der WAL wird regelmäßig in die DB-Datei verschoben, aber es ist nicht garantiert, dass dies jedes Mal auftritt, wenn der Prozess beendet wird. Wenn also WAL aktiviert ist, besteht jede SQLite-DB aus zwei Dateien auf der Festplatte, die aufbewahrt werden müssen, sowohl die .db-Datei als auch die .db-wal-Datei.

Die .db-shm-Datei ist eine gemeinsam genutzte Speicherdatei, die nur temporäre Daten enthält.

  • Aber was ist mit der .shm-Datei. Kannst du das etwas beleuchten?

    – G. Abhisek

    20. September 2016 um 12:27 Uhr

  • Per Link: Die mmapped-Datei befindet sich im selben Verzeichnis wie die Datenbank und hat denselben Namen wie die Datenbank mit einem angehängten “-shm”-Suffix.

    – satur9nine

    26. September 2017 um 19:51 Uhr

  • Ich verstehe immer noch nicht, was sie tun exakt, aber es scheint, dass ich den Inhalt der .db-Datei ohne sie nicht anzeigen kann. Sind sie irgendwelche Metadaten?

    – getsadzeg

    24. April 2019 um 11:38 Uhr


  • Auf Android möchte ich warnen, dass Sie, wenn Sie Ihre Datenbank in einen anderen Ordner verschieben, auch die -wal- und -shm-Dateien verschieben MÜSSEN. Andernfalls könnte Ihre Datenbank leer sein. Dieses Problem trat zumindest auf dem Emulator auf.

    – Carson Holzheimer

    22. Januar 2020 um 6:23 Uhr

Benutzer-Avatar
Tiede

Ich habe noch nicht genug Ruf, um die Antwort von satur9nine einfach zu kommentieren, also werde ich hier weitermachen.

Gem die SQLite-Dokumentation, die DB-SHM-Datei ist eine Shared Memory-Datei, die nur vorhanden ist, wenn SQLite im WAL-Modus (Write-Ahead Log) ausgeführt wird. Dies liegt daran, dass im WAL-Modus alle DB-Verbindungen, die sich dieselbe DB-Datei teilen, denselben Speicherort aktualisieren müssen, der als Index für die WAL-Datei verwendet wird, um Konflikte zu vermeiden.

Die WAL-Datei ist, wie oben angedeutet, ein Schreibprotokoll/Journal, das für Commits/Rollback-Zwecke nützlich ist.

  • Von dem Dokumentation (Abschnitt 4): “Die WAL-Datei ist Teil des persistenten Zustands der Datenbank und sollte mit der Datenbank aufbewahrt werden, wenn die Datenbank kopiert oder verschoben wird”. Das manuelle Löschen dieser Datei kann zu Datenverlust führen!

    – Luator

    8. Juni 2021 um 15:22 Uhr

Benutzer-Avatar
Sayantan Basu

Stellen Sie sicher, dass Sie den Cursor richtig geschlossen haben SELECT Betrieb. Manchmal erstellt SQLiteOpenHelper .db-shm und .db-wal Erweiterungsdatenbank aufgrund eines nicht geschlossenen Cursors.

1300990cookie-checkWas sind die Erweiterungen .db-shm und .db-wal in Sqlite-Datenbanken?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy