sábado, 23 de enero de 2016

Solucion al método de exportación en PhpMyAdmin 4.2.12deb2


En el ciclo de Sistemas Microinformáticos y Redes del IES Gonzalo Nazareno (centro donde actualmente curso el ciclo de ASIR), los compañeros están realizando despliegues en hosting (prácticas de entornos de prueba-producción) de aplicaciones web desarrolladas en PHP.

Una de las compañeras del ciclo, estaba realizando la migración de la Base de Datos MySQL de Drupal 8.0.2 con PhpMyAdmin 4.2.12deb2, y al intentar realizar la importación de la base de datos en el servidor en “producción” se encontró con el siguiente error.


 

El error se debe a que no se encuentra la columna “name” en la declaración de la tabla, y por lo tanto, cuando establece la clave primaria con dicha columna MySQL devuelve el error anterior.

Como alternativa, le sugerí a la compañera que utilizara “mysqldump” para realizar la exportación e importación de la Base de Datos MySQL. Esta herramienta ofrece un método de exportación más fiable que PhpMyAdmin y no encontraron el error anterior al usarla.

mysqldump -u user -p dbdrupal > dbdrupal-bckp.sql

Pero a mí me quedó la duda de por qué PhpMyAdmin se comportaba de esa manera, así que me puse a investigar sobre las diferencias entre los métodos de exportación de Mysqldump y PhpMyAdmin. Lo primero que hice fue comprobar el fichero “.sql” que genera PhpMyAdmin tras la exportación y encontré lo siguiente.

CREATE TABLE key_value (
collection varchar(128) CHARACTER SET ascii NOT NULL DEFAULT '' COMMENT 'A named collection of key and value pairs.'
`value` longblob NOT NULL COMMENT 'The value.',
PRIMARY KEY (collection,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Generic key-value storage table. See the state system for…';


ALTER TABLE key_value
ADD `name` varchar(128) CHARACTER SET ascii NOT NULL DEFAULT '' COMMENT 'The key of the key-value pair. As KEY is a SQL reserved keyword, name was chosen instead.';

El error se daba porque PhpMyAdmind intenta crear la estructura de la tabla completa y posteriormente realizar una modificación en ella para añadir el la columna “name”. Como comprenderéis el método de exportación de esta tabla no tiene mucho sentido.

Para que no suceda esto, hay que editar el script PHP /usr/share/phpmyadmin/libraries/plugins/export/ExportSql.class.php que se encarga de la exportación en PhpMyAdmin y modificar la siguiente línea.

if (preg_match('@CONSTRAINT|KEY@', $create_query)) {

por esta otra para que cree la columna que aparece en la restricción ante de declararla,

if (false && preg_match('@CONSTRAINT|KEY@', $create_query)) {

y comprobaremos que la exportación se realiza correctamente.

CREATE TABLE IF NOT EXISTS `key_value` (
`collection` varchar(128) CHARACTER SET ascii NOT NULL DEFAULT '' COMMENT 'A named collection of key and value pairs.',
`name` varchar(128) CHARACTER SET ascii NOT NULL DEFAULT '' COMMENT 'The key of the key-value pair. As KEY is a SQL reserved keyword, name was chosen instead.',
`value` longblob NOT NULL COMMENT 'The value.',
PRIMARY KEY (`collection`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Generic key-value storage table. See the state system for…';

 
Aunque esta modificación sirva para aquellos que quieran realizar las exportaciones e importaciones con PhpMyAdmin, yo recomiendo el uso de Mysqldump y la automatización de todas estas tareas mediante scripts.

No hay comentarios:

Publicar un comentario