Erro: o espaço de tabela para a tabela xxx existe. DESCARTE o espaço de tabela antes de IMPORTAR


134

Eu sou bastante novo no MySQL e estou recebendo um erro bastante interessante, no qual não consigo encontrar nenhuma ajuda pelo google e pela pesquisa de stackoverflow.

Estou executando um servidor local do MySQL 5.6.10 no MacOS 10.8.3 e gerencio meu banco de dados via Navicat essentials for MySQL.

O erro que recebo é que, depois de executar e gerenciar meu banco de dados, por alguns dias / semanas, algo dispara (parece incompleto) para excluir algumas das tabelas que criei usando consultas do Navicat.

Quando tento executar consultas usando essas tabelas, o Navicat me avisa que a tabela específica não existe. Até aí tudo bem - aqui vem a parte boa:

Quando tento criar a tabela, por exemplo, chamada "temp", que estava anteriormente lá, recebo a seguinte mensagem de erro:

Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.

No entanto, se eu tentar soltar a tabela ou tentar descartar o espaço de tabela para esta tabela, use

DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;

Eu recebo as seguintes mensagens de erro:

Error : Unknown table 'database.temp'
Error : Table 'database.temp' doesn't exist

Isso significa que sou aconselhado a descartar o espaço de tabela, mas quando tento fazê-lo, a tabela não existe. É possível que exista algum tipo de restante dessa tabela em um local diferente onde a consulta DISCARD não está verificando? E alguém tem uma idéia do que poderia desencadear tudo isso - completamente aleatoriamente, ao que parece?

Como eu disse, sou novo no assunto e praticamente sem noção. Eu suspeito que reiniciar meu laptop, ou seja, redefinir meu servidor MySQL local ou talvez direitos de permissão de usuário possam ter a ver com isso, mas estou apenas fazendo uma hipótese aqui.


Você pode verificar algumas soluções para esse tipo de erro. codespeaker.com/laravel-framework/...
smzapp

Respostas:


123

Um pouco tarde aqui, mas geralmente vi esse problema ocorrer quando você recebe um erro 'tablespace full' ao executar no modo 'innodb_file_per_table'. Sem entrar em muitos detalhes (mais aqui ), o espaço de tabela do servidor de banco de dados é definido pela configuração innodb_data_file_path e, por padrão, é bastante pequeno. Mesmo maior, o 'espaço de tabela cheio' ainda pode ocorrer com consultas maiores e isso (muitas coisas que não são da tabela são armazenadas lá, desfaz logs, caches, etc ...).

De qualquer forma, descobri que, se você procurar no diretório do SO em que os arquivos por tabela estão armazenados, / var / lib / mysql por padrão no OSX, / usr / local / var / mysql com o homebrew iirc, você encontrará um arquivo tablename.ibd órfão sem o arquivo tablename.frm complementar. Se você mover esse arquivo .ibd para um local temporário seguro (apenas por segurança), isso deve corrigir o problema.

$ ls /var/lib/mysql

table1.frm
table1.idb
table2.frm
table2.ibd
table3.idb <- problem table, no table3.frm
table4.frm
table4.idb

$ mkdir /tmp/mysql_orphans
$ mv /var/lib/mysql/table3.ibd /tmp/mysql_orphans/

Uma ressalva, no entanto, verifique se o que está causando o problema originalmente, por exemplo, consultas de longa duração, tabela bloqueada, etc ... foi apagado. Caso contrário, você acaba com outro arquivo .ibd órfão ao tentar uma segunda vez.


5
Meu diretório MySQL-Data estava no OS X Yosemite foi armazenado no /usr/local/mysql/datalugar de /var/lib/mysql/. Caso contrário, perfeitamente resolvido o problema.
Alex Hoppen

13
no meu caso, não funcionou ... apaguei o arquivo idb órfão ... e quando fui recriar a tabela com o mesmo nome, recebi uma mensagem dizendo que a tabela já existe (para a qual apaguei o .idb arquivo) ... após a ação acima, um novo arquivo .idb órfão foi criado no diretório ... muito estranho ... eu realmente não sei o que assumir.
Dimitris Papageorgiou

4
Eu tenho o mesmo problema que o Dimitris - tive que criar um despejo do banco de dados, soltar o banco de dados e restaurá-lo do despejo.
Gerfried

1
@ Gerfried Isso funcionou para mim desde que parei e iniciei o processo MySQL após excluir o arquivo.
MER

