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