Em um servidor Debian Linux, hospedando muitos sites PHP / MySQL (galerias de fotos), às vezes tenho "muitos" arquivos como /tmp/#sql_6405_58.MYD
.
Por exemplo hoje:
[2012-12-15 15:18:11] /tmp/#sql_6405_6.MYD : 88MB
[2012-12-15 15:18:11] /tmp/#sql_6405_3.MYD : 22MB
[2012-12-15 15:18:11] /tmp/#sql_6405_4.MYD : 138MB
[2012-12-15 15:18:11] /tmp/#sql_6405_10.MYD : 88MB
...
[2012-12-15 15:18:11] /tmp/#sql_6405_9.MYD : 15MB
[2012-12-15 15:18:11] /tmp/#sql_6405_65.MYD : 49MB
[2012-12-15 15:18:11] /tmp/#sql_6405_44.MYD : 69MB
(59 arquivos ao mesmo tempo, por mais de 6 GB ... sim, eu monito arquivos grandes em / tmp)
Infelizmente, /tmp
está na mesma partição /
e interrompe temporariamente o servidor web, porque /
está cheio, suponho. Os arquivos desaparecem e o servidor volta ao normal.
Todos os nomes de arquivos seguem o #sql_6405_*.MYD
padrão. Gostaria de entender qual operação do MySQL implica tantos arquivos temporários. Eu tenho aproximadamente 2000 bancos de dados neste servidor. É possível saber qual banco de dados está em causa?
mysql
myisam
temporary-tables
RolandoMySQLDBA
fonte
fonte
filesort
, e 6405 é o PID do mysql para manter os arquivos temporários de diferentes instâncias do servidor separados.Respostas:
Existem algumas opções que podem fazer com que as tabelas temporárias se materializem como tabelas MyISAM ou podem ser configuradas para atrasá-las. Tenha em mente que, para tabelas temporárias com base em disco, não há
.frm
arquivos, mas somente.MYD
e.MYI
arquivos (de curso. Arquivo .MYI nunca é usada, uma vez que é o índice impossível uma tabela temporária interna).Aqui estão as opções:
Você também deve considerar a documentação do MySQL sobre o uso da tabela temporária interna
As situações em que são criadas tabelas temporárias na memória são
Quando uma tabela temporária na memória excede o mínimo de (tmp_table_size ou max_heap_table_size), o mysqld faz o seguinte:
As situações em que as tabelas temporárias na memória são ignoradas em favor do disco são
É necessária alguma diligência para reduzir a criação da tabela temporária no disco
Se após essa devida diligência, ainda houver tabelas temporárias sendo formadas no Disco, aqui está uma jogada desesperada: Mapeando a criação da tabela temporária baseada em disco na memória.
Aqui está uma maneira rápida e suja de configurar um disco de 16 GB de RAM usando tmpdir
PASSO01) Criar pasta de disco RAM
STEP02) Adicione isso ao
my.cnf
PASSO03) Adicione isso ao / etc / fstab
PASSO04) Recarregar / etc / fstab
PASSO05)
service mysql restart
Depois disso, todas as tabelas temporárias que se tornam MyISAM são gravadas no disco RAM. Isso deve acelerar a criação da tabela temporária baseada em disco.
De uma chance !!!
fonte
Essas são consultas que estão sendo transferidas para o disco porque os resultados são muito grandes para memória.
Quando a consulta é concluída, o espaço é limpo.
Não há como corresponder definitivamente esses arquivos temporários às consultas, mas você pode obter dicas para adivinhar em SHOW FULL PROCESSLIST; ou MOSTRAR ESTADO DE INNODB; ou procurando no seu log de erros se as consultas falharem.
fonte
Sempre que usamos instruções alter na tabela, ele cria os arquivos temporários # sql_6405_3.MYD e, uma vez feito, lança a saída e desaparece.
As alterações nas tabelas fazem com que o MySQL copie dados inteiros em arquivos temporários # sql.xxx.MYD e faça alterações nos arquivos temporários criados, depois solte os arquivos de dados originais tablename.MYD e renomeie os arquivos temporários para o nome da tabela.
Também para algumas consultas de classificação, ele cria arquivos temporários.
Enquanto eu traçava. Isso acontece.
fonte
Acho que você pode encontrar as consultas em questão no log de consultas lentas, uma vez que as consultas que criam grandes tabelas temporárias geralmente são executadas por um longo período de tempo, foi assim que isso me ajudou hoje em um servidor em que achei a
/tmp
partição cheia por causa de um problema semelhante. grande arquivo temporário do MySQL, era um arquivo 4G, eu encontrei a consulta no log de consultas lentas e relatei a consulta aos desenvolvedores e eles encontraram a corrupção na consulta e eles a corrigem, parece lagos para uma instrução MySQL com limite, por isso foi executada por um longo tempo e escreveu um arquivo temporário 4G e preencheu a/tmp
partição.E há outra maneira de descobrir o que causou esse grande arquivo temporário, que é binário, de modo que você não pode lê-lo diretamente, mas eu descobri que você pode fazer o grep do texto contido nele, usando o comando Linux como este,
Assegurei-me das palavras do texto que a consulta MySQL executava e a criei.
fonte