MySQL: # 126 - Arquivo de chave incorreto para a tabela


108

Recebi o seguinte erro de uma consulta MySQL.

#126 - Incorrect key file for table

Eu nem mesmo declarei uma chave para esta tabela, mas tenho índices. Alguém sabe qual poderia ser o problema?


3
Também recebo isto com visualizações
Elzo Valugi

4
a pasta tmp tem um limite geralmente de 2 GB, tente df -h para vê-lo
Elzo Valugi

Se você fez um REPAIR TABLEe ainda está conseguindo, e ainda há espaço, /tmpentão você pode tentar apenas reiniciar o servidor.
icc97

Respostas:


160

Sempre que isso aconteceu, minha experiência foi um disco cheio.

EDITAR

Também é importante notar que isso pode ser causado por um ramdisk completo ao fazer coisas como alterar uma tabela grande se você tiver um ramdisk configurado. Você pode comentar temporariamente a linha do ramdisk para permitir tais operações se não puder aumentar o tamanho dela.


4
Também tenho cerca de 2 Gb de espaço livre e recebo este erro. Mas meu banco de dados tem cerca de 1,7 Gb e o banco de dados tem uma tabela com aproximadamente 1,5 milhão de linhas. Após a limpeza, quando o espaço livre cerca de 3,5-4 GB, o erro desaparece.
Sergey

2
No meu sistema (Fedora 18) /tmpé um pequeno sistema de arquivos tmpfs e mysql ficou sem espaço escrevendo uma tabela temporária lá. Tive que definir a tmpdirvariável de configuração conforme mencionado em mysql.com
jcbwlkr

1
Embora isso possa ser uma causa, isso nunca foi devido ao disco cheio para mim. Estou recebendo este erro em uma instância do Amazon RDS alocada para 10 GB que está apenas 1% cheia. A falta de memória também pode ser um motivo.
Cerin

2
você pode definir tmpdir = / mysql_tmp ou algo no my.cnf e deve estar no sistema de arquivos raiz (por maior que seja)
Kevin Parker

Também recebi o mesmo erro, embora tenha espaço em disco [root @ ADM-PROD-PERCONA-SL-RP-03 percona] # df -h Tamanho do sistema de arquivos usado Uso disponível% Montado em / dev / xvda1 7.8G 1.6G 6.1G 21% / devtmpfs 61G 80K 61G 1% / dev tmpfs 61G 0 61G 0% / dev / shm / dev / md0 3.0T 1.8T 1.2T 61% / mnt
Ashish Karpe

35

Em primeiro lugar, você deve saber que chaves e índices são sinônimos no MySQL. Se você olhar a documentação sobre a sintaxe CREATE TABLE , poderá ler:

KEYnormalmente é um sinônimo de INDEX. O atributo de chave PRIMARY KEYtambém pode ser especificado apenas KEYquando fornecido em uma definição de coluna. Isso foi implementado para compatibilidade com outros sistemas de banco de dados.


Agora, o tipo de erro que você está recebendo pode ser devido a duas coisas:

  • Problemas de disco no servidor MySQL
  • Chaves / tabelas corrompidas

No primeiro caso, você verá que adicionar um limite à sua consulta pode resolver o problema temporariamente. Se isso tmpfor suficiente para você, provavelmente você tem uma pasta muito pequena para o tamanho das consultas que está tentando fazer. Você pode então decidir ou aumentar tmpou diminuir suas consultas! ;)

Às vezes, tmpé grande o suficiente, mas ainda fica cheio, você precisará fazer uma limpeza manual nessas situações.

No segundo caso, existem problemas reais com os dados do MySQL. Se você puder inserir novamente os dados facilmente, recomendo apenas descartar / recriar a tabela e inserir novamente os dados. Se você não puder, tente consertar a mesa com a mesa REPAIR . É um processo geralmente demorado que pode muito bem falhar.


Veja a mensagem de erro completa que você recebe:

Arquivo de chave incorreto para a tabela 'FILEPATH.MYI'; tente consertá-lo

Ele menciona na mensagem que você pode tentar consertá-lo. Além disso, se você olhar o FILEPATH real que obtém, pode descobrir mais:

  • se for algo parecido /tmp/#sql_ab34_23f, significa que o MySQL precisa criar uma tabela temporária devido ao tamanho da consulta. Ele armazena em / tmp, e que não há espaço suficiente em seu / tmp para essa tabela temporária.

  • se ele contiver o nome de uma tabela real, significa que essa tabela muito provavelmente está corrompida e você deve repará-la.


Se você identificar que seu problema é com o tamanho de / tmp, basta ler esta resposta a uma pergunta semelhante para a correção: MySQL, Erro 126: Arquivo de chave incorreto para a tabela .


16

Seguir essas instruções me permitiu recriar meu diretório tmp e corrigir o problema:

Exibir todos os sistemas de arquivos e seu uso de disco em formato legível por humanos:

df -h

Encontre os processos que têm arquivos abertos no /tmp

sudo lsof /tmp/**/*

Então umount /tmpe /var/tmp:

umount -l /tmp
umount -l /var/tmp

Em seguida, remova o arquivo de partição corrompido:

rm -fv /usr/tmpDSK

Em seguida, crie um novo bom:

