Obteve o erro 28 do mecanismo de armazenamento (disco cheio), mas meu disco não está cheio

3

Basicamente, o MySQL está me dando muitos erros de "Erro 28 do mecanismo de armazenamento", o que significa que não há mais espaço em disco disponível.

A saída de df -h é:

File system           Dim. Usati Disp. Uso% Montato su
/dev/md1               10G  7,9G  1,6G  84% /
tmpfs                 2,0G     0  2,0G   0% /lib/init/rw
udev                   10M  176K  9,9M   2% /dev
tmpfs                 2,0G     0  2,0G   0% /dev/shm
/dev/md2              683G  601G   48G  93% /home

Todo sistema de arquivos aqui não está vazio. Há algum outro problema?

Eu estou no meu - um servidor dedicado (debian 64bit)
- e os erros acontecem fazendo uma consulta pesada

    
por dynamic 15.06.2012 / 10:54

2 respostas

6

Pode ser que sua consulta faça com que o MySQL crie tabelas temporárias. Na configuração padrão, eles serão criados juntamente com as outras tabelas, o que provavelmente está na partição / , que tem apenas 1.6GB sobrando, e essas tabelas podem ficar maiores do que realmente muito rapidamente.

Assista ao seu espaço livre enquanto faz essa consulta.

Veja esta documentação sobre o assunto.

    
por 15.06.2012 / 11:02
3

Duas outras possibilidades:

  1. Sistemas de arquivos geralmente reservam 5% do espaço e retornam um erro quando atingem 95% da capacidade total. Seu /home está em 93%.
  2. Você recebe a mesma mensagem de erro quando ficar sem inodes, mesmo que ainda tenha espaço em disco. Você pode ver inodes com df -i .

Eu acho que a resposta de SvenW é mais provável que seja correta . Seu raciocínio é bom e eu mesmo me deparei com o mesmo problema.

Você pode descobrir se a consulta usará uma tabela temporária executando EXPLAIN <query> em sua instância do MySQL, substituindo <query> pela consulta real. Você está procurando "Usando temporário" na seção Extra . As tabelas temporárias serão gravadas no disco se forem maiores que max_heap_table_size e / ou tmp_table_size no seu my.cnf .

Você pode encontrar o diretório que o MySQL está usando para tabelas temporárias, observando a variável tmpdir na instância em execução ( mysql> SHOW VARIABLES LIKE 'tmpdir'; ) ou na sua my.cnf ( grep tmpdir my.cnf ).

    
por 15.06.2012 / 11:29