No todos los programadores, a la hora de crear una base de datos, definen el motor de la misma, y, en versiones de MySQL más antiguas, el motor por defecto de MySQL es MyISAM. MyISAM es potente para bases de datos de «solo lectura» pero tiene el gran inconveniente de que provoca bloqueos, algo muy problemático en bases de datos de lectura/escritura continua y alterna.

Por ello, en ocasiones nos encontraremos con tablas de bases de datos que se encuentran en MyISAM y tienen esta problemática. La solución consiste simple y llanamente en modificar el motor de la tabla a InnoDB, y existen dos formas de realizar el cambio, una rápida y sencilla, y una más tediosa pero segura, y que recomiendo en casos en los que las tablas tengan muchos datos.

IMPORTANTE: Realizad siempre un backup de la BBDD/Tabla antes de realizar cualquier cambio en la misma

Para el primer caso, la solución es tan simple como realizar un alter table:

alter table nombre_de_tabla engine=innodb;

 

Con esto, el motor se cambiará a InnoDB, y no debería existir problemas, pero en ocasiones se producen inconsistencias, por lo que se recomienda el segundo procedimiento:

Para ello, entramos a MySQL y accedemos a la base de datos en la que se encuentra la tabla a modificar.

mysql

 

use nombre_database;

 

Una vez dentro, debemos realizar un show create table de la tabla a modificar, para que nos devuelva la sintaxis de creación de la tabla.

show create table nombre_de_tabla;

 

El show create table nos devolverá lo siguiente, en nuestro caso:

CREATE TABLE `nombre_de_tabla` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`post_id` bigint(20) NOT NULL,
`last_updated` datetime NOT NULL,
`1_day_stats` mediumint(9) NOT NULL,
`7_day_stats` mediumint(9) NOT NULL,
`30_day_stats` mediumint(9) NOT NULL,
`all_time_stats` bigint(20) NOT NULL,
`raw_stats` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=12409 DEFAULT CHARSET=latin1;

 

Lo que debemos hacer es editar el nombre de la tabla a un nombre temporal, y el motor a InnoDB:

CREATE TABLE `nombre_de_tabla_temporal` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`post_id` bigint(20) NOT NULL,
`last_updated` datetime NOT NULL,
`1_day_stats` mediumint(9) NOT NULL,
`7_day_stats` mediumint(9) NOT NULL,
`30_day_stats` mediumint(9) NOT NULL,
`all_time_stats` bigint(20) NOT NULL,
`raw_stats` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=innodb AUTO_INCREMENT=12409 DEFAULT CHARSET=latin1;

 

Una vez  realizado esto, tendremos dos tablas, una «nombre_de_tabla» en myisam, y con contenido, y una «nombre_de_tabla_temporal» en innodb y vacía, por lo que el siguiente paso es volcar la información a la tabla temporal:

insert into nombre_de_tabla_temporal select * from nombre_de_tabla;

 

Por último, solo nos queda renombrar ambas tablas:

rename table nombre_de_tabla to nombre_de_tabla_OLD;

 

rename table nombre_de_tabla_temporal to nombre_de_tabla;

 

Y con esto, habríamos modificado la tabla a InnoDB de forma segura.


0 comentarios

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *