O MySQL usa um truque que faz parte dos sistemas POSIX desde sempre. Ele abre o arquivo temporário e o desvincula imediatamente. Portanto, não é visível em nenhuma lista de diretórios. Mas sistemas POSIX como UNIX e Linux não devem realmente remover um arquivo desvinculado enquanto um processo tem um identificador de arquivo aberto para ele. Assim, quando a consulta usando a tabela temporária terminar, ela fechará o identificador de arquivo e, em seguida, o sistema operacional removerá automaticamente o arquivo e liberará o armazenamento que estava usando.
Isso geralmente é melhor do que exigir que o código do servidor lembre-se de remover o arquivo temporário quando terminar com ele. Ele também explica como o término do encadeamento ou o travamento do mysqld. Pelo menos não deixará arquivos temporários obsoletos no seu sistema de arquivos.
Você pode ver o tamanho dos arquivos desvinculados com
lsof -s
. Vou deixar para você procurar exemplos de como usar esse comando (o Google é seu amigo aqui). É pouco possível que um arquivo temporário use seus 167 GB de espaço livre.
Ou pode ser que o arquivo temporário use apenas 8 GB, mas você pode ter 20 threads fazendo a mesma consulta ao mesmo tempo. Já vi isso acontecer uma vez.
Mas provavelmente é mais provável que você tenha um valor de
tmp_table_size
que está restringindo o tamanho da tabela temporária. Se você atingir o limite, você pode aumentar essa opção de configuração, seja como uma variável de sessão quando precisar, ou globalmente no
my.cnf
. Mas eu tentaria primeiro otimizar a consulta. Por que ele precisa criar tabelas temporárias tão grandes? Poderia ser otimizado para examinar menos linhas ou talvez evitar a criação de uma tabela temporária?