2010-05-25 2 views
5

Ich verwende eine SQLite-Datenbank, um Werte aus einem Datenlogger zu speichern. Der Datenlogger füllt schließlich den gesamten verfügbaren Speicherplatz auf dem Computer. Ich suche nach einer Möglichkeit, die letzten 25% der Logs aus der Datenbank zu entfernen, sobald sie ein bestimmtes Limit erreicht haben.SQLite löschen die letzten 25% der Datensätze in einer Datenbank

Verwendung des folgenden Codes:

$ret = Query('SELECT id as last FROM data ORDER BY id desc LIMIT 1 ;'); 
$last_id = $ret[0]['last'] ; 
$ret = Query('SELECT count(*) as total FROM data'); 
$start_id = $last_id - $ret[0]['total'] * 0.75 ; 
Query('DELETE FROM data WHERE id < '. round($start_id, 0)); 

Eine Journaldatei wird neben der Datenbank erstellt, die den verbleibenden Speicherplatz auf dem Laufwerk füllt, bis das Skript fehlschlägt.

Wie kann ich verhindern, dass diese Journaldatei erstellt wird? Wie auch immer, um alle drei SQL-Abfragen in einer Anweisung zu kombinieren?

Antwort

2

Wenn das Journal die alleinige Ursache für das Problem ist, können Sie versuchen, dass SQLite die Journalfunktion im Speicher ausführt oder es einfach ausschaltet.

Von the docs:

PRAGMA journal_mode;
PRAGMA database.journal_mode;
PRAGMA journal_mode = DELETE | VERRINGERN | PERSIST | MEMORY | AUS
PRAGMA database.journal_mode = DELETE | VERRINGERN | PERSIST | MEMORY | AUS

Dieses Pragma fragt den Journalmodus für Datenbanken ab, die der aktuellen Datenbankverbindung zugeordnet sind, oder legt diesen fest.

Die ersten beiden Formen dieses Pragmas fragen den aktuellen Journalmodus ab. In der ersten Form wird der Standard journal_mode zurückgegeben. Der Standard-Journalmodus ist der Modus, der von Datenbanken verwendet wird, die von nachfolgenden ATTACH-Anweisungen zur Verbindung hinzugefügt werden. Das zweite Formular gibt den aktuellen Journalmodus für eine bestimmte Datenbank zurück.

Die letzten beiden Formulare ändern den Journalmodus. Das vierte Formular ändert den Journalmodus für eine bestimmte Datenbankverbindung. Verwenden Sie "main" für die Hauptdatenbank (die Datenbank, die vom ursprünglichen sqlite3_open() -, sqlite3_open16() - oder sqlite3_open_v2() - Schnittstellenaufruf geöffnet wurde) und verwenden Sie "temp" für die Datenbank, die TEMP-Tabellen enthält. Das 3. Formular ändert den Journalmodus für alle Datenbanken und ändert den Standard-Journalmodus, der für neue Datenbanken verwendet wird, die von nachfolgenden ATTACH-Befehlen hinzugefügt werden. Der neue Journalmodus wird zurückgegeben. Wenn der Journalmodus nicht geändert werden konnte, wird der ursprüngliche Journalmodus zurückgegeben.

Der DELETE-Journalmodus ist das normale Verhalten. Im DELETE-Modus wird das Rollback-Journal nach Abschluss jeder Transaktion gelöscht. Tatsächlich ist die Löschoperation die Aktion, die das Festschreiben der Transaktion bewirkt. (Weitere Informationen hierzu finden Sie in der Dokumentation Atomic Commit In SQLite.)

Der TRUNCATE-Journalmodus schreibt Transaktionen fest, indem das Rollback-Journal auf Nulllänge verkürzt wird, anstatt es zu löschen. Auf vielen Systemen ist das Abschneiden einer Datei viel schneller als das Löschen der Datei, da das enthaltende Verzeichnis nicht geändert werden muss.

Der PERSIST-Journalmodus verhindert, dass das Rollback-Journal am Ende jeder Transaktion gelöscht wird. Stattdessen wird der Kopf des Journals mit Nullen überschrieben. Dadurch wird verhindert, dass andere Datenbankverbindungen das Journal zurückrollen.Der PERSIST-Journalmodus ist als eine Optimierung auf Plattformen nützlich, bei denen das Löschen oder Abschneiden einer Datei viel teurer ist als das Überschreiben des ersten Blocks einer Datei mit Nullen.

Im Speichermodus MEMORY wird das Rollback-Journal im flüchtigen RAM gespeichert. Dies spart Festplatten-E/A, aber auf Kosten der Datenbanksicherheit und -integrität. Wenn die Anwendung, die SQLite verwendet, mitten in einer Transaktion abstürzt, wenn der Journalmodus MEMORY festgelegt ist, wird die Datenbankdatei sehr wahrscheinlich beschädigt.

Der OFF-Journalmodus deaktiviert das Rollback-Journal vollständig. Es wird niemals ein Rollback-Journal erstellt und daher gibt es nie ein Rollback-Journal, das gelöscht werden muss. Der OFF-Journaling-Modus deaktiviert die atomaren Commit- und Rollback-Funktionen von SQLite. Der ROLLBACK-Befehl funktioniert nicht mehr; es verhält sich auf undefinierte Weise. Anwendungen müssen vermeiden, den Befehl ROLLBACK zu verwenden, wenn der Journalmodus deaktiviert ist. Wenn die Anwendung mitten in einer Transaktion abstürzt, wenn der OFF-Journalmodus eingestellt ist, wird die Datenbankdatei sehr wahrscheinlich beschädigt.

Beachten Sie, dass journal_mode für eine In-Memory-Datenbank entweder MEMORY oder OFF ist und nicht auf einen anderen Wert geändert werden kann. Ein Versuch, den journal_mode einer speicherinternen Datenbank in eine andere Einstellung als MEMORY oder OFF zu ändern, wird ignoriert. Beachten Sie auch, dass journal_mode nicht geändert werden kann, solange eine Transaktion aktiv ist.