Estoy usando estos pasos para crear una tabla my_user
, que ya existía pero de alguna manera desapareció de mi base de datos 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)
Intenté # mysqladmin flush-tables
y repetí los pasos anteriores, pero no fue útil. Además, reinició el mysql
servicio, pero no es bueno.
¿Algunas ideas? Google me ha fallado hasta ahora. Gracias.
Información 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
pero el error es sobremy_db.user
...CREATE TABLE
código es generado por la biblioteca Doctrine ORM (PHP).Respuestas:
Arquitectura InnoDB
ANÁLISIS
my_user.frm
ymy_user.ibd
. El diccionario de datos todavía tiene una entrada para esa tabla.DROP TABLE my_user;
porque mysqld busca elmy_user.frm
primero. Como esto es nomy_user.frm
, la tabla no se puede descartar.my_user.frm
no existe, no puede ejecutarloCREATE TABLE my_user ...
porque mysqld cree que está bien crear la tabla pero luego se desvía al motor de almacenamiento. InnoDB dice "Ya tengo el tablespace_id de my_user registrado".Esta secuencia de eventos se puede probar si crea la tabla con MyISAM. mysqld lo permitirá. Una vez que cambia a InnoDB, vuelve directamente al diccionario de datos, que es defectuoso en esa entrada.
Tengo dos sugerencias
SUGERENCIA # 1
No crees más la tabla con ese nombre. Use un nombre de tabla diferente
Esto hará que cambie el nombre de la tabla en el código de su aplicación
SUGERENCIA # 2
He tratado este problema antes en mi tabla InnoDB posterior. SELECT devuelve ERROR 2006 (HY000): el servidor MySQL se ha ido (después de un corte de energía)
fuente
ib_logfile0
yib_logfile1
(junto conibdata1
). Después de la importación, pude crear lamy_user
tabla sin ningún problema. Gracias Rolando!DROP TABLE
. Algo está pasando mal.Solo para agregar mi solución ya que tuve un problema similar.
TL; DR
Detalle
Me encontré con la desagradable situación en la que falló una declaración ALTER TABLE debido a que una clave externa no se eliminó antes. Esto llevó a algunas inconsistencias en el diccionario de datos InnoDB (probablemente debido a http://bugs.mysql.com/bug.php?id=58215 ).
Pregunta relacionada aquí: /programming/16857451/error-in-foreign-key-constraint-on-a-droped-table
Error al cambiar el nombre de './db/#sql-482c_8448f' a './db/visits' (errno: 150)
Como no pude recuperar la tabla # sql-482c_8448f para las visitas, decidí volver a importarla desde una copia de seguridad realizada justo antes del alter. Sin embargo esto falló. En investigación:
SQL / Errores
Intentar recrear la tabla sin la clave externa causó un error 150
Intentar crearlo provocó un error 121
Finalmente utilicé un nuevo nombre de clave externa. No esperaba que esto funcionara, pero permitió que se creara la tabla.
Simplemente soltar la tabla después de eso eliminó el registro errante en INFORMATION_SCHEMA.INNODB_SYS_FOREIGN, lo que permite una importación con el nombre de la clave externa original.
fuente
Hay una forma simple de evitar esto, aunque es cierto que, en ciertas circunstancias, es posible que no desee hacer esto. Dado que este problema se deriva de una referencia interna de InnoDB, simplemente puede crear esta tabla con el mismo nombre, las mismas columnas, solo con un motor de almacenamiento diferente. Me encontré con esto en un esclavo MySQL, y aunque el maestro del que estaba replicando era InnoDB, volví a crear esta tabla con MyISAM y pude volver a funcionar. Elegí específicamente InnoDB para mi motor de almacenamiento en el maestro, y en algunas tablas, también sería importante en el esclavo, pero en este caso, no tuvo ningún impacto en este esclavo para esta tabla, por lo que fue una forma rápida para solucionar este problema. Eliminar toda la base de datos habría sido un proyecto mucho más grande.
fuente
Lo que funcionó para mí fue:
mysqlfrm
de Oraclemysql-utitilies
** (porque no tenía otra copia / copia de seguridad de la estructura), por ejemplo:/usr/bin/mysqlfrm --diagnostic /tmp/tablebackup/MyTable.frm
MyTable
que ahora creé una tablaMyTableB
con la estructura de la tabla original)RENAME TABLE `MyTableB` TO `MyTable`;
(tenga en cuenta que esto solo funciona si no lo hainnodb_force_recovery
configurado en sumy.cnf
)ALTER TABLE `MyTable` DISCARD TABLESPACE;
.ibd
archivo original (solo el archivo .ibd, no el archivo .frm) nuevamente en el directorio de la base de datos mysql desde donde se movió originalmente (no debería haber un archivo .ibd existente en este momento porque eso se elimina por elDISCARD TABLESPACE
mando)ALTER TABLE `MyTable` IMPORT TABLESPACE;
* Reinicé mysql después de este paso, pero no estoy seguro de que sea necesario
** mysql-utilities pueden requerir instalación
mysql-connector-python
primerofuente
Perdió datos de la tabla, pero el registro sobre esta tabla todavía existe en "mysql / data / ibdata1". La solución más fácil es crear esta tabla en alguna otra base de datos y luego copiar archivos:
a los tuyos:
fuente