Desarrollo y bases de datos

Convertir base de datos MyISAM a InnoDB, cambiando el motor de almacenamiento

Revisado el 5 min de lectura mysql conversion

Una aplicación puede requerir convertir tablas MyISAM a InnoDB. No reemplaces texto globalmente dentro del volcado ni vacíes la base de producción: el cambio debe probarse sobre una copia independiente y conservar el original como reversión.

1. Crear y verificar una copia protegida

Trabaja desde una carpeta privada fuera de public_html, con un nombre de volcado nuevo. Detén temporalmente las escrituras y genera un volcado. La opción -p solicitará la contraseña sin incluirla en el comando:

umask 077
mysqldump --routines --triggers -u USUARIO_MYSQL -p BASE_DE_DATOS > base-antes-innodb.sql &&
test -s base-antes-innodb.sql &&
sha256sum base-antes-innodb.sql > base-antes-innodb.sql.sha256 &&
chmod 400 base-antes-innodb.sql base-antes-innodb.sql.sha256 &&
sha256sum -c base-antes-innodb.sql.sha256

Si mysqldump devuelve un error, no continúes ni consideres válido el archivo parcial. La exportación de rutinas requiere permisos; si falla, revisa qué objetos necesita la aplicación antes de omitirlos. Los eventos, si existen, también deben inventariarse y exportarse con las opciones y permisos adecuados. El checksum detecta cambios posteriores en el archivo, pero no demuestra que la copia esté completa. Los permisos de solo lectura tampoco la hacen inmutable.

Descarga el volcado y su checksum a otro almacenamiento. No modifiques estos ficheros.

2. Restaurar y revisar un clon

Crea una base y un usuario nuevos, restaura la copia y configura allí un clon de la aplicación. Desactiva sus correos, cobros, webhooks y tareas automáticas para no duplicar acciones de producción:

mysql -u USUARIO_NUEVO -p BASE_NUEVA < base-antes-innodb.sql

Previsualiza las tablas MyISAM y su tamaño:

SELECT TABLE_NAME, ENGINE, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'BASE_NUEVA'
  AND ENGINE = 'MyISAM';

Revisa las claves primarias, los índices (incluidos FULLTEXT), los tipos de fila y la compatibilidad de la aplicación con el cambio de motor. Confirma el espacio libre tanto para el clon como para reconstruir sus tablas. La conversión puede bloquear tablas y necesitar espacio adicional.

3. Convertir solo las tablas revisadas

Genera una lista de sentencias exactas, compruébala y ejecuta cada una únicamente en el clon:

SELECT CONCAT('ALTER TABLE `', REPLACE(TABLE_SCHEMA, '`', '``'),
              '`.`', REPLACE(TABLE_NAME, '`', '``'), '` ENGINE=InnoDB;') AS sentencia_a_revisar
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'BASE_NUEVA'
  AND ENGINE = 'MyISAM';

No uses una sustitución global en el .sql: podría alterar datos de usuario, comentarios o configuraciones que contengan la palabra MyISAM.

4. Validar y hacer el cambio

Usa COUNT(*) para recuentos exactos: TABLE_ROWS puede ser una estimación, especialmente después de convertir a InnoDB. Compara el esquema, los índices y el recuento de filas de todas las tablas entre la base original y el clon. Prueba acceso, búsquedas, escritura, tareas programadas y las operaciones críticas de la aplicación.

Solo después de validar el clon, detén de nuevo las escrituras, sincroniza los cambios finales si corresponde y cambia las credenciales de la aplicación para usar BASE_NUEVA. Mantén la base original intacta y sin escrituras durante el periodo de observación.

Reversión

Si alguna comprobación posterior falla, detén las escrituras. Antes de restaurar las credenciales anteriores, identifica y conserva las operaciones recibidas en la base nueva; volver sin conciliarlas perdería esos cambios. Una vez resuelto ese punto, vuelve a la base original. Conserva tanto esa base como el volcado verificado hasta confirmar que la conversión es estable.

Si no puedes disponer de un clon o calcular el espacio necesario, contacta con soporte antes de convertir las tablas.

También te puede ayudar

¿Algo no cuadra o ha cambiado? Cuéntanoslo y lo revisamos.