101 - Datenstrukturen in SQLite-Datenbanken - Kapitel 7
45 Questions
21 Views

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson

Questions and Answers

Welche Datenstrukturen werden typischerweise in SQLite-Datenbankdateien verwendet?

  • B-Bäume und binäre Suchbäume
  • B-Bäume und Tabellen (correct)
  • Lineare Listen und Hashtabellen
  • B-Bäume und Hashtabellen

Wie groß ist die kleinste mögliche Größe einer SQLite-Datenbank?

  • 1 Kilobyte
  • 1024 Bytes
  • 256 Bytes
  • 512 Bytes (correct)

Welche der folgenden Page-Typen ist in SQLite-Datenbanken am häufigsten vorhanden?

  • Pointer Map Page
  • Overflow Page
  • B-Tree Page (correct)
  • Freelist Page

Welche der folgenden Page-Typen ist kein Bestandteil einer SQLite-Datenbank?

<p>Data Page (B)</p> Signup and view all the answers

Welche der folgenden Aussagen beschreibt am besten die Funktion von 'Freelist Pages' in SQLite?

<p>Sie verwalten den freien Speicherplatz innerhalb der Datenbank. (B)</p> Signup and view all the answers

Welche zwei Hauptunterarten von B-Tree Pages werden in SQLite verwendet?

<p>Innen- (Interior) und Blatt- (Leaf) Pages (D)</p> Signup and view all the answers

Wo werden die aktiven Inhalte der Tabellen in einer SQLite-Datenbank primär gespeichert?

<p>In Table-B-Tree Pages (B)</p> Signup and view all the answers

Wozu dient eine 'Lock-Byte Page' in einer SQLite Datenbank?

<p>Zur Implementierung der Datenbank Sperrfunktion (A)</p> Signup and view all the answers

Welche Aussage beschreibt die Architektur von SQLite am besten?

<p>SQLite läuft direkt auf dem Client und benötigt keinen separaten Server. (A)</p> Signup and view all the answers

Wie werden die Daten einer SQLite-Datenbank typischerweise gespeichert?

<p>Die Daten werden als eine einzige Datei abgelegt. (A)</p> Signup and view all the answers

Welche der folgenden Optionen ist kein typischer Anwendungsbereich für SQLite?

<p>Große, verteilte Server-Datenbanken in Rechenzentren. (B)</p> Signup and view all the answers

Was ist der Hauptfokus beim Verständnis des Dateiformats von SQLite im forensischen Kontext?

<p>Das Verständnis des zugrunde liegenden Dateiformats zur forensisch relevanten Datenanalyse und -gewinnung. (D)</p> Signup and view all the answers

Woraus besteht eine SQLite Datenbank grundsätzlich?

<p>Eine Sammlung von Tabellen, die durch definierte Formate charakterisiert sind. (C)</p> Signup and view all the answers

Was ist das Konzept hinter relationalen Datenbanken im Zusammenhang mit SQLite?

<p>Tabellen können über eindeutige Schlüssel miteinander verknüpft werden. (D)</p> Signup and view all the answers

Was ist das Ziel der Normalisierung einer Datenbank?

<p>Die Minimierung von Duplikaten und Steigerung von Effizienz und Integrität. (C)</p> Signup and view all the answers

Was bedeutet es, wenn eine Datenbank 'normalisiert' ist?

<p>Die Datenbank ist frei von Redundanzen. (B)</p> Signup and view all the answers

Welche der folgenden Aussagen beschreibt die Funktion von Interior Pages in einer SQLite-Datenbank am besten?

<p>Sie speichern keine Daten, sondern enthalten Pointer zu anderen Pages. (B)</p> Signup and view all the answers

Was ist die Hauptfunktion der Leaf Pages im Kontext einer SQLite-Datenbank?

<p>Sie enthalten die eigentlichen Datensätze, die in der Datenbank abgelegt wurden. (D)</p> Signup and view all the answers

Wie viele Root Pages gibt es in einer Standard-SQLite-Tabelle?

<p>Es existiert exakt eine Root Page am Anfang des Tables. (C)</p> Signup and view all the answers

Was passiert mit Pages in einer SQLite-Datenbank, wenn Daten verändert werden?

<p>Pages können hinzugefügt, gelöscht oder modifiziert werden, um Datenänderungen zu reflektieren. (C)</p> Signup and view all the answers

