2010-05-25 10 views
5

Sto utilizzando un database SQLite per memorizzare i valori da un data logger. Il data logger riempirà infine tutto lo spazio disponibile sul disco rigido del computer. Sto cercando un modo per rimuovere l'ultimo 25% dei log dal database una volta raggiunto un certo limite.SQLite elimina l'ultimo 25% dei record in un database

utilizzando il seguente codice:

$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)); 

Un file journal viene creato accanto al database che riempie lo spazio rimanente sul disco fino a quando lo script non riesce.

Come/Posso impedire la creazione di questo file journal? In ogni caso per combinare tutte e tre le query SQL in una sola istruzione?

risposta

2

Se il diario è l'unica causa del problema, è possibile provare a fare in modo che SQLite faccia l'inserimento nel diario o semplicemente spegnerlo.

Da the docs:

PRAGMA journal_mode;
PRAGMA database.journal_mode;
PRAGMA journal_mode = DELETE | TRONCA | PERSISTA | MEMORIA | OFF
PRAGMA database.journal_mode = DELETE | TRONCA | PERSISTA | MEMORIA | OFF

Questo pragma interroga o imposta la modalità journal per i database associati alla connessione al database corrente.

Le prime due forme di questo pragma interrogano la modalità di journaling corrente. Nel primo modulo, viene restituito il journal_mode predefinito. La modalità di journaling predefinita è la modalità utilizzata dai database aggiunti alla connessione dalle successive istruzioni ATTACH. Il secondo modulo restituisce la modalità di inserimento nel journal corrente per un database specifico.

Le ultime due forme cambiano la modalità di inserimento nel journal. Il 4 ° modulo modifica la modalità di inserimento nel journal per una specifica connessione al database. Utilizzare "main" per il database principale (il database aperto dalla chiamata all'interfaccia sqlite3_open(), sqlite3_open16() o sqlite3_open_v2() originale) e utilizzare "temp" per il database che contiene le tabelle TEMP. Il terzo modulo modifica la modalità di journaling su tutti i database e cambia la modalità di journaling predefinita che verrà utilizzata per i nuovi database aggiunti dai successivi comandi ATTACH. Viene restituita la nuova modalità journal. Se non è possibile modificare la modalità journal, viene restituita la modalità journal originale.

La modalità di registrazione su DELETE è normale. Nella modalità DELETE, il journal di rollback viene eliminato alla conclusione di ogni transazione. In effetti, l'operazione di cancellazione è l'azione che causa il commit della transazione. (Per ulteriori dettagli, vedere il documento Atomic Commit in SQLite intitolato)

La modalità di registrazione TRUNCATE commette le transazioni troncando il journal di rollback a lunghezza zero invece di eliminarlo. Su molti sistemi, il troncamento di un file è molto più rapido dell'eliminazione del file poiché la directory contenente non deve essere modificata.

La modalità di journaling PERSIST impedisce l'eliminazione del journal di rollback alla fine di ogni transazione. Invece, l'intestazione del journal viene sovrascritta con zero. Ciò impedirà ad altre connessioni del database di far tornare indietro il journal.La modalità di journaling PERSIST è utile come ottimizzazione sulle piattaforme in cui l'eliminazione o il troncamento di un file è molto più costoso rispetto alla sovrascrittura del primo blocco di un file con zeri.

La modalità di registrazione su MEMORY memorizza il giornale di rollback in RAM volatile. Ciò consente di risparmiare I/O su disco ma a scapito della sicurezza e dell'integrità del database. Se l'applicazione che utilizza SQLite si arresta in modo anomalo nel mezzo di una transazione quando è impostata la modalità di registrazione su MEMORY, il file di database sarà probabilmente corrotto.

La modalità di journaling OFF disabilita completamente il journal di rollback. Nessun giornale di rollback viene mai creato e quindi non esiste mai un giornale di rollback da eliminare. La modalità di journaling OFF disabilita le funzionalità di commit e rollback di SQLite. Il comando ROLLBACK non funziona più; si comporta in modo indefinito. Le applicazioni devono evitare di utilizzare il comando ROLLBACK quando la modalità journal è OFF. Se l'applicazione si blocca nel mezzo di una transazione quando è impostata la modalità di registrazione su OFF, il file di database sarà probabilmente corrotto.

Si noti che il journal_mode per un database in memoria è MEMORY o OFF e non può essere modificato in un valore diverso. Un tentativo di cambiare il journal_mode di un database in memoria su qualsiasi impostazione diversa da MEMORY o OFF viene ignorato. Si noti inoltre che journal_mode non può essere modificato mentre una transazione è attiva.

Problemi correlati