Después de migrar de versión de MySql y actualizarme a la version 5.7, mis sql dejaron de funcionar y me percaté de que varias tablas no fueron importadas.
El mensaje que arrojaba el manejador es «Table storage engine for ‘nombre_tabla’ doesn’t have this option», el cual no proporciona ninguna solución o la causa que originó el problema. Después de investigar y verificar, me topé con varios artículos (en inglés) que indicaban como pudo suceder y la solución. Para ayudar a otros a encontrar la respuesta, escribo este post.
Instalé el nuevo Ubuntu Server 16.04 y al instalar el mysql más actual, se instaló la versión 5.7, la cual es la que presenta este problema debido a que la base de datos que importé, tenía varias tablas de tipo «innodb» con un motor de almacenamiento que no le pertenece, en este caso puedes ver en las estructuras de las tablas: «ROW_FORMAT=FIXED». Este tipo de almacenamiento se eliminó para «innodb» pero puede que funcione para tablas MyISAM, que por cierto la mayoría de mis tablas eran MyISAM, que fueron convertidas a innodb pero no se les cambió el row_format.
Solución:
La solución es simplemente eliminar «ROW_FORMAT=FIXED» antes de importarlo y así utilizará el que tenga por defecto. Ojo, esto sólo ocurre en la nueva versión porque está habilitado una opción “innodb_strict_mode” por defecto, pero sino tiene la opción habilitada, MySql mostrará un simple warning y continuará la importación, convirtiendo los «FIXED» a «COMPACT» y no tendrás ningún problema.
Verificación:
Para verificar la opción actual del strict mode, puede usar el siguiente comando:
1 |
show variables like '%strict%' |
Lo podemos ver en la consola o en phpmyadmin. Las versiones anteriores de MySql por defecto lo tienen en “OFF” y a partir de la nueva version 5.7 la encontraremos en “ON”.
Anterior:
Nueva:
Comúnmente esta configuración no se cambia, pero si deseas cambiarlo puedes hacerlo en archivo de configuración «my.cnf» que se puede encontrar «/etc/mysql/my.cnf» (Ubuntu Server)
Buscamos la línea donde indique «[mysqld]» (sino la tiene, créala al final), también ahí se definen las opciones de configuración de variable global, «sql_mode» que en versiones anteriores solo usaba una opción y en la nueva versión tiene múltiples que puede que te afecten, si posees algún otro problema, también las puedes modificar y dejarla como las versiones anteriores.
Agregando strict mode de innodb, al final del archivo, la opción es (ON/OFF):
[mysqld]
innodb_strict_mode = ON
Para los sql_mode, versiones anteriores:
[mysqld]
innodb_strict_mode = OFF
sql_mode=»NO_ENGINE_SUBSTITUTION»
Versiones nuevas a partir de MySql 5.7:
[mysqld]
innodb_strict_mode = ON
sql_mode=»STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION»
Y para reiniciar el servicio «service mysql restart» (puede variar según el sistema operativo).
Comparando estas configuraciones, podemos comprobar si están afectando a nuestra aplicación y podremos migrar a la nueva versión sin mayores inconvenientes, seleccionando las opciones que nos convengan. Muchas veces al ver las complicaciones después de una migración, optamos por devolvernos a la versión anterior. Con un poco de paciencia y leyendo, podemos adaptarnos a las nuevas versiones y mantenernos al día con la tecnología.
Muchas gracias, funcionó a la perfección. Tenía una base .sql vieja y al restaurar con la nueva versión de Mysql salía el error
Me alegra que te haya servido. Esto fue hace tiempo 2016, que bueno que la solución esté vigente.
Saludos.
¡Excelente! ¡Gracias por el Dato!
Funcionó muy bien quitando ROW_FORMAT=FIXED de archivo .sql. Estoy importando a la versión MySQL 8.0.28 una BD de la versión 5.6 y me sacaba de la importación. Fíjate que cambié la variable innodb_stricit_mode a OFF y el importador me mando un warnning como dices, pero aún asi me sacó de la importación. Al quitar el ROW_FORMAT=FIXED en la creación de la tabala que causaba problemas, todo funcionó de maravilla.
Saludos.
Muy bien! me alegra que haya servido. Ahora en esa versión debe ser distinta y por eso indicaba el error. Menos mal pudiste solucionar.
Saludos.