Welche der folgenden Komponenten ist kein Bestandteil des Aufbaus von Interior- und Leaf Pages in SQLite?

<p>Datenbank Schema (A)</p> Signup and view all the answers

Was ist innerhalb einer Zelle (Cell) in einer SQLite-Page enthalten?

<p>Cell Header und Cell Payload. (C)</p> Signup and view all the answers

Was kennzeichnet die Struktur größerer Tabellen in Bezug auf Interior- und Leaf Pages?

<p>Größere Tabellen besitzen eine komplexe Struktur aus Interior- und Leaf Pages. (D)</p> Signup and view all the answers

Was beschreibt der Begriff 'Free Blocks' im Kontext von SQLite Pages?

<p>Verfügbare Speicherbereiche innerhalb der Page, die für neue Einträge genutzt werden können. (A)</p> Signup and view all the answers

Was bedeutet die Zahl 118 in Bezug auf einen SQLite-Datensatz?

<p>Die Gesamtgröße des Datensatzes in Byte. (A)</p> Signup and view all the answers

Was bedeutet ein Serial Type Array mit der Länge 0x00 in einem SQLite-Datensatz?

<p>Das Serial Type Array ist defekt oder nicht vorhanden. (C)</p> Signup and view all the answers

Was beschreibt 'verwaiste Einträge' im Kontext von SQLite?

<p>Einträge die am Anfang von nicht-allokierten Bytes beginnen. (A)</p> Signup and view all the answers

Was repräsentiert die Zahl (49)₁₀ im Kontext des zweiten Beispiels?

<p>Die Länge des String-Payloads in Byte. (B)</p> Signup and view all the answers

Welche Bedeutung hat 'ROWID' in einem SQLite-Datensatz?

<p>Die eindeutige ID des Datensatzes. (C)</p> Signup and view all the answers

Wie wird die Länge des String-Payloads im zweiten Beispiel berechnet?

<p>Durch Subtraktion von 13 von (49)₁₀ und anschließender Division durch 2. (D)</p> Signup and view all the answers

Warum ist die Anzahl der Bytes des Serial Type Arrays in den 'verwaisten Einträgen' oft 0x00?

<p>Weil der Eintrag korrupt ist oder nicht korrekt allokiert wurde. (B)</p> Signup and view all the answers

Was ist die Funktion von pos.VARINT im Kontext der Payload-Länge und ROWID?

<p>Es speichert eine variable Anzahl an Bytes um die Länge oder ID zu repräsentieren. (B)</p> Signup and view all the answers

Was bedeutet es, wenn die angegebene Payload-Länge eines Eintrags größer ist als benötigt?

<p>Der Eintrag könnte korrekt sein, insbesondere wenn die Datentypen in der Tabelle mit den Serial Types übereinstimmen. (B)</p> Signup and view all the answers

Welches Szenario beschreibt ein Problem mit der Größe von Serial Types in verwaisten Einträgen?

<p>Die angegebene Länge der Serial Types führt zu einem Payload, der zu groß ist. (A)</p> Signup and view all the answers

Was ist ein Indikator für einen verwaisten Eintrag, der sich fast erfolgreich wiederherstellen lässt?

<p>Ein mit NOT NULL definiertes Attribut hat den Wert NULL. (A)</p> Signup and view all the answers

Wenn ein Eintrag an einem nicht-allokierten Byte-Bereich beginnt, was ist eine mögliche Interpretation?

<p>Der Eintrag könnte gültig sein, besonders wenn er zu erwartenden Datenmustern passt. (B)</p> Signup and view all the answers

Wie kann sich eine Diskrepanz zwischen einer berechneten und der eigentlichen Länge eines Datensatzes äußern?

<p>Die Summe der Serial Types in einem Eintrag kann kleiner sein als die angegebene Länge des Datensatzes. (B)</p> Signup and view all the answers

Welche Auswirkung hat das Überschreiben der ersten vier Bytes eines gelöschten Eintrags in SQLite?

<p>Der Eintrag wird zu einem partiellen Eintrag. (A)</p> Signup and view all the answers

Welche Informationen befinden sich im Freeblock-Header, der die ersten vier Bytes eines gelöschten SQLite Eintrags überschreibt?

<p>Ein Pointer zum nächsten Freeblock und die Länge des aktuellen Freeblocks. (C)</p> Signup and view all the answers

