MySQL používá trik, který je součástí systémů POSIX navždy. Otevře dočasný soubor a okamžitě jej odpojí. Proto není viditelný v žádném výpisu adresáře. Ale systémy POSIX jako UNIX a Linux by ve skutečnosti neměly odstraňovat nepropojený soubor, pokud má proces otevřený popisovač souboru. Jakmile tedy dotaz pomocí dočasné tabulky skončí, zavře popisovač souboru a operační systém pak soubor automaticky odstraní a uvolní úložiště, které používal.
To je obecně lepší než vyžadovat, aby kód serveru nezapomněl odstranit dočasný soubor, když je s ním hotový. To také odpovídá za ukončení vlákna nebo selhání mysqld. Alespoň to nezanechá zastaralé dočasné soubory zasypané vaším souborovým systémem.
Velikost nepropojených souborů můžete zobrazit pomocí lsof -s
. Vyhledání příkladů použití tohoto příkazu nechám na vás (zde je vaším přítelem Google).
Je velmi málo možné, že dočasný soubor zabere vašich 167 GB volného místa.
Nebo se může stát, že dočasný soubor používá pouze 8 GB, ale můžete mít 20 vláken, které provádějí stejný dotaz ve stejnou dobu. Jednou jsem to viděl.
Ale pravděpodobnější je, že máte hodnotu tmp_table_size
to omezuje velikost dočasné tabulky.
Pokud dosáhnete limitu, můžete tuto možnost konfigurace zvýšit, buď jako proměnnou relace, když ji potřebujete, nebo globálně v my.cnf
.
Ale nejdřív bych zkusil optimalizovat dotaz. Proč potřebuje vytvářet tak velké dočasné tabulky? Dalo by se to optimalizovat tak, aby prozkoumalo méně řádků, nebo se snad úplně vyhnout vytváření dočasné tabulky?