Executando lsof +L1
COMANDO PID USUÁRIO TIPO FD TAMANHO DO DISPOSITIVO/DESLIGADO NOME DO NÓ NLINK
mysqld 886068 mysql 521u REG 254,1 194824503296 0 29360306 /tmp/#29360306 (excluído)
Executando o mysql 3.0.34 em um cluster innodb. Aparentemente aleatoriamente, o disco é consumido com todos os 300 GB dele em uma pasta tmp, quando fica cheio, ele é liberado.
Procurando sugestões/como limitar o tamanho da tabela tmp?
SET @sys.statement_truncate_len = 1000; selecione * em sys. statements_with_temp_tables
;
Rende 1 item sinalizado como disk_tmp_tables.
consulta db exec_count total_latency memory_tmp_tables disk_tmp_tables avg_tmp_tables_per_query tmp_tables_to_disk_pct first_seen last_seen resumo SELECT TABLE_NAME FROM information_schema
. INNODB_BUFFER_PAGE
ONDE TABLE_NAME GOSTA? LIMITE?, ... 1.439,42 ms 1 1 1.100 2024-02-09 10:14:54.800889 2024-02-09 10:14:54.800889 d24fb8e96673a518f0f536b9516781644ffb7a5079f9 5490cec24804437f34a9
Não há uma boa maneira de limitar o tamanho da tabela temporária no disco no MySQL.
As tabelas temporárias são criadas automaticamente por determinadas consultas. Consulte https://dev.mysql.com/doc/refman/8.0/en/internal-temporary-tables.html para obter uma lista de tais casos.
Não há limite prático para o tamanho de uma tabela temporária, porque qualquer consulta pode gerar um produto cartesiano enorme ou qualquer outra operação que precise de muito espaço temporário. Depende dos conjuntos de dados que você está processando e do tipo de consulta.
Também é comum que múltiplas sessões realizem tais operações simultaneamente. Cada um deles obtém seu próprio espaço de tabela temporário e cada um desses espaços de tabela pode crescer.
Já vi casos como o seu, em que o espaço aumenta repentinamente em centenas de gigabytes, esgotando todo o espaço restante em disco.
O MySQL 8.0 usa um conjunto de tablespaces temporários. À medida que o otimizador cria tabelas temporárias armazenadas no disco, ele usa esses espaços de tabela e eles são expandidos conforme necessário para armazenar as tabelas temporárias de uma determinada sessão. Esses espaços de tabela são truncados quando uma sessão é desconectada, mas caso contrário, eles poderão continuar se expandindo. Leia https://dev.mysql.com/doc/refman/8.0/en/innodb-temporary-tablespace.html para obter detalhes.
A melhor maneira que conheço de mitigar o tamanho da tabela temporária é identificar consultas que usam tabelas temporárias e tentar otimizá-las para que não criem tabelas temporárias.
Outro método é reduzir o tamanho dos seus conjuntos de dados para que as tabelas temporárias sejam menores. Isso pode ser feito otimizando a consulta com índices, de modo que ela examine menos dados e, portanto, a quantidade de dados que precisa entrar em uma tabela temporária seja reduzida.
Ou, em última análise, arquive os dados e remova-os do seu banco de dados.
Outra coisa que você pode tentar é configurar o MySQL Server para que a
innodb_temp_tablespaces_dir
opção crie espaços de tabela temporários em um volume de disco dedicado com espaço limitado. Mas isso fará com que as consultas falhem de maneira espetacular se não conseguirem criar uma grande tabela temporária necessária.