Warum können bei partiellen Einträgen in SQLite unterschiedliche Teile überschrieben worden sein?

<p>Wegen der Verwendung von VARINTs am Anfang eines Eintrags. (C)</p> Signup and view all the answers

Welche der folgenden Kombinationen von Daten können bei einem partiellen Eintrag in SQLite überschrieben sein?

<p>Die Länge des Payloads, ROWID und weitere Daten des Headers. (D)</p> Signup and view all the answers

Wovon ist die Wiederherstellung von partiellen Einträgen in SQLite abhängig?

<p>Vom Schema der Tabelle und der Anzahl der Einträge. (B)</p> Signup and view all the answers

In welcher Reihenfolge sind die Bestandteile eines SQLite-Eintrags typischerweise angeordnet?

<p>Payload Len, ROWID, Record Len, Serial Types. (A)</p> Signup and view all the answers

Was wird durch die Serial Types in einem SQLite-Eintrag beschrieben?

<p>Der Typ, der in der Spalte gespeichert ist (z.B. INTEGER oder TEXT). (D)</p> Signup and view all the answers

Wie beeinflusst das Vorhandensein von VARINTs die Struktur eines Eintrags?

<p>VARINTs verändern die Länge und Position verschiedener Felder im Eintrag. (D)</p> Signup and view all the answers

Flashcards

Was ist SQLite?

SQLite ist eine Datenbank, die von Richard Hipp entwickelt wurde und keine Client-Server-Architektur verwendet.

Wo läuft SQLite?

SQLite ist eine Datenbank, die auf dem Client-Computer ausgeführt wird und die Daten in einer Datei speichert.

Wo wird SQLite eingesetzt?

SQLite wird von einer Vielzahl von Anwendungen verwendet, einschließlich Android und Apple iOS Betriebssysteme, sowie Desktop-Betriebssystemen wie Mac und Windows.

Wie ist eine SQLite-Datei strukturiert?

Eine SQLite-Datei enthält mehrere Tabellen. Jede Tabelle hat ein definiertes Format (Schema).

Signup and view all the flashcards

Wie werden Tabellen in SQLite miteinander verknüpft?

Tabellen in einer SQLite-Datenbank können über eindeutige Schlüssel miteinander verknüpft werden. Dies ermöglicht es, Daten in verschiedenen Tabellen miteinander zu verbinden.

Signup and view all the flashcards

Was ist eine normalisierte Datenbank?

Eine normalisierte Datenbank minimiert Datenredundanz und maximiert die Effizienz und Integrität der Daten.

Signup and view all the flashcards

Warum ist das SQLite-Dateiformat wichtig?

Das Verständnis des SQLite-Dateiformats kann bei der Erstellung und Abfrage von Datenbanken helfen, aber es ist besonders relevant für forensische Untersuchungen.

Signup and view all the flashcards

Warum ist das SQLite-Dateiformat forensisch relevant?

Das Dateiformat von SQLite ist so aufgebaut, dass es leicht zu analysieren und zu verstehen ist, was es zu einem wertvollen Werkzeug für forensische Untersuchungen macht.

Signup and view all the flashcards

SQLite-Datenbank

Eine Sammlung von Tabellen und Indizes, die zur Organisation und Verwaltung von Daten eingesetzt werden.

Signup and view all the flashcards

B-Trees

Eine Möglichkeit, Daten in einer SQLite-Datenbank zu strukturieren, die auf binären Bäumen basiert.

Signup and view all the flashcards

Page

Die kleinste Einheit, aus der eine SQLite-Datenbank besteht, meist mit einer Größe von 512 Bytes.

Signup and view all the flashcards

B-Tree Pages

Ein Datentyp, der eine Sammlung von Einträgen in einer Datenbank darstellt.

Signup and view all the flashcards

Table-B-Tree

Eine der Arten von B-Tree Pages, die Informationen über die Struktur der Datenbanktabellen speichern.

Signup and view all the flashcards

Index-B-Tree

Eine der Arten von B-Tree Pages, die Informationen über die Indizes einer Datenbanktabelle speichern.

Signup and view all the flashcards

Interior Pages

B-Tree Pages, die Verweise auf andere Seiten enthalten und nicht direkt Daten speichern.

Signup and view all the flashcards

Leaf Pages

B-Tree Pages, die tatsächlich Daten enthalten.

