Super-Sale-WocheClaude Skills – 20 % RABATT
Glossary

SQLite-Dateien erklärt: Struktur, Anwendungsfälle und wichtige Limits

Powerdrill Bloom·
SQLite-Dateien erklärt: Struktur, Anwendungsfälle und wichtige Limits

Eine SQLite-Datei ist eine einzelne Datei auf der Festplatte, die eine gesamte relationale Datenbank enthält – Tabellen, Indizes und das Schema zusammen. Die eigene Dokumentation von SQLite bezeichnet sie als „Hauptdatenbankdatei“ und stellt fest, dass „der vollständige Zustand einer SQLite-Datenbank normalerweise darin enthalten ist“. Das Wort „normalerweise“ leistet in diesem Satz echte Arbeit.

Wenn Ihnen jemals eine .db-, .sqlite- oder .sqlite3-Datei übergeben wurde und Sie sich gefragt haben, ob Sie alle Daten erhalten haben, ist dies das Format, das Sie genau verstehen sollten.

Was eine SQLite-Datei eigentlich ist

SQLite beschreibt sich selbst als „eine In-Process-Bibliothek, die eine eigenständige, serverlose, konfigurationsfreie, transaktionale SQL-Datenbank-Engine implementiert“. Auf derselben Seite wird angegeben, dass SQLite „keinen separaten Serverprozess hat“. Eine Anwendung bindet die Bibliothek ein und liest die Datei.

Daraus ergeben sich zwei Konsequenzen. Erstens reist die Datenbank als ein einziges Artefakt, weshalb so viele Anwendungen ihre Daten auf diese Weise ausliefern. Zweitens muss das Format extrem stabil sein, da diese Dateien die Software überleben, die sie geschrieben hat. SQLite listet ein „stabiles, dauerhaftes Dateiformat“ unter seinen Hauptmerkmalen auf. Es wird auch angegeben, dass der Code gemeinfrei ist, „frei zur Nutzung für jeden Zweck, ob kommerziell oder privat“.

Die Dimensionen werden leicht unterschätzt. Die eigene Info-Seite von SQLite besagt, dass es „die am weitesten verbreitete Datenbank der Welt ist, mit mehr Anwendungen, als wir zählen können“.

Was sich in der Datei befindet

Der 100-Byte-Header

Die ersten Bytes identifizieren das Format. Bei Offset 0 enthält die Datei eine 16-Byte-Header-Zeichenfolge: SQLite format 3\000. Anhand dieser Signatur erkennen Tools die Datei unabhängig von ihrer Dateiendung.

Das nächste Feld ist wichtiger, als es aussieht. Bei Offset 16 befindet sich eine 2-Byte-Ganzzahl, die „die Datenbank-Seitengröße in Bytes“ enthält. In der Dokumentation heißt es, sie „muss eine Zweierpotenz zwischen einschließlich 512 und 32768 sein, oder der Wert 1, der eine Seitengröße von 65536 darstellt“. Alle Multibyte-Felder im Header werden mit dem signifikantesten Byte zuerst gespeichert (Most Significant Byte First).

Zwei weitere Bytes folgen bei den Offsets 18 und 19: die Schreibversion und die Leseversion des Dateiformats. In der Dokumentation wird vermerkt, dass der Wert „1 für Legacy; 2 für WAL“ ist.

Seiten, nicht Zeilen

Unterhalb des Headers ist die Datei ein Stapel von Seiten fester Größe. Die Spezifikation ist eindeutig: „Die Hauptdatenbankdatei besteht aus einer oder mehreren Seiten. Die Größe einer Seite ist eine Zweierpotenz zwischen einschließlich 512 und 65536. Alle Seiten innerhalb derselben Datenbank haben dieselbe Größe.“

Die Seiten sind ab 1 nummeriert, und die maximale Seitenzahl beträgt 4.294.967.294. Tabellen und Indizes befinden sich in diesen Seiten als B-Tree-Strukturen, weshalb Ihnen ein Texteditor nur sehr wenig anzeigt.

Die Sidecar-Dateien, die niemand erwähnt

Das ist der Teil, der die Leute kalt erwischt. In der Dokumentation heißt es, dass der vollständige Zustand „normalerweise“ in einer Datei liegt. Dann wird die Ausnahme genannt. Während einer Transaktion speichert SQLite „zusätzliche Informationen in einer zweiten Datei namens ‚Rollback-Journal‘“. Im WAL-Modus ist diese zweite Datei ein Write-Ahead-Log.

