Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Perdida de Relaciones entre tablas (MyIsam to InnoDB)

Estas en el tema de Perdida de Relaciones entre tablas (MyIsam to InnoDB) en el foro de Mysql en Foros del Web. Hola buen dia, les comento que me ha sucedido algo muy raro, tenia mi base de datos en produccion ya desde el año pasado, era ...
  #1 (permalink)  
Antiguo 02/10/2013, 10:03
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Pregunta Perdida de Relaciones entre tablas (MyIsam to InnoDB)

Hola buen dia, les comento que me ha sucedido algo muy raro, tenia mi base de datos en produccion ya desde el año pasado, era InnoDB con sus respectivas relaciones entre tablas (primarys, foreign, constraint, on delete on update cascade,...), el dia de ayer revisando mi base de datos, vi que no habia restricciones para los insert, al revisar la estrucutra de las tablas me doy cuenta que ahora son MyIsam y no se como paso esto, por lo tanto se perdieron todas las relaciones que habia entre las tablas, restricciones etc, ahora intento volver a pasar las tablas a InnoDB, intente con el ALTER TABLE ENGINE=INNODB, y si me las transforma a InnoDB, sin embargo las relaciones no se recuperan a pesar que en la definicion de la tabla estan los foreing key, intente con el RENAME, para crear una tabla espejo con otro nombre, luego borrar la tabla vieja y volver a renombrar la nueva como estaba antes, y aun asi sigue sin respetar las restrcciones de Foreing Key... alguien me puede ayudar? Esto fue lo que hice. Saludos!


ALTER TABLE


RENAME
  #2 (permalink)  
Antiguo 02/10/2013, 10:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Perdida de Relaciones entre tablas (MyIsam to InnoDB)

Algunos detalles:
1) Ninguna tabla cambia su estructura por si misma. Solo puede suceder si expresamente se ha hecho un ALTER TABLE que lo genere.

2) Lo que sí puede ocurrir es que los scripts de creación de las tablas no incluyeran la clasula ENGINE = InnoDB, o bien que el InnoDB no estuviese activado en el servidor de producción.
En el primer caso, MySQL aplica el motor de tablas por default definido en el servidor, por lo que si éste es MyISAM... pues descartará la creación de toda FK, sin nisiquiera darte una advertencia.

3) Modificar las tablas para pasarlas a InnoDB es insuficiente. No "recuperará" las relaciones de FK por la simple razón de que para las tablas MyiSAM estas jamás existieron.
Lo que debes hacer en ese caso es volver a crear una a una las FK. Una a una.

4) Migrar datos entre esta base productiva, y otra correctamente construida, puede no funcionar. Como en la base productiva las restricciones no estuvieron operativas, es altamente probable que haya datos inconsistentes, es decir datos que no respeten esas FK, y en ese caso la migración de datos será incompleta e incorrecta en muchos momentos.
La única solución para eso es hacer n plan de migración y de corrección de datos defectuosos.
La verdad, no te envidio. Es un trabajo que te llevará bastante tiempo y mucho esfuerzo. A mi ya me ha sucedido.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/10/2013, 10:28
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: Perdida de Relaciones entre tablas (MyIsam to InnoDB)

Una pregunta, hice un back up de la base de datos ya con las tablas migradas a InnoDb, cree una nueva base de datos y realizo ahi la carga de este backup con las tablas con el motor InnoDB, aun asi no me respeta las relaciones... por que sucede esto? Se supone que es como crearla desde cero no?
  #4 (permalink)  
Antiguo 02/10/2013, 10:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Perdida de Relaciones entre tablas (MyIsam to InnoDB)

Cita:
hice un back up de la base de datos ya con las tablas migradas a InnoDb
¿Y antes de ese backup, te aseguraste de volver a crear las FK?
¿Tuviste en cuenta lo que te dije en el punto 3?
Modificar las tablas NO ALCANZA. Debes volver a crear esas FK luego de modificar las tablas, porque las FK no existieron mientras las tablas fueron MyISAM. No es como si hubiesen estado "dormidas". NO EXISTEN.