Signup and view all the flashcards

Datenstruktur in B-Trees

In den B-Trees werden alle Daten in Interior und Leaf Pages (Blättern) gespeichert.

Signup and view all the flashcards

Root Page in B-Trees

Die Root Page ist die oberste Ebene in einem B-Tree. Sie ist der Ausgangspunkt für die Suche nach Daten.

Signup and view all the flashcards

Interior Pages in B-Trees

Interior Pages sind die Knoten in einem B-Tree. Sie enthalten Referenzen auf andere Interior Pages oder Leaf Pages.

Signup and view all the flashcards

Leaf Pages in B-Trees

Leaf Pages sind die Blätter eines B-Trees. Sie speichern die eigentlichen Daten der Datenbank.

Signup and view all the flashcards

Ohne ROWID – Special Case

Eine wichtige Ausnahme bilden Tables, die als "WITHOUT_ROWID" definiert sind. Diese speichern ihre Daten direkt in den Leaf Pages.

Signup and view all the flashcards

Struktur großer Tables

Je größer ein Table, desto komplexer wird die Verzweigungstruktur aus Interior und Leaf Pages.

Signup and view all the flashcards

Dynamische B-Tree Struktur

Änderungen in der Datenbank können zum Hinzufügen, Löschen oder Verschieben von Pages führen.

Signup and view all the flashcards

Aufbau von B-Tree Pages

B-Tree Pages bestehen aus einem Page Header, einem Cell Pointer Array, Zellen mit Cell Header und Cell Payload, sowie freien Blöcken.

Signup and view all the flashcards

Verwaister Eintrag (SQLite)

Ein SQLite-Eintrag, der nicht mehr in der Datenbasis verwendet wird, aber noch auf der Festplatte vorhanden ist. Dieser Eintrag kann verloren gegangen sein, z.B. durch das Löschen einer Zeile in einer Tabelle.

Signup and view all the flashcards

Verwaister Eintrag - Länge der Serial Types zu groß

Die in einem SQLite-Eintrag gespeicherten Daten sind länger als die definierte Größe für die Datentypen in der Tabelle.

Signup and view all the flashcards

Verwaister Eintrag - (fast) korrekter Eintrag

Der Wert eines Attributs in einem verwaisten Eintrag ist NULL, obwohl das Attribut in der Tabelle als NOT NULL definiert ist. Dies verstößt gegen das Schema der Tabelle.

Signup and view all the flashcards

Direkt zugreifende Datenbank

Die in einer Datenbank gespeicherten Daten werden direkt auf der Festplatte abgelegt, ohne im Arbeitsspeicher zu liegen.

Signup and view all the flashcards

B-Bäume

Die Daten einer Datenbank werden nach ihrem Typ in spezielle Bereiche auf der Festplatte geschrieben. Diese Bereiche werden dann mit einer Liste aller zugehörigen Daten verknüpft.

Signup and view all the flashcards

Verwaiste Einträge in SQLite

Wenn ein Datensatz in einer SQLite-Datenbank gelöscht wird, bleibt der zugehörige Speicherplatz im Dateisystem oft erhalten. Dieser Speicherplatz kann dann für andere Datensätze wiederverwendet werden, aber die ursprünglichen Daten können noch vorhanden sein.

Die Wiederherstellung dieser gelöschten Datensätze, die als "verwaiste Einträge" bezeichnet werden, ist ein wichtiger Bestandteil der forensischen Datenanalyse.

Signup and view all the flashcards

Serial Type Array in SQLite

Ein Serial Type Array in SQLite definiert den Datentyp jedes Feldes in einem Datensatz. Wenn die Länge des Serial Type Arrays 0x00 ist, bedeutet dies, dass keine Informationen über die Datentypen der Felder vorhanden sind. Dies ist ein Hinweis darauf, dass der Datensatz möglicherweise verwaist ist.

Signup and view all the flashcards

Serial Type Array Länge 0x00

Wenn die Länge des Serial Type Arrays 0x00 ist, bedeutet dies, dass keine Informationen über die Datentypen der Felder vorhanden sind. Dies kann ein Hinweis darauf sein, dass der Datensatz möglicherweise verwaist ist.

Signup and view all the flashcards

ROWID & Payload-Größe bei verwaisten Einträgen

