Estou usando estas etapas para criar uma tabela my_user
, que já existia, mas desapareceu de alguma forma do meu banco de dados my_db
:
mysql> USE my_db;
mysql> DROP TABLE my_user;
mysql> ERROR 1051 (42S02): Unknown table 'my_user'
mysql> CREATE TABLE my_user (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255), group_id VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
mysql> ERROR 1005 (HY000): Can't create table 'my_db.my_user' (errno: -1)
Tentei # mysqladmin flush-tables
e repeti as etapas acima, mas não foi útil. Além disso, reiniciou o mysql
serviço, mas não é bom.
Alguma ideia? O Google falhou comigo até agora. Obrigado.
Informação extra:
mysql> SHOW engine innodb STATUS;
------------------------
LATEST FOREIGN KEY ERROR
------------------------
140703 15:15:09 Error in foreign key constraint of table my_db/my_user
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
CONSTRAINT "FK_CFBD431E285FAC6D" FOREIGN KEY ("group_id") REFERENCES "my_group" ("id")
my_user
, mas o erro é de cerca demy_db.user
...CREATE TABLE
código é gerado pela biblioteca Doctrine ORM (PHP).Respostas:
Arquitetura InnoDB
ANÁLISE
my_user.frm
emy_user.ibd
. O dicionário de dados ainda tem uma entrada para essa tabela.DROP TABLE my_user;
porque o mysqld procura omy_user.frm
primeiro. Como nãomy_user.frm
, a tabela não pode ser descartada.my_user.frm
não exista, você não pode executarCREATE TABLE my_user ...
porque o mysqld acha que é bom criar a tabela, mas depois adia para o mecanismo de armazenamento. O InnoDB diz "Eu já tenho o tablespace_id do meu_usuário registrado".Essa sequência de eventos pode ser comprovada se você criar a tabela usando o MyISAM. O mysqld permitirá isso. Depois de alternar para o InnoDB, ele volta ao dicionário de dados, que está com defeito nessa entrada.
Tenho duas sugestões
SUGESTÃO # 1
Não crie mais a tabela com esse nome. Use um nome de tabela diferente
Isso resultará na alteração do nome da tabela no código do aplicativo
SUGESTÃO # 2
Eu lidei com esse problema antes na minha tabela InnoDB SELECT retorna ERRO 2006 (HY000): O servidor MySQL se foi (após uma queda de energia)
fonte
ib_logfile0
eib_logfile1
(junto comibdata1
). Após a importação, eu poderia criar amy_user
tabela sem problemas. Obrigado Rolando!DROP TABLE
. Algo errado está acontecendo.Apenas para adicionar minha solução, pois tive um problema semelhante.
TL; DR
Detalhe
Corri para a situação desagradável em que uma instrução ALTER TABLE falhou devido a uma chave estrangeira não ter sido descartada anteriormente. Isso levou a algumas inconsistências no dicionário de dados do InnoDB (provavelmente devido a http://bugs.mysql.com/bug.php?id=58215 ).
Pergunta relacionada aqui: /programming/16857451/error-in-foreign-key-constraint-on-a-droped-table
Erro ao renomear './db/#sql-482c_8448f' para './db/visits' (número de erro: 150)
Como não consegui recuperar a tabela # sql-482c_8448f para visitas, decidi reimportá-la de um backup feito pouco antes da alteração. No entanto, isso falhou. Na investigação:
SQL / Erros
Tentando recriar a tabela sem a chave estrangeira causou erro ane 150
A tentativa de criá-lo causou um erro 121
Eventualmente, usei um novo nome de chave estrangeira. Eu não esperava que isso funcionasse, mas permitiu a criação da tabela.
Simplesmente soltar a tabela depois disso removeu o registro incorreto em INFORMATION_SCHEMA.INNODB_SYS_FOREIGN, permitindo uma importação com o nome da chave estrangeira original.
fonte
Existe uma maneira simples de contornar isso, embora seja certo que, em certas circunstâncias, você pode não querer fazer isso. Como esse problema decorre de uma referência interna do InnoDB, você pode simplesmente criar esta tabela com o mesmo nome, as mesmas colunas, usando apenas um mecanismo de armazenamento diferente. Eu me deparei com isso em um escravo do MySQL e, mesmo que o mestre do qual eu estava replicando fosse o InnoDB, recriei essa tabela com o MyISAM e consegui voltar a funcionar. Escolhi especificamente o InnoDB para o meu mecanismo de armazenamento no mestre e, em algumas tabelas, isso também seria importante para o escravo, mas, nesse caso, não causou nenhum impacto nesse escravo para essa tabela, por isso foi uma maneira rápida para contornar esse problema. Descartar todo o banco de dados teria sido um projeto muito maior.
fonte
O que funcionou para mim foi:
mysqlfrm
do Oraclemysql-utitilies
** (porque eu não tinha outra cópia / backup da estrutura), por exemplo:/usr/bin/mysqlfrm --diagnostic /tmp/tablebackup/MyTable.frm
MyTable
então, agora criei uma tabelaMyTableB
com a estrutura da tabela original)RENAME TABLE `MyTableB` TO `MyTable`;
(observe que isso só funciona se você não tiverinnodb_force_recovery
definido no seumy.cnf
)ALTER TABLE `MyTable` DISCARD TABLESPACE;
.ibd
arquivo original (somente o arquivo .ibd, não o arquivo .frm) de volta para o diretório do banco de dados mysql de onde foi originalmente movido (não deve haver um arquivo .ibd existente no momento, porque isso é removido peloDISCARD TABLESPACE
comando)ALTER TABLE `MyTable` IMPORT TABLESPACE;
* Reiniciei o mysql após esta etapa, mas não tenho certeza se isso é necessário
** o mysql-utilities pode exigir a instalação
mysql-connector-python
primeirofonte
Você perdeu os dados da tabela, mas o registro sobre esta tabela ainda existe em "mysql / data / ibdata1". A solução mais fácil é criar esta tabela em outro banco de dados e copiar arquivos:
para o seu próprio:
fonte