Eine Kopie, die erstellt wird, während die Anwendung gerade schreibt, enthält also möglicherweise keine festgeschriebenen Daten, die sich noch in der Sidecar-Datei befinden. Wenn Ihnen ein Kollege eine .db-Datei und sonst nichts schickt und die Zahlen etwas veraltet aussehen, ist dies das Erste, was Sie überprüfen sollten.

So öffnen Sie eine SQLite-Datei

Es gibt drei Wege, und der richtige hängt davon ab, was Sie als Nächstes tun möchten.

Mit einem Viewer lesen. Desktop- und browserbasierte SQLite-Viewer öffnen die Datei, listen die Tabellen auf und lassen Sie durch die Zeilen klicken. Dies ist der schnellste Weg, um die Frage „Was ist hier überhaupt drin?“ zu beantworten, und reicht für einen ersten Blick meist aus.

Mit der Befehlszeile oder einer Bibliothek abfragen. Die sqlite3-Shell und die Bindungen der Standardbibliothek in Python, Node und den meisten anderen Sprachen lesen das Format direkt. Dies ist der richtige Weg, wenn Sie das Schema bereits kennen und eine bestimmte Zahl ermitteln möchten.

Eine Tabelle exportieren und an anderer Stelle analysieren. Exportieren Sie eine Tabelle als CSV und importieren Sie sie in ein beliebiges Tool, das Ihr Team bereits verwendet. Dabei gehen die Beziehungen zwischen den Tabellen verloren, was genau das ist, was das Format geschützt hat. Exportieren Sie nach Möglichkeit das zusammengeführte Ergebnis (Join) anstelle der Rohdaten-Tabellen.

Warum ein Tool melden könnte, dass die Datei keine Datenbank ist

Die Spezifikation erklärt dies. Jede gültige Datei beginnt mit einer 16-Byte-Header-Zeichenfolge: SQLite format 3\000. Ein Leseprogramm, das eine Datei öffnet und diese Signatur bei Offset 0 nicht findet, hat keine SQLite-Datenbank vor sich.

Drei gewöhnliche Ursachen decken die meisten Fälle ab. Die Datei wurde unvollständig übertragen, sodass der Header zwar vorhanden, der Rest jedoch abgeschnitten ist. Die Datei ist verschlüsselt oder von einer Anwendung verpackt, sodass die ersten Bytes etwas anderes sind. Oder die Dateiendung ist irreführend, und was Sie tatsächlich erhalten haben, war ein einfacher Export, der von jemandem umbenannt wurde, der behilflich sein wollte.

Wie groß kann eine SQLite-Datei werden?

Größer, als die Frage meist vermuten lässt. Die Limit-Seite von SQLite gibt an, dass die maximale Größe einer Datenbankdatei 4.294.967.294 Seiten beträgt. Bei der maximalen Seitengröße von 65.536 Bytes entspricht dies einer maximalen Datenbankgröße von etwa 281 Terabyte.

Die Seite ist erfrischend ehrlich, was diese Zahl angeht. Sie merkt an, dass die Obergrenze „ungetestet ist, da die Entwickler keinen Zugriff auf Hardware haben, die in der Lage ist, dieses Limit zu erreichen“.

Die Anzahl der Zeilen stößt an dieselbe Grenze. Das theoretische Maximum liegt bei 2^64 Zeilen in einer Tabelle. In der Dokumentation wird darauf hingewiesen, dass diese Grenze „unerreichbar ist, da die maximale Datenbankgröße von 281 Terabyte zuerst erreicht wird“.

Für die praktische Arbeit ist die nützliche Erkenntnis das Gegenteil eines Limits. Wenn Ihnen jemand eine .db-Datei übergibt und Sie warnt, dass sie groß ist, wird das Format mit Sicherheit nicht das Problem sein. Die bei der Erstellung der Datei gewählte Seitengröße und die Frage, ob sie Indizes enthält, beeinflussen die Performance weitaus mehr als jede dokumentierte Obergrenze.

Wo man auf SQLite-Dateien stößt

  • Anwendungsexporte. Desktop- und mobile Apps speichern oft den Verlauf, Einstellungen und Nachrichtenprotokolle in einer SQLite-Datei, die Sie herauskopieren können.
  • Übergaben für Analysen. Entwickler stellen einen Snapshot als einzelne Datei bereit, anstatt Datenbankzugriff zu gewähren.
  • Geräte und Telemetrie. Eingebettete Systeme schreiben lokal, da kein Server vorhanden ist, mit dem sie kommunizieren können.
  • Archive. Die langfristige Stabilität des Formats macht es zu einer beliebten Wahl für Datensätze, die über Jahre hinweg lesbar bleiben müssen.
  • Browser- und Tool-Interna. Viele lokale Tools speichern ihren Zustand auf diese Weise, weshalb die Dateiendung häufig in Support-Tickets auftaucht.