2
@DimitrisPapageorgiou Isso funcionou para mim desde que eu parei e iniciei o processo MySQL após excluir o arquivo.
MER

75

Usuários Xampp e Mamp

Teve o mesmo erro ao importar um banco de dados (após esvaziá-lo) através do MySQL. Descobri que havia um tablename.ibdarquivo enquanto todos os outros foram excluídos. Excluí-o manualmente mysql/data/database_namee o erro desapareceu.


Esta resposta ajudou pessoas que não usam o XAMPP?
Technotronic

3
polegares para cima de mim! funcionou bem. No entanto, permita-me uma pequena atualização para o caminho da pasta para mim (fiquei confuso ao tentar encontrá-lo): / Applications / XAMPP / xamppfiles / var / mysql
Fenix ​​Aoras

usando este desenvolveu um erro 168 do mecanismo de armazenamento no Linux Mint, não usando Xampp nem Mamp (sem crítica, apenas informando)
Steven

1
trabalho! Eu apaguei um arquivo .ibd quebrado e a tabela pode ser criada novamente. Ubuntu 16, mariadb
waza123

O mesmo vale para Docker (se acidentes docker ou Host for reiniciado, você pode ter data morto dentro de sua pasta de sincronização que cria este erro)
SliQ

23

Para usuários WAMP [Windows 7 Ultimate x64 bits]:

Concordo com o que o DangerDave disse e, portanto, estou disponibilizando uma resposta para os usuários do WAMP .

Nota: Antes de tudo, você deve ir para a pasta .. \ WAMP \ Bin \ MySQL \ MySQL [Your MySQL Version] \ Data .

Agora, você verá pastas de todos os seus bancos de dados

  • Clique duas vezes na pasta do banco de dados que possui a tabela incorreta para abri-lo
  • Não deve haver um arquivo [Your offending MySQL table name].frm , deve haver um arquivo[Your offending MySQL table name].ibd
  • Exclua o [Your offending MySQL table name].ibd
  • Em seguida, exclua-o da Lixeira também
  • Em seguida, execute sua consulta MySQL no banco de dados e pronto

22

Se você receber o .idb recriado novamente após excluí-lo, leia esta resposta.

Foi assim que funcionou comigo. Eu tinha o .idbarquivo sem ele correspondente .frme sempre que eu excluí-lo .idb, o banco de dados o recria. e encontrei a solução em uma linha na documentação do MySQL (parte Tablespace Não Existe )

1- Crie um arquivo .frm correspondente em outro diretório de banco de dados e copie-o para o diretório de banco de dados onde a tabela órfã está localizada.

2- Emita DROP TABLE para a tabela original. Isso deve eliminar a tabela com êxito e o InnoDB deve imprimir um aviso no log de erros de que o arquivo .ibd estava ausente.

Copiei outro .frmarquivo de tabela e nomeie-o como minha tabela ausente, depois faça uma consulta normal da tabela suspensa e pronto, funcionou e a tabela é descartada normalmente!

meu sistema é XAMPP no Windows MariaDB v 10.1.8


3
Caso isso não seja óbvio para mais ninguém: quando você cria o arquivo .frm e solta a tabela, o arquivo .idb deve ser excluído.
Narretz

6
Pode confirmar, os passos devem ser: 1. exclusão mysql / caminho / table_name.idb 2. add table_name.frm 3. GOTA table_name
Jeremy Dennen

Isso funcionou para mim. Obrigado. Eu recebi esse erro ao excluir um FK e imediatamente depois dele, parei o mysql. Eu acho que esta minha tabela def dados corrompidos.
Rodolfo Velasco

lembre-se de reiniciar mysql depois de colocar arquivo, em seguida, tentar soltá-lo
Seyed Ali Roshan

No mysql> data> mysql, existe um arquivo .frm que eu preciso. Posso copiar este?
Timo

8

No meu caso, a única solução de trabalho foi:

  1. CRIAR bad_tableMOTOR DE TABELA = MyISAM ...
  2. rm bad_table.ibd
  3. DROP TABLE bad_table

Trabalhou para mim! [ERRO] InnoDB: O arquivo './dbname/tablename.ibd' já existe, embora a tabela correspondente não existisse no dicionário de dados do InnoDB. Você moveu os arquivos .ibd do InnoDB sem usar os comandos SQL DISCARD TABLESPACE e IMPORT TABLESPACE, ou o mysqld travou no meio de CREATE TABLE? Você pode resolver o problema removendo o arquivo './dbname/tablename.ibd' sob o 'datadir' do MySQL.
31418 PAdrian