Selbst ohne ein gültiges Serial Type Array können verwaiste Einträge in SQLite Informationen wie die Länge des Datensatzes (Payload) und die ROWID enthalten.

Signup and view all the flashcards

Anfangsadresse eines verwaisten Eintrags

Die Position im Dateisystem, an der ein verwaister Eintrag beginnt, kann durch die Anfangsadresse des Speicherbereichs bestimmt werden.

Signup and view all the flashcards

ROWID in verwaisten Einträgen

Ein verwaister Eintrag enthält eine ROWID, die die Position des Eintrags in der Tabelle angibt. Die ROWID ist ein nummerischer Wert, der sich als VARINT in der Datenbank befindet.

Signup and view all the flashcards

Länge des Payloads in verwaisten Einträgen

Ein Verwaister Eintrag kann noch die Länge des zugehörigen Datensatzes beinhalten. Diese Länge wird als VARINT-Wert innerhalb der Daten gespeichert.

Signup and view all the flashcards

Datenwiederherstellung aus Textfeldern in verwaisten Einträgen

Wenn ein Textfeld Teil eines verwaisten Eintrags ist, können Daten aus diesem Feld, bis auf die 13 Byte der Präfixlänge, mit einer bestimmten Formel wiederhergestellt werden. Die Formel: (Gesamtlänge des Feldes - 13) / 2 = Anzahl der Byte des Textfeldes im verwaisten Eintrag.

Signup and view all the flashcards

Partieller SQLite-Eintrag

Wenn ein Teil eines SQLite-Eintrags überschrieben wird, entsteht ein partieller Eintrag. Dieser Teil wird als Freeblock bezeichnet und ist mit einem Header versehen, der den nächsten Freeblock und die Länge des aktuellen Freeblocks enthält.

Signup and view all the flashcards

Freeblock-Header im SQLite

Im Fall eines partiellen Eintrags wird nur der Beginn des Eintrags mit einem Freeblock-Header überschrieben, der aus einem Pointer zum nächsten Freeblock und der Länge des aktuellen Blocks besteht.

Signup and view all the flashcards

Überschreiben eines SQLite-Eintrags

Die ersten vier Bytes eines gelöschten Eintrags in SQLite werden mit einem Freeblock-Header überschrieben. Dies führt zu einem partiellen Eintrag, weil der Rest des Eintrags potentiell noch Daten enthält.

Signup and view all the flashcards

VARINTs in SQLite-Einträgen

VARINTs sind variable Längen-Integer, die am Anfang eines SQLite-Eintrags stehen. Sie können unterschiedliche Teile eines Eintrags beeinflussen, wenn dieser überschrieben wird.

Signup and view all the flashcards

Möglichkeiten des Überschreibens von SQLite-Einträgen

Beim Analysieren von partiellen SQLite-Einträgen müssen die verschiedenen Möglichkeiten berücksichtigt werden, wie Teile überschrieben worden sein können: Nur die Länge des Payloads, die Länge des Payloads und die ROWID oder die Länge des Payloads, die ROWID und weitere Header-Daten.

Signup and view all the flashcards

Wiederherstellung von partiellen SQLite-Einträgen

Die Wiederherstellung von partiellen SQLite-Einträgen hängt von der Struktur der Tabelle und der Anzahl der vorhandenen Einträge ab.

Signup and view all the flashcards

Aufbau eines SQLite-Eintrags

Ein SQLite-Eintrag besteht aus mehreren Elementen: Payload Länge, ROWID, Gesamtlänge des Eintrags und serialisierten Datentypen.

Signup and view all the flashcards

Payload Länge, ROWID, Gesamtlänge und Datentypen in SQLite-Einträgen

Ein SQLite-Eintrag enthält neben anderen Informationen die Länge des Payloads, die ROWID, die Gesamtlänge und die Datentypen der serialisierten Daten.

Signup and view all the flashcards

Study Notes

SQLite Einführung

  • SQLite ist eine Datenbank, die von Richard Hipp entwickelt wurde.
  • Es handelt sich um eine Client-Server-lose Datenbank.
  • Die Datenbankdaten werden als Datei auf dem Client gespeichert.

Datenbankrelevanz

  • Mobiles Betriebssystem (Android und iOS)
  • Desktop Betriebssystem (Mac und Windows)
  • Browser (Chrome, Firefox, Safari)