Wofür die WAL- und Journal-Dateien da sind

Vielleicht haben Sie eine .db-Datei kopiert und daneben eine -wal- oder eine -journal-Datei gefunden. Das sind die in der Spezifikation beschriebenen Sidecar-Dateien, und deren Löschung führt häufig zu Datenverlust.

Das Rollback-Journal ist der ältere Mechanismus. Vor dem Ändern einer Seite schreibt SQLite die Originalversion dieser Seite in das Journal. Wenn der Schreibvorgang unterbrochen wird, kann das Original wiederhergestellt werden, wodurch eine Transaktion einen Absturz übersteht.

Das Write-Ahead-Log kehrt diese Anordnung um. Änderungen werden zuerst in das Log geschrieben, und die Hauptdatei wird erst später aktualisiert. Der Header kennzeichnet, in welchem Modus sich eine Datenbank befindet. Die Schreibversion des Dateiformats bei Offset 18 ist „1 für Legacy; 2 für WAL“.

Die praktische Regel ergibt sich direkt aus dem Satz über den vollständigen Zustand. Angenommen, die Datenbank befindet sich im WAL-Modus und jemand übergibt Ihnen nur die Hauptdatei. Die jüngsten festgeschriebenen Änderungen befinden sich dann möglicherweise noch in dem Log, das Sie nicht erhalten haben.

Wenn Ihnen also eine Datenbankdatei übergeben wird, stellen Sie zwei Fragen: Wurde die Anwendung sauber geschlossen, als die Kopie erstellt wurde, und wurde noch etwas anderes mitgeliefert? Beide Antworten lauten in der Regel „Ja“, und das eine Mal, wenn dies nicht der Fall ist, weichen die Zahlen stillschweigend von der Produktionsumgebung ab.

SQLite-Datei vs. CSV vs. Parquet

SQLite-Datei CSV Parquet
Form Viele Tabellen, eine Datei Eine Tabelle, eine Datei Eine Tabelle, eine Datei oder ein Ordner
Typen Mit den Daten gespeichert Vom Leseprogramm abgeleitet Mit den Daten gespeichert
Beziehungen Beibehalten, über Schlüssel und Indizes Verloren Verloren
Für Menschen lesbar Nein Ja Nein
Für Abfragen konzipiert Ja, mit SQL Nein Ja, durch Analyse-Engines
Häufiger Fehler Fehlendes Journal oder WAL-Sidecar Raten von Typen und Trennzeichen Toolchain-Unterstützung

Wenn Sie regelmäßig mit diesen Formaten arbeiten, decken unsere Erklärungen zu Parquet-Dateien und TSV-Dateien dasselbe Thema für diese beiden Formate ab.

Warum Teams dieses Format wählen

Nichts muss ausgeführt werden. Da SQLite „keinen separaten Serverprozess hat“, ist eine Übergabe eine einfache Dateikopie und kein Bereitstellungsticket.

Typen überstehen die Übertragung. Eine Datumsspalte kommt als Datum an. Jeder, der schon einmal erlebt hat, wie ein CSV-Reader eine Kennung in eine wissenschaftliche Notation umwandelt, weiß das zu schätzen.

Beziehungen bleiben ebenfalls erhalten. Mehrere zusammenhängende Tabellen bleiben in einem einzigen Artefakt vereint, sodass die Joins, die den Daten erst eine Bedeutung verliehen haben, weiterhin verfügbar sind.

Dauerhaftigkeit ist von Haus aus integriert. SQLite listet Transaktionen „selbst nach Stromausfall“ unter seinen Kernfunktionen auf, weshalb so viele eingebettete Softwarelösungen darauf setzen.

Wissenswerte Einschränkungen

Eine Datei, jeweils nur ein Schreiber. Die Engine ist eingebettet und wird nicht über einen Server bereitgestellt, weshalb sich das Nebenläufigkeitsmodell von einer Client-Server-Datenbank unterscheidet. Das ist eine Designentscheidung, kein Mangel, aber es bestimmt, wofür die Datei geeignet ist.

Die Seitengröße wird bei der Erstellung festgelegt. Jede Seite in einer Datenbank hat dieselbe Größe, und diese Größe wird im Header aufgezeichnet. Sie wählen sie einmal aus.

Nochmals die Sidecar-Regel. Jede Kopier-, Backup- oder Upload-Routine, die nur die Hauptdatei erfasst, kann das übersehen, was sich im Journal oder Write-Ahead-Log befand.

Undurchsichtigkeit. Eine SQLite-Datei lässt sich nicht so einfach überfliegen wie eine CSV-Datei. Zum Lesen ist ein Tool erforderlich, und genau diese Hürde bremst viele Analysen aus.

