Cambiar de MyISAM a InnoDB todas las tablas de tu WordPress

A diferencia de otras bases de datos relacionales donde no es posible tener varios motores diferentes, en MySQL o MariaDB, su sucesora nacida de la compra de MySQL por parte de Oracle hace ya unos años; podemos usar varios y de hecho podemos tener unas tablas con un motor y otras con otro.

Aunque hay más opciones básicamente se usan dos y cada día más solo uno de ellos, de ahí el motivo de esta entrada.

MyISAM o InnoDB

Sin entrar en detalles técnicos podemos decir que MyISAM es el motor antiguo de base de datos de MySQL. Es un motor de base de datos algo primitivo, porque no permite hacer transacciones de tipo ACID. Y os preguntaréis qué es esto. Pues básicamente para que las transacciones sean ACID debe haber una serie de bloqueos para evitar, por ejemplo, que dos procesos escriban a la vez el mismo dato.

Esto provoca por un lado dos cosas. Lo primero que haya dejado de usarse por defecto y que en sitios donde hay mucha escritura (por ejemplo una tienda online donde se manejan stocks que deberían manejarse de forma ACID siempre) siempre debe usarse InnoDB. Lo segundo, es que por esa falta de “seriedad” el sistema a priori es más rápido haciendo ciertas operaciones, sobre todo de lectura (porque no debe esperarse a que la tabla se desbloquee).

Y digo “a priori más rápido” porque es verdad que InnoDB al ser el motor de base de datos actual de MySQL y MariaDB está en constante desarrollo y mejora. MyISAM no. Por lo que en sus sucesivas mejoras va consiguiendo superar a MariaDB hasta en cosas en las que antiguamente era peor, como la velocidad en ciertas consultas.

InnoDB y MyISAM en WordPress

WordPress cuando se instala en base de datos, podéis ver el detalle de cómo lo hace en la función wp_get_db_schema(), no indica un motor por defecto, así que se usa el que utiliza en la base de datos donde se está instalando. Como WordPress funciona en cualquier caso, pues a priori, esto es algo transparente para vosotros.

¿Qué suele pasar? Pues depende pero por lo general:

  • En instalaciones antiguas de WordPress, en base de datos MySQL que en su día eran anteriores a 5.5, las tablas centrales de WordPress estarán en MyISAM y muchos plugins habrán puesto las suyas en InnoDB
  • En una instalación moderna, todo estará en InnoDB

De todas maneras, puede pasar de todo, hasta que el usuario sea medio consciente de este tema y haya cambiado ya algunas tablas o todas a InnoDB.

Mover tablas de un motor de base de datos a otro es bastante sencillo y no suele dar problemas, pero al ser algo bastante importante y con cierto volúmenes de datos, a veces sí los haya. Así que nada mejor que antes de tocar nada hacer una copia de seguridad de la base de datos.

Cambiar todas las tablas de MyISAM a InnoDB

Si buscáis por la red hay muchas formas de hacerlo, usando por ejemplo phpMyAdmin es bastante sencillo, pero como es una tarea que se me repite, tengo preparado un script que os dejo a continuación. Varios detalles antes de usarlo:

  • Tenéis que subirlo por FTP/SFTP a una carpeta donde sea posible conectarse al servidor, por ejemplo la raíz de WordPress y luego por seguridad, cuando terminéis, eliminarlo.
  • Para ejecutarlo solo tenéis que acceder con el navegador a la ruta. Si le habéis puesto de nombre al fichero “moverinnodb.php” tenéis que acceder a https://misitio.com/moverinnodb.php
  • Este script no es solo para WordPress pero es verdad que como es con lo que trabajo, por eso está aquí, aunque podéis usarlo a cualquier otro sistema que tenga tablas MySQL/MariaDB en MyISAM y tengáis PHP para ejecutarlo.
  • Tenéis que cambiar DB_HOST, DB_USER y DB_PASS por vuestros datos de conexión, recordad que tenéis que encerrar las cadenas con comillas, es decir que debe quedar algo así: mysqli( ‘localhost’, ‘miusuario’, ‘mipassword’, $dbname );
  • En cuanto al nombre de la base de datos lo guardamos arriba en una variable porque luego se usa mucho en el script, así que por eso está arriba, cambiad ‘nombre de la base de datos’ por el que uséis

Aquí tenéis el script y abajo os comento brevemente qué hace.

<?php

$dbname = 'nombre de la base de datos';
$mysqli = @new mysqli( DB_HOST, DB_USER, DB_PASS, $dbname );

if ($mysqli->connect_errno){
	die('No se puede conectar a: ('.$mysqli->connect_errno.') '.$mysqli->connect_error);
}

$results = $mysqli->query('SHOW TABLES');

if ($results === false || $mysqli->connect_errno){
	die('Problemas ejecutando consulta de visualización de tablas: ('.$mysqli->connect_errno.') '.$mysqli->connect_error);
}

while ($row = $results->fetch_assoc()){
	$thisTable = $mysqli->query('SHOW TABLE STATUS WHERE Name = \''.$row['Tables_in_' . $dbname].'\'')->fetch_assoc();
	if ($thisTable['Engine'] === 'MyISAM')
	{
		echo '<b>Cambiando de MyISAM a InnoDB</b> '.$row['Tables_in_' . $dbname].'<br />';
		$mysqli->query('ALTER TABLE '.$row['Tables_in_' . $dbname].' ENGINE = InnoDB');
	}
	
	$mysqli->query('CHECK TABLE '.$row['Tables_in_' . $dbname]);
	$mysqli->query('ANALYZE TABLE '.$row['Tables_in_' . $dbname]);
	$mysqli->query('REPAIR TABLE '.$row['Tables_in_' . $dbname]);
	$mysqli->query('OPTIMIZE TABLE '.$row['Tables_in_' . $dbname]);
}

echo '<br />Hecho.';

Lo que hace, como podéis ver es:

  1. Conectarse a la base de datos
  2. Ejecutar un SHOW TABLES para ver la estructura de las tablas de la base de datos
  3. Iterar por ellas
  4. Si la tabla usa MyISAM le ejecuta un ALTER TABLE para cambiarla a InnoDB
  5. En todos los casos luego: chequea, analiza, repara y optimiza (por si acaso)

Y lo dicho, antes de hacer nada, siempre una copia de seguridad por si acaso.

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (Ninguna valoración todavía)
Cargando…

Almacenamos las IPs desde la que se envían las valoraciones para evitar fraudes

Carrito