SQLite Dateiformat

  • Eine Datenbank ist eine Sammlung von Tabellen (Tables).
  • Jede Tabelle hat ein definiertes Format (Schema).
  • Tabellen können über eindeutige Schlüssel (Keys) miteinander verknüpft sein (Relational).
  • Die Datenbank ist idealerweise normalisiert, um Duplikate zu minimieren und Effizienz und Integrität zu maximieren.
  • Tabellen und Indizes werden gesammelt.
  • Die Nutzung von Binärbäumen (Binary Trees) – B-Trees – ist üblich
  • Eine SQLite-Datenbank besteht aus einer Anzahl von (meist) gleich großen Einheiten von Daten – Pages.
  • Eine Page hat eine Größe von 512 Bytes.
  • Die kleinstmögliche Datenbank hat 512 Bytes.
  • Die größte Datenbank ist bis 140 TB.
  • Es gibt verschiedene Page Typen: B-Tree, Overflow, Freelist, Pointer Map und Lock-Byte Pages.

B-Tree Pages

  • B-Tree Pages sind die häufigste Art von Pages.
  • Es gibt zwei Arten von B-Tree-Tabellen: Table-B-Tree und Index-B-Tree
  • Jede Art hat zwei Unterarten: Interior Pages und Leaf Pages.
  • Die aktiven/vorhandenen Inhalte der Datenbank werden in Leaf Pages abgelegt.
  • Nicht-allokierte Bereiche befinden sich ebenfalls auf den Pages.

Erste Page

  • Die Datenbank beginnt auf der ersten Page.
  • Die ersten 100 Bytes bilden den Database Header.
  • Nach dem Header befindet sich die Table B-Tree des sqlite_master-Tables.
  • Der sqlite_master Table enthält Informationen zu jeder Tabelle und jedem Index in der Datenbank.

Database Header

  • Die ersten 100 Bytes des Headers enthalten 23 Einträge.
  • Wichtige strukturelle Daten der Datenbank werden beinhaltet.
  • Integer-Werte werden in SQLite im Big-Endian-Format gespeichert.

B-Trees

  • Eine Datenbank besteht aus Tabellen und Indizes.
  • Jeder benötigt jeweils eine oder mehrere Seiten (Pages).
  • Eine Seite gehört nicht zu verschiedenen Tabellen oder Indizes.
  • Seiten werden mit einem B-Baum zusammengefügt.

Tabelle: sqlite_master

  • Jede Datenbank hat eine sqlite_master-Tabelle.
  • Die Tabelle beginnt auf der ersten Seite nach dem Header und enthält Daten zu jeder Tabelle in der Datenbank.
  • Die Tabelle enthält Informationen wie Typ, Name, Bezugsname, Root Page (Anfang), SQL-Statement der Erstellung der Tabelle.

B-Tree-Interior und Leaf Pages

  • Die Struktur eines B-Baumes wird mit Hilfe von Interior und Leaf Pages realisiert.
  • Es gibt immer nur eine Root Page am Anfang der Table.

Interior Pages

  • Beinhalten Verweise (Pointers) auf weitere Pages.
  • Zeigen auf weitere Interior oder Leaf Pages.

Leaf Pages

  • Behalten die eigentlichen Daten, die in der Datenbank abgelegt sind.
  • Es gibt Ausnahmen von WITHOUT_ROWID-Tabellen.

Größere Tabellen

  • Größere Tabellen haben eine komplexere Struktur aus Interior und Leaf Pages.
  • Wenn die Datenbankdaten geändert werden, können Seiten (Pages) hinzugefügt oder gelöscht werden.
  • Einträge auf den Seiten können auch intern kopiert werden.

Aufbau von Interior und Leaf Pages

  • Page Header
  • Cell Pointer Array
  • Zellen (Cells Header + Zellinhalt (Payload))
  • Freie Blöcke (Free Blocks)
  • Flag (1 Byte): 0x02 -> Interior Index, 0x05 -> Tabelle des Interior, 0x0A -> Leaf Index, 0x0D -> Tabellende
  • Erster freier Block (2 Bytes)
  • Anzahl der allokierten Zellen (2 Bytes)
  • Offset zum ersten Eintrag (2 Bytes)
  • Anzahl der Fragmente in Bytes (1 Byte)
  • Verweis ganz rechts (4 Bytes, nur Interior)

