MySQL wykorzystuje sztuczkę, która od zawsze była częścią systemów POSIX. Otwiera plik tymczasowy i natychmiast go odłącza. Dlatego nie można go wyświetlić w żadnej liście katalogów. Ale systemy POSIX, takie jak UNIX i Linux, nie powinny w rzeczywistości usuwać niepołączonego pliku, gdy proces ma do niego otwarte dojście do pliku. Tak więc po zakończeniu zapytania korzystającego z tabeli tymczasowej zamknie on uchwyt pliku, a następnie system operacyjny automatycznie usunie plik i zwolni pamięć, z której korzystał.
Jest to generalnie lepsze niż wymaganie, aby kod serwera pamiętał o usunięciu pliku tymczasowego, gdy jest z nim skończony. Odpowiada również za zakończenie wątku lub awarię mysqld. Przynajmniej nie pozostawi starych plików tymczasowych zaśmiecających twój system plików.
Możesz zobaczyć rozmiar niepowiązanych plików za pomocą lsof -s
. Pozostawię tobie sprawdzenie przykładów użycia tego polecenia (Google jest twoim przyjacielem tutaj).
Jest mało prawdopodobne, że plik tymczasowy zajmie 167 GB wolnego miejsca.
Może się też zdarzyć, że plik tymczasowy używa tylko 8 GB, ale możesz mieć 20 wątków wykonujących to samo zapytanie w tym samym czasie. Widziałem to raz.
Ale jest bardziej prawdopodobne, że masz wartość tmp_table_size
to ogranicza rozmiar tabeli tymczasowej.
Jeśli osiągniesz limit, możesz podnieść tę opcję konfiguracji, albo jako zmienną sesji, gdy tego potrzebujesz, albo globalnie w my.cnf
.
Ale najpierw spróbowałbym zoptymalizować zapytanie. Dlaczego musi tworzyć tak duże tabele tymczasowe? Czy można go zoptymalizować w celu zbadania mniejszej liczby wierszy, czy może całkowicie uniknąć tworzenia tabeli tymczasowej?