MySQL utilizza un trucco che fa parte da sempre dei sistemi POSIX. Apre il file temporaneo e lo scollega immediatamente. Pertanto non è visualizzabile in nessun elenco di directory. Ma i sistemi POSIX come UNIX e Linux non dovrebbero effettivamente rimuovere un file non collegato mentre un processo ha un handle di file aperto. Quindi, una volta terminata la query che utilizza la tabella temporanea, chiuderà l'handle del file, quindi il sistema operativo rimuoverà automaticamente il file e libererà lo spazio di archiviazione che stava utilizzando.
Questo è generalmente meglio che richiedere al codice del server di ricordarsi di rimuovere il file temporaneo una volta terminato. Tiene conto anche della chiusura del thread o dell'arresto anomalo di mysqld. Almeno non lascerà file temporanei non aggiornati che riempiono il tuo filesystem.
Puoi visualizzare la dimensione dei file non collegati con lsof -s
. Lascio a te cercare esempi su come utilizzare quel comando (qui Google è tuo amico).
È possibile che un file temporaneo utilizzi i tuoi 167 GB di spazio libero.
Oppure potrebbe essere che il file temporaneo utilizzi solo 8 GB, ma potresti avere 20 thread che eseguono la stessa query contemporaneamente. L'ho visto succedere una volta.
Ma probabilmente è più probabile che tu abbia un valore di tmp_table_size
che sta vincolando la dimensione della tabella temporanea.
Se raggiungi il limite, puoi aumentare l'opzione di configurazione, sia come variabile di sessione quando ne hai bisogno, sia globalmente in my.cnf
.
Ma prima proverei a ottimizzare la query. Perché è necessario creare tabelle temporanee così grandi? Potrebbe essere ottimizzato per esaminare meno righe o forse evitare di creare del tutto una tabella temporanea?