Beispiel eines Headers

  • a = (0D)16 → Blatttabelle
  • b = (0000)16 = (0)10 → keine freien Blöcke
  • c = (0001)16 = (1)10 → eine belegte Zelle
  • d = (0FAC) 16 = (4012)10 → Eintrag an Offset 4012
  • e = (00)16 = (0)10 → 0 Byte Fragment

Varints

  • Integer werden mit variabler Länge gespeichert (1 bis 9 Bytes).
  • Das Zweierkomplement-Format wird verwendet, um kleine positive Zahlen effizient darzustellen.
  • Es wird für Bytelängen, ROWIDs und verschiedene Eintragstypen verwendet.
  • Dies gibt es auch für negative Werte, aber das ist ineffizienter.

Steuerungszeichen

  • Steuerungszeichen durch das höchstwertigste Bit
  • 1 bedeutet, dass das Bit auf weitere Bytes folgt
  • 0 bedeutet das letzte Byte

Positiver Varint

  • Beispiel für die Darstellung positiver Zahlen in Varint-Format.

Cell Pointer Array

  • Nach dem Header folgt der Cell Pointer Array.
  • Beinhaltet einen 2 Byte-Pointer für jede genutzte Zelle.
  • Zeigt auf Tabellenoffset auf der Seite.
  • Die Anzahl der allokierten Zellen steht im Header dieser Seite.

Struktur eines Eintrags

  • Die Einträge im Cell Pointer Array zeigen auf Einträge innerhalb der Seite.
  • Das Layout der Einträge hängt von der Art der Seite (Interior oder Leaf) ab.
  • Interior Table, Leaf Table, Interior Index, Leaf Index.

Aufbau der Interior und Leaf Table Records

  • Interior Record: Zeigt auf Kindsknoten (Varint), Integer-Schlüssel/ROWID (Varint).
  • Leaf Record: Länge des Payloads (Varint, inkl. Overflow), Integer-Schlüssel/ROWID (Varint), Payload (variable Länge), Pointer auf Overflow-Seite (4 Bytes, nur bei Bedarf).

Leaf Table Record

  • Payload Length
  • ROWID
  • Record Length
  • Null
  • txt12
  • … -Payload
  • Overflow Page

Leaf Table Aufbau

  • Länge des Payloads (Varint, inkl. Overflow)
  • Integer Key / ROWID (Varint)
  • Payload (variable Länge)
  • Pointer auf Overflow-Seite(4 Bytes, nur wenn nötig)
  • Payload besteht aus Kopf (Payload Header) und Inhalt (Payload Body)

Attributtypen

  • Übersicht über verschiedene Attributtypen, Größe (Bytes) und Beschreibung.

Leaf- und Interior-Tabelle

  • Leaf Tabelle: Data Layout: Payload Length, ROWID, Record Len, Serial type, Daten
  • Interior Tabelle enthält Referenzen zu anderen Pages/Kindsknoten, Key, und Position auf der linken Seite

Record Recovery

  • Die Wiederherstellung von Daten in SQLite-Datenbanken hängt davon ab, wie viel von einem Eintrag erhalten ist.
  • Möglichkeiten:
    • Intakte Struktur
      • Leaf Page (Flag 0x0D)
      • Verwaiste Page (z. B. durch Reorganisation)
      • Cell Pointer Array intakt
    • Verwaiste Einträge
      • Vollständiger Record, aber ohne Eintrag im Cell Pointer Array
    • Partielle Einträge
      • Eintrag beginnt mit Freeblock-Header überschrieben -Es kann sein, dass der wiederhergestellte Eintrag auch „live” in der Datenbank weiter existiert.
  • Um einen Eintrag zu finden, können folgende Schritte verfolgt werden:
    • Suche nach dem ersten Eintrag im Cell Pointer Record
    • Analysiere den Record und den dazugehörigen Payload
    • Vergleiche den Eintrag mit den vorhandenen Tabellen

Verwaiste Einträge

  • Kein Eintrag findet sich im Cell Pointer Record.
  • Finde den Record und die zugehörige Tabelle.
  • Alle nicht allokierten Bytes werden analysiert.
  • Für jedes potenzielle Startbyte wird geprüft, ob ein korrekter Record zu einer Tabelle passt.

Serial Type Array nicht korrekt

  • Beispiel, wo ein String mit 49 Bytes ein ROWID von 26 Bytes, und einige Integer mit 8 Byte.
  • Die Serial Type Arraygröße passt nicht zu den vorhandenen Byte.