/scripts/securetmp

Observe que, ao editar o script Perl securetmp, você pode definir manualmente o tamanho do diretório tmp, no entanto, apenas a execução do script aumentou o tamanho do diretório tmp em nosso servidor de aproximadamente 450 MB para 4,0 GB.


9

O erro # 126 geralmente ocorre quando você obtém uma tabela corrompida. A melhor maneira de resolver isso é fazer um reparo. Este artigo pode ajudar:

http://dev.mysql.com/doc/refman/5.0/en/repair-table.html


Excluí todas as minhas chaves e otimizei. Posso obter este erro se minha consulta for muito lenta?
Brian

Não tenho certeza, mas com base no meu entendimento, esse erro não é causado por uma consulta. Você já tentou consertar?
junho

3

Eu tenho esse erro quando eu definir ft_min_word_len = 2em my.cnf, o que reduz o comprimento de palavra mínimo em um índice de texto completo para 2, a partir do padrão de 4.

Reparar a mesa resolveu o problema.


Você sabe se isso só acontece quando você altera a configuração pela primeira vez ou é algo que pode acontecer porque o comprimento mínimo da palavra é muito pequeno?
Y0lk

1

Tente usar o limite em sua consulta. É por causa do disco cheio, como disse @Monsters X.

Também já enfrentei esse problema e resolvi pelo limite na consulta, pois os milhares de registros estavam lá. Agora funcionando bem :)


1

Eu sei que este é um tópico antigo, mas nenhuma das soluções mencionadas funcionou para mim. Eu fiz outra coisa que funcionou:

Você precisa:

  1. pare o serviço MySQL:
  2. Abra mysql \ data
  3. Remova ib_logfile0 e ib_logfile1.
  4. Reinicie o serviço


1

Eu resolvi esse problema com:

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;

Maio ajuda


Consegui resolver um problema semelhante usando apenas uma etapa, você pode reconstruir sua tabela usando o mecanismo de tabela atual. Ou seja, se você estiver usando myisam, use: ALTER IGNORE TABLE table ENGINE = MyISAM;
SeanDowney

1

Vá para /etc/my.cnfe comentetmpfs

#tmpdir=/var/tmpfs

Isso resolve o problema.

Executei o comando sugerido em outra resposta e, embora o diretório seja pequeno, estava vazio, portanto, o espaço não era o problema.

/var/tmp$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vzfs              60G   51G  9.5G  85% /
none                  1.5G  4.0K  1.5G   1% /dev
tmpfs                 200M     0  200M   0% /var/tmpfs
/var/tmpfs$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vzfs              60G   51G  9.5G  85% /
none                  1.5G  4.0K  1.5G   1% /dev
tmpfs                 200M     0  200M   0% /var/tmpfs

0

Tente executar um comando de reparo para cada uma das tabelas envolvidas na consulta.

Use o administrador do MySQL, vá para Catálogo -> Selecione seu Catálogo -> Selecione uma tabela -> Clique no botão Manutenção -> Reparar -> Usar FRM.


0

Agora, das outras respostas resolveu para mim. Acontece que renomear uma coluna e um índice na mesma consulta causou o erro.

Não está funcionando:

-- rename column and rename index
ALTER TABLE `client_types`
    CHANGE `template_path` `path` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    DROP INDEX client_types_template_path_unique,
    ADD UNIQUE INDEX `client_types_path_unique` (`path` ASC);

Trabalhos (2 afirmações):

-- rename column
ALTER TABLE `client_types`
    CHANGE `template_path` `path` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
-- rename index
ALTER TABLE `client_types`
    DROP INDEX client_types_template_path_unique,
    ADD UNIQUE INDEX `client_types_path_unique` (`path` ASC);

Isso foi no MariaDB 10.0.20. Não houve erros com a mesma consulta no MySQL 5.5.48.


0
mysql> set global sql_slave_skip_counter=1; start slave; show slave status\G

Então existe o erro obtido:

 Error 'Table './openx/f_scraper_banner_details' is marked as crashed and should be repaired' on query. Default database: 'openx'. Query: 'INSERT INTO f_scraper_banner_details(job_details_id, ad_id, client_id, zone_id, affiliateid, comments, pct_to_report, publisher_currency, sanity_check_enabled, status, error_code, report_date) VALUES (10274859, 321264, 0, 31926, 0, '', -1, 'USD', 1, 'FAILURE', 'INACTIVE_BANNER', '2016-06-28 04:00:00')'

mysql> tabela de reparo f_scraper_banner_details;

Isso funcionou para mim


0

Meu problema veio de uma consulta ruim. Eu referenciei uma tabela em FROM não foi referenciada em SELECT.

exemplo:

   SELECT t.*,s.ticket_status as `ticket_status`
   FROM tickets_new t, ticket_status s, users u

, users ué o que estava causando o problema para mim. Remover isso resolveu o problema.

Para referência, isso foi em um ambiente de desenvolvimento CodeIgniter.


0

Recebi esta mensagem ao escrever em uma tabela depois de reduzir o ft_min_word_len (comprimento mínimo da palavra do texto completo). Para resolvê-lo, recrie o índice reparando a tabela.


0

mysqlcheck -r -f -uroot -p --use_frm db_name

normalmente fará o truque

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.