1
Não é possível criar a tabela porque o Tablespace existe.
Liam Mitchell

não é trabalho para mim. O arquivo ibd continua aparecendo depois que eu quero recriar a tabela com o mesmo mecanismo.
Fajar Rukmo 6/04

8

Isto é exatamente o que eu fiz no mariadb 10.2.16 no fedora quando eu tinha uma tabela que mostrava exatamente os mesmos erros no arquivo de log ...

2018-07-11  9:43:58 140323764213504 [Note] InnoDB: The file './database_name/innodb_table.ibd' already exists though the corresponding table did not exist in the InnoDB data dictionary. You can resolve the problem by removing the file.
2018-07-11  9:44:29 140323764213504 [Warning] InnoDB: Tablespace 'database_name/innodb_table' exists in the cache with id 2836 != 2918

sua milhagem e erros podem variar, mas o principal que eu assumo é

...already exists though the corresponding table did not exist in the InnoDB data dictionary...

com a tabela suspensa não está funcionando, bem como alterar a tabela ...

MariaDB [database_name]> drop table innodb_table;
ERROR 1051 (42S02): Unknown table 'database_name.innodb_table'

MariaDB [database_name]> alter table innodb_table discard tablespace;
ERROR 1146 (42S02): Table 'database_name.innodb_table' doesn't exist

create table também falha assim:

MariaDB [database_name]> create table  innodb_table(`id` int(10) unsigned NOT NULL);
ERROR 1813 (HY000): Tablespace for table '`database_name`.`innodb_table`' exists. Please DISCARD the tablespace before IMPORT

para consertar isso, o que eu fiz foi primeiro

create table  innodb_table2(`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.07 sec)

no diretório / var / lib / mysql / database_name, fiz o seguinte como root, reconhecendo a substituição de innodb_table.ibd, causando problemas

cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb

então de volta ao console do mysql, emiti um comando drop bem-sucedido nas duas tabelas

MariaDB [database_name]> drop table innodb_table;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    8
Current database: database_name

Query OK, 0 rows affected (0.08 sec)

MariaDB [database_name]> drop table innodb_table2;
Query OK, 0 rows affected (0.25 sec)

e agora tudo está quadrado e posso recriar uma única mesa ...

MariaDB [database_name]> create table  innodb_table (`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.08 sec)

EDIT: eu estava indo para adicionar um

restorecon -Rv /var/lib/mysql/database_name 

comando após a cópia do banco de dados para obter todos os contextos selinux da maneira que deveriam ser, mesmo que os excluamos do banco de dados quase imediatamente, mas na alternativa você pode adicionar a opção --archive ou -a nas duas cp comandos, então sim, na verdade a opção de arquivamento reduz isso:

cp innodb_table2.frm innodb_table.frm
cp innodb_table2.ibd innodb_table.ibd
chown mysql:mysql innodb_table.frm innodb_table.ibd
chmod 660 innodb_table.frm innodb_table.ibd
restorecon -Rv /var/lib/mysql/database_name
systemctl restart mariadb

apenas o seguinte que eu acho melhor e mantém o contexto selinux definido para a tabela já criada.

cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb

Substituí a lista mais longa de comandos acima pela lista mais curta, que ainda pode ser reduzida com um *


Isso funcionou bem para mim no CentOS MariaDB 10.2.31. Eu estava procurando por uma solução que não exigisse a reinicialização do serviço MySQL e foi isso. A chave é criar o conjunto de arquivos innodb_table2 limpos (innodb_table2.frm e innodb_table2.ibd) e colocar os dois sobre os arquivos innodb_table.
Justin

6

No meu caso:

Primeiro remova tableName.ibdno diretório do banco de dados do Mysql e execute novamente:

ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;

Obrigado, No meu caso, eu tenho 1) parou a parada do servidor de banco de dados (mysql serviço) 2) arquivo 3) começou BID removido do servidor de banco de dados (serviço MySQL iniciar) não executar consultas alter e soltar
lemk0

Seu diretório de banco de dados no Windows está em C: \ ProgramData \ MySQL por padrão
Rodin10

4