Verwaiste Einträge – Länge des Serial Type Arrays zu groß

  • Der Anfang von dem nicht allokierten Byte
  • Länge des Payloads möglich (pos. VARINT).
  • ROWID möglich (pos. VARINT).
  • Die Anzahl der Bytes des Serial Type Arrays sollte größer als 0 sein.
  • Der Eintrag könnte richtig sein (z.B. wenn text, int, int, int in einer Tabelle definiert sind).
  • Die angegebene Größe des Payloads ist möglicherweise größer als nötig

Verwaiste Einträge – (Fast) Korrekter Eintrag

  • Ein Eintrag kann erfolgreich wiederhergestellt werden.
  • Der Wert muss nicht NULL sein.

Partielle Einträge

  • Überschriebene Teile eines Records können Probleme bei der Wiederherstellung verursachen.
  • Nach dem Löschen werden nur die ersten vier Bytes mit einem Freeblock-Header überschrieben.
    • Pointer zum nächsten Freeblock
    • Länge des aktuellen Freeblocks

Partielle Einträge – Aufbau eines Eintrags

Write-Ahead Logs (WALs)

  • Die Datenbank selbst wird in einer einzigen Datei abgelegt.
  • Weitere Dateien (z. B. Journals und Write Ahead Logs) können zur aktiven Datenbank gehören.
  • SQLite ist eine Transaktionsdatenbank.
  • Änderungen werden in Gruppen zusammengefasst.
  • Die kleinste Änderung betrifft immer mindestens eine Seite.
  • Ein Commit kann auch hunderte Pages betreffen.
  • Herausforderungen für ein System: Absturz der Software, Absturz des Betriebssystems, Stromausfall.

Ansatz

  • Kopieren der betroffenen Seiten in das Rollback-Journal vor Ausführung einer Transaktion.
  • Modi für Journal_Mode, welche die Art der Journal-Ungültigerklärung bestimmen. (DELETE, TRUNCATE, PERSIST)

Sequenz einer Transaktion

  • Neue oder veränderte Seiten werden geschrieben.
  • Der Journal Header wird geschrieben.
  • Seiten ohne Änderungen werden kopiert.
  • Neue Seiten werden in die Datenbank geschrieben.
  • Wenn diese Schritte erfolgreich durchgeführt wurden, markiert der Journal das als ungültig.
  • Bei Fehlern wird die gesicherte Seite in die Datenbank kopiert.

Write-Ahead Logs (WALs)

  • Write-Ahead Logs (WAL) sind eine Methode, um Änderungen in Form eines Caches zu speichern.
  • WALs sind im Vergleich zu Rollback-Journals im Allgemeinen schneller.
  • Mehrere Transaktionen können in das WAL eingetragen werden.
  • Transaktionen werden im WAL ausgeführt.
  • Die Datenbank wird nur in sog. Checkpoints beschrieben.
  • Checkpoints können durch Nutzer ausgelöst oder nach mindestens 1000 Seiten oder nach dem Beenden der Software erfolgen.
  • WAL-Dateien – Dateiendung: -wal (z.B. test.db → testdb-wal)
  • Es gibt einen Commit-Frame zum Schluss der Transaction.

###Praktischer Einsatz von WALs

  • Start der Transaktion.
  • Modifizierte Pages werden in das WAL (without DB impact) geschrieben.
  • Weitere Pages werden in das WAL geschrieben.
  • Commit der Transaktion → Commit-Frame.
  • Checkpoint (> 1000 Pages or by command) Die aktuellsten Pages werden in die Datenbank geschrieben.
  • Neue Transaktionen werden am Anfang des WAL (Header aktualisiert, aber der Rest wird nicht gelöscht) geschrieben.
  • Schließen der Software → Checkpoint und Löschen der WAL-Datei.

Studying That Suits You

Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

Quiz Team

Related Documents

Kapitel 07 - SQLite PDF

Description

Teste dein Wissen über die grundlegenden Datenstrukturen und Funktionen in SQLite-Datenbanken. Der Quiz umfasst Fragen zu Page-Typen, Freelist Pages und der Architektur von SQLite. Ideal für Studierende und Fachleute, die ihre Kenntnisse über SQLite vertiefen möchten.

More Like This

Use Quizgecko on...
Browser
Browser