¿Eso queda claro?

Las FK no se crean en automático. De hecho, puedes tener toda la base como InnoDB y jamás haberles definido FK a ninguna tabla. Y de todos modos funcionaría bien... claro que sin restricciones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 02/10/2013, 10:48
 
Fecha de Ingreso: agosto-2012
Ubicación: México
Mensajes: 106
Antigüedad: 11 años, 8 meses
Puntos: 6
Respuesta: Perdida de Relaciones entre tablas (MyIsam to InnoDB)

Si es lo que etaba revisando, y al parecer desde ahi no estan las FK, lo raro es que en mi definición de mis tablas si estaban:

ejemplo de esta tabla:

Código MySQL:
Ver original
  1. CREATE TABLE users (
  2.     id_user int not null auto_increment,
  3.     id_profile int not null,
  4.     username varchar (40) not null,
  5.     pass varchar(64) not null,
  6.     nombre varchar(200),
  7.     id_canal varchar(5),
  8.     clave_suc varchar(30),
  9.     logeado bool not null default false,
  10.     UNIQUE KEY user (username),
  11.     CONSTRAINT PK primary key (id_user),
  12.     CONSTRAINT FK1 foreign key (id_profile)
  13.         references profile (id_profile) ON DELETE CASCADE ON UPDATE CASCADE,
  14.     CONSTRAINT FK2 foreign key (id_canal)
  15.         references canal_venta (id_canal) ON DELETE CASCADE ON UPDATE CASCADE,
  16.     CONSTRAINT FK3 foreign key (clave_suc)
  17.         references sucursales (clave_suc) ON DELETE CASCADE ON UPDATE CASCADE
  18. )

Eso si no estaba especificado el motor InnoDB, no se si por eso al crearla no tomo en cuenta las FK, pero pues tendre que hacerlo manualmente tabla por tabla.. Muchas gracias!
  #6 (permalink)  
Antiguo 02/10/2013, 11:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Perdida de Relaciones entre tablas (MyIsam to InnoDB)

Cita:
Eso si no estaba especificado el motor InnoDB, no se si por eso al crearla no tomo en cuenta las FK
Eso ya te lo aclaré específicamente:
Cita:
2) Lo que sí puede ocurrir es que los scripts de creación de las tablas no incluyeran la clasula ENGINE = InnoDB, o bien que el InnoDB no estuviese activado en el servidor de producción.
En el primer caso, MySQL aplica el motor de tablas por default definido en el servidor, por lo que si éste es MyISAM... pues descartará la creación de toda FK, sin ni siquiera darte una advertencia.
Es decir que tu query de creación de la tabla debería haber sido:
Código MySQL:
Ver original
  1. CREATE TABLE users (
  2.     id_user INT NOT NULL AUTO_INCREMENT,
  3.     id_profile INT NOT NULL,
  4.     username VARCHAR (40) NOT NULL,
  5.     pass VARCHAR(64) NOT NULL,
  6.     nombre VARCHAR(200),
  7.     id_canal VARCHAR(5),
  8.     clave_suc VARCHAR(30),
  9.     logeado bool NOT NULL DEFAULT FALSE,
  10.     UNIQUE KEY user (username),
  11.     CONSTRAINT PK PRIMARY KEY (id_user),
  12.     CONSTRAINT FK1 FOREIGN key (id_profile)
  13.         REFERENCES profile (id_profile) ON DELETE CASCADE ON UPDATE CASCADE,
  14.     CONSTRAINT FK2 FOREIGN key (id_canal)
  15.         REFERENCES canal_venta (id_canal) ON DELETE CASCADE ON UPDATE CASCADE,
  16.     CONSTRAINT FK3 FOREIGN key (clave_suc)
  17.         REFERENCES sucursales (clave_suc) ON DELETE CASCADE ON UPDATE CASCADE
  18. ) ENGINE=InnoDB; # Esto es lo que debía ir al final en cada CREATE de tabla.

Por favor, lee lo que se te responde. De lo contrario terminaremos dando vueltas en círculo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: innodb, migrar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:38.