2014-04-23 18 views
9

Sto cercando di eseguire il comando VACUUM sul mio database, ma mi sembra di esaurire lo spazio:SQLITE3 VUOTO "database o disco è pieno"

> sqlite3 mydatabase.db "VACUUM" 
Error: database or disk is full 

Il database è di circa 36 GB e la guido che sto correndo su assomiglia (via df -h):

/dev/sda2  406G 171G 215G 45% /home 

, quindi sono chiaramente al di sopra della doppia dimensione limitata necessario. Cosa posso fare per consentire l'esecuzione del comando di vuoto?

risposta

11

Per consentire l'esecuzione del comando VACUUM, modificare la directory per i file temporanei con una che disponga di spazio sufficiente.

SQLite di documentation dice il directory temporanea è (in ordine):

  1. ciò che è impostato con il comando PRAGMA temp_store_directory; oppure
  2. qualsiasi cosa sia impostata con la variabile di ambiente SQLITE_TMPDIR; oppure
  3. qualsiasi cosa sia impostata con la variabile di ambiente TMPDIR; oppure
  4. /var/tmp; oppure
  5. /usr/tmp; oppure
  6. /tmp; o
  7. ., la directory di lavoro corrente
+2

Grazie, ci proverò domani. Il collegamento PRAGMA menziona che questo è un comando deprezzato ma non fornisce l'alternativa. La variabile di ambiente è la via raccomandata? – Hooked

+0

Sì, ma tutto eccetto 'PRAGMA temp_store_directory' dipende dal sistema operativo. –

+0

Si noti che 'SQLITE_TMPDIR' è stato introdotto solo in SQLite v3.8.1 ... Vedere https://www.sqlite.org/releaselog/3_8_1.html – mBardos

2

Il OP osservato che durante un vuoto, SQLite crea un file temporaneo che è circa la stessa dimensione del database originale. Lo fa per mantenere le proprietà ACID del database. SQLite utilizza una directory per contenere i file temporanei di cui ha bisogno mentre esegue il VACUUM. Per determinare quale directory usare, scende una gerarchia alla ricerca della prima directory che abbia le autorizzazioni di accesso appropriate. Se trova una directory alla quale non ha accesso, ignorerà quella directory e continuerà a discuterne la gerarchia alla ricerca di quella che fa. Ne parlo nel caso qualcuno abbia specificato una variabile d'ambiente e SQLite sembra ignorarlo.

Nella sua risposta CL dà la gerarchia per Linux e nel suo commento afferma che la gerarchia è OS-dipendente. Per completezza, ecco le gerarchie (nella misura in cui posso determinarle dal codice).

Per Unix (e Linux) la gerarchia è:

  1. Qualunque sia specificato dalla variabile ambiente SQLITE_TMPDIR,
  2. Qualunque sia specificata dalla variabile di ambiente TMPDIR,
  3. /var/tmp,
  4. /usr/tmp,
  5. /tmp e, infine,
  6. L'attuale directory di lavoro.

Per Cygwin la gerarchia è:

  1. Qualunque sia specificato dalla variabile ambiente SQLITE_TMPDIR,
  2. Qualunque sia specificato dalla variabile d'ambiente TMPDIR,
  3. tutto ciò che è specificata dalla variabile di ambiente TMP,
  4. Qualunque sia specificato dalla variabile ambiente TEMP,
  5. Qualunque sia specificato dalla variabile ambiente USERPROFILE,
  6. /var/tmp,
  7. /usr/tmp,
  8. /tmp, e infine
  9. L'attuale directory di lavoro.

Per di Windows la gerarchia è:

  • GetTempPath(), che è documentata per tornare:

    1. Qualunque sia specificata dalla variabile di ambiente TMP,
    2. Qualunque cosa è specificata dalla TEMP variabile d'ambiente,
    3. Qualunque sia specificata dalla variabile di ambiente USERPROFILE , e, infine,
    4. la directory di Windows .

Spero che questo aiuti.

Problemi correlati