Eu recebi o mesmo erro ao executá-lo no wampserver ao tentar criar uma tabela de usuários. Encontrei um arquivo users.ibd e, após excluir esse arquivo, executei o comando migrate novamente e ele funcionou. O arquivo na minha máquina Windows estava localizado em wamp / bin / mysql / mysql5.6.12 / data / myproject.


4

Solução

No entanto, a opção mais fácil é a seguinte: reinicie o MySQL e execute as mesmas quatro etapas da seguinte maneira:

1) created a dummy table in the database;
2) discarded its tablespace;
3) moved the .ibd file into the database folder on the system;
4) attached the tablespace back to the table

Dessa forma, a identificação do espaço de tabela no dicionário de dados e o arquivo corresponderam; assim, a importação do espaço de tabela foi bem-sucedida.

Isso pode dar a você maior confiança ao lidar com algumas das "pegadinhas" do InnoDB durante o processo de recuperação ou mesmo transferências de arquivos.

ref


7
Esta não é uma resposta independente.
Nathaniel Ford

3

Aqui estão as etapas da solução:

  1. faça backup do seu banco de dados (estrutura com opção de gota e dados)
  2. parar o serviço do mecanismo mysql
  3. remova o diretório do banco de dados manualmente de dentro do mysql / data
  4. iniciar o mecanismo mysql
  5. crie um novo banco de dados com qualquer nome diferente do seu banco de dados corrompido
  6. crie uma única tabela com o nome da tabela corrompida dentro do novo banco de dados (esse é o segredo). e é melhor criar a tabela com exatamente a mesma estrutura.
  7. renomeie o banco de dados para o antigo banco de dados corrompido
  8. restaure seu backup e sua tabela estará funcionando bem.

2

Teve esse problema várias vezes. Se você possui um banco de dados grande e deseja evitar o backup / restauração (com a tabela ausente adicionada), tente algumas vezes:

DROP TABLE minha_tabela;

ALTER TABLE my_table DISCARD TABLESPACE;

-e-

rm minha_tabela.ibd (órfã sem minha_tabela.frm correspondente) localizada no diretório / var / lib / mysql / my_db /

-e depois-

CRIAR TABELA SE NÃO EXISTE my_table(...)


2

Excluir / mover tablename.ibd com certeza não funcionou para mim.

Como eu resolvi isso

Como eu ia excluir a tabela corrompida e inexistente, fiz um backup das outras tabelas indo para phpmyadmin-> database-> export-> tabelas selecionadas para backup-> export (como .sql).

Depois disso, selecionei o ícone do banco de dados ao lado do nome do banco de dados e o soltei. Criou um novo banco de dados. Selecione seu novo banco de dados-> importação-> selecione o arquivo que você baixou anteriormente-> clique em importar. Agora eu tenho minhas tabelas de trabalho antigas e a tabela corrompida foi excluída. Agora eu apenas criei a tabela que estava lançando o erro.

Provavelmente eu tive um backup anterior da tabela corrompida.


2

Este erro ocorre quando você suspende algumas funções. Como executar a consulta abaixo com chave estrangeira incorreta.

set foreign_key_checks=0

2

Teve exatamente o mesmo problema; Eu fabricaria adicionado mysql@5.6(depois de ter anteriormente 5.5).

Os padrões de fermentação para 5.6 são, innodb_file_per_table=1enquanto em 5.5 são innodb_file_per_table=0.

Seu ibdata1arquivo existente (os dados combinados do innodb) ainda terá referências às tabelas que você está tentando criar / soltar. Altere de innodb_file_per_tablevolta para 0 ou exclua o arquivo de dados ibdata1 ( isso perderá todos os seus dados, portanto, certifique-se de que o mysqldump primeiro ele ou que já tenha um dump .sql ).

O outro mysql@5.6padrão de fermentação que me mordeu foi a falta de uma porta; portanto, a rede estava padronizada para soquetes unix, e o cliente mysql continuava relatando:

ERROR 2013 (HY000): Lost connection to MySQL server at 'sending authentication information', system error: 32

Eu adicionei <string>--port=3306</string>à .plistmatriz, mas você também pode especificarport=3306 no seumy.cnf

Corre brew services stop mysql@5.6 faça as alteraçõesbrew services start mysql@5.6


1

Tentar eliminar o espaço de tabela pode causar outros erros. Para mim, recebi o seguinte erro:

DROP TABLESPACE `tablename`