Wie man Antworten aus einer SQLite-Datei erhält

Der traditionelle Weg besteht darin, einen Client zu installieren, die Datei zu öffnen, das Schema kennenzulernen und mit dem Schreiben von SQL zu beginnen. Das ist in Ordnung, wenn Sie die Tabellen bereits kennen. Es ist jedoch langsam, wenn Ihnen die Datei heute Morgen übergeben wurde und das Meeting heute Nachmittag stattfindet.

Der kürzere Weg ist, die Frage direkt zu stellen. Mit Powerdrill Bloom können Sie in natürlicher Sprache mit Ihren Daten arbeiten und erhalten eine Antwort inklusive Quelle. Die Homepage verspricht, dass „jede Zahl mit der Seite, der Zeile und dem Wert dahinter zurückgegeben wird“. Von dort aus kann derselbe Arbeitsbereich Diagramme, Tabellen oder eine kurze Präsentation erstellen.

Zwei verwandte Seiten sind für Ihren regelmäßigen Workflow nützlich. Chat with Database deckt den dialogbasierten Weg zu strukturierten Daten ab, und Text to SQL ist für den Fall gedacht, dass Sie die Abfrage selbst benötigen. Wenn Ihre Übergabe stattdessen als flacher Export erfolgt, deckt die Seite CSV AI assistant diesen Pfad ab.

Nochmals die Sidecar-Regel.

Da die Seitengröße an einem festen Offset liegt, können Sie etwas Nützliches über eine Datei erfahren, bevor Sie sie richtig öffnen. Eine Datenbank, die mit einer Seitengröße von 4.096 Bytes erstellt wurde, verhält sich anders als eine, die mit 65.536-Byte-Seiten erstellt wurde. Diese Entscheidung wurde einmalig bei der Erstellung der Datei getroffen.

Es ist keine Zahl, die man im Nachhinein einfach so ändert. Sie gehört gedanklich eher in die Kategorie einer Schema-Entscheidung als in die einer Einstellung.

Fazit

Eine SQLite-Datei ist eine ganze Datenbank in einem einzigen Artefakt. Sie enthält eine 16-Byte-Signatur, eine bei Offset 16 aufgezeichnete Seitengröße und einen Stapel von Seiten fester Größe, die Ihre Tabellen und Indizes enthalten. Sie lässt sich gut übertragen, behält ihre Typen bei und bleibt über Jahre hinweg lesbar.

Denken Sie an die eine Einschränkung, bei der die Spezifikation vorsichtig ist. Der vollständige Zustand befindet sich normalerweise in dieser Datei. Während einer Transaktion liegt ein Teil davon in einem Rollback-Journal oder einem Write-Ahead-Log daneben. Suchen Sie nach der Sidecar-Datei, bevor Sie der Kopie vertrauen.

Wenn Sie die Datei haben und die Antwort statt des Schemas benötigen, probieren Sie Powerdrill Bloom aus und stellen Sie Ihre Frage direkt an die Daten.

Häufig gestellte Fragen

Was ist der Unterschied zwischen .db, .sqlite und .sqlite3?

Strukturell gibt es keinen Unterschied. Alle drei sind übliche Dateiendungen für dasselbe Format, und der eigentliche Identifikator ist die 16-Byte-Header-Zeichenfolge SQLite format 3\000 am Anfang der Datei.

Woher weiß ich, welche Seitengröße eine SQLite-Datei verwendet?

Sie ist im Header aufgezeichnet. Eine 2-Byte-Ganzzahl bei Offset 16 enthält die Seitengröße in Bytes. Sie muss eine Zweierpotenz zwischen 512 und 32768 sein, oder der Wert 1, der für 65536 steht.

Ist eine SQLite-Datei die vollständige Datenbank?

Normalerweise ja, aber nicht immer. In der Dokumentation wird angegeben, dass SQLite während einer Transaktion zusätzliche Informationen in einem Rollback-Journal speichert. Im WAL-Modus werden diese Informationen stattdessen in ein Write-Ahead-Log geschrieben.

Kann ich eine SQLite-Datei in Excel öffnen?

Nicht direkt, da die Datei B-Tree-Seiten anstelle von Textzeilen speichert. Der übliche Weg besteht darin, eine Tabelle zuerst als CSV zu exportieren oder ein Tool zu verwenden, das das Datenbankformat liest und Ergebnisse zurückgibt.

Ist SQLite für die kommerzielle Nutzung kostenlos?

Ja. SQLite gibt an, dass sein Code gemeinfrei ist und „frei zur Nutzung für jeden Zweck, ob kommerziell oder privat“ zur Verfügung steht.