Error Code: 1478. Table storage engine 'InnoDB' does not support the create option 'TABLESPACE or LOGFILE GROUP' 

Minha solução foi soltar o banco de dados. Isso removerá todos os espaços de tabela relacionados a ele e permitirá que você crie as tabelas novamente.


19
Infelizmente, é como dizer 'Eu tenho um parafuso, e usar um martelo retorna esse erro, então minha solução foi derrubar uma pedra'. O valor real seria descobrir como consertar essa tabela sem danificar o banco de dados inteiro.
Jason

Doh! Eu esperava que isso fosse uma solução alternativa para minha pergunta (e eu a postei como resposta), mas já estou no meio do processo de renomear tabelas / descartar o banco de dados. Eu meio que odeio o InnoDB agora.
NobleUplift

Mas eu destruí o banco de dados, o recriei e ainda tenho esse problema!
TRiG

@TRiG você reiniciou o servidor?
Aris

1
Acho que vou fazer uma pergunta separada, @Aris. No meu caso, está em um desktop Ubuntu. Eu reiniciei não apenas o MySQL, mas toda a máquina, várias vezes. Também excluiu a pasta do banco de dados manualmente com um rm -r. É irritante, mas nem espetacular.
TRiG

1

Se você tiver outro servidor com uma boa versão da mesma tabela, poderá fazer uma cópia (table_copy), transfira o table_copy para o servidor com problema. Em seguida, exclua a tabela de problemas e renomeie table_copy para table.


1

Para mim, ajudou apenas a ir para o diretório MYSQL DATA em / var / lib / mysql / {db_name} (linux) e soltar o arquivo {table_name} .ibd que era o mesmo que o nome da pasta.


0

Excluo apenas meu banco de dados antigo localizado no meu host local diretamente do wamp, Interrompa todos os serviços, acesse wamp / bin / mysql / mysql [versão] / data e encontrei o banco de dados com problemas, excluo-o e inicio novamente wamp todos os serviços, crie novamente seu banco de dados e pronto, agora você pode importar suas tabelas,


0

A maneira que eu encontrei para "resolver" esse problema é bastante irritante, mas existe um script que lida com isso.

Essencialmente, você precisa do ibdata1e ib_logfile*arquivos para ir embora (eles contêm os mapeamentos de chaves estrangeiras, entre outras coisas). A única maneira segura de fazer isso é exportar todos os seus bancos de dados, parar o mysql, remover os arquivos, iniciar o mysql e importar os arquivos.

O roteiro que ajuda a resolver este problema é https://github.com/uberhacker/shrink-ibdata1 , embora o propósito declarado desse script é diferente, ele faz resolver o problema.


0

A única maneira que funcionou para mim foi:

  1. Crie uma tabela semelhante
  2. Copie os arquivos .frm e .idb da nova tabela semelhante para o nome da tabela corrompida.
  3. Corrigir permissões
  4. Reinicie o MariaDB
  5. Solte a tabela corrompida

-1

se você tiver esse problema e não tiver outra opção, altere o mecanismo para outro mecanismo como 'myisam' e tente criar a tabela.

isenção de responsabilidade: não é a resposta válida, pois você pode ter restrições de chave estrangeira que não serão suportadas por outro mecanismo de armazenamento. Todo mecanismo de armazenamento tem sua própria especialidade para armazenar e acessar dados, e esses pontos também devem ser levados em consideração.


-1

DESCARTE o espaço de tabela antes de IMPORTAR

Eu tenho a mesma solução de problema está abaixo

  1. Primeiro você deve soltar o nome do seu banco de dados. se seu banco de dados não estiver excluindo, você me enviará um email Para o sistema Windows, seu diretório será C: / xampp / mysql / data / yourdabasefolder remove "yourdabasefolder"

  2. Novamente, você deve criar um novo banco de dados e importar seu arquivo sql antigo. Será trabalho

obrigado


-1

Eu tive que localizar meu diretório de dados MySQL:

MOSTRAR VARIÁVEIS ONDE Nome_da_ Variável COMO "% dir"

Em seguida, force a remoção desse banco de dados:

sudo rm -rf


-1

Você pode executar a seguinte consulta como um usuário root mysql

drop tablespace `tableName`

-1

Ei, desenvolvedores não perca seu tempo. Simplesmente exclua o banco de dados que contém tabelas e importe tabelas inteiras novamente. Economize tempo = tempo é dinheiro. Felicidades.

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.