Migrar a MySQL 8.0 no es solo cambiar de versión. El salto toca compatibilidad, comportamiento del optimizador, collations, autenticación y expectativas de aplicaciones. El error fundamental radica en asumir compatibilidad solo porque el esquema importa correctamente.

Qué suele romper primero

Cambio de plugin de autenticación

MySQL 8.0 usa caching_sha2_password por defecto, reemplazando mysql_native_password. Drivers antiguos (PHP < 7.4, conectores JDBC viejos) no soportan el nuevo método y fallan con errores crípticos.

-- Verificar plugin de usuario existente
SELECT user, plugin FROM mysql.user WHERE user NOT IN ('mysql.sys','mysql.session','mysql.infoschema');

-- Crear usuario compatible con drivers antiguos
CREATE USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
-- O cambiar plugin de usuario existente:
ALTER USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Collations: el problema silencioso

utf8mb4_0900_ai_ci reemplaza utf8mb4_unicode_ci como collation por defecto. Esto causa errores de comparación en JOINs entre tablas con collations distintos. La solución es normalizar todo a utf8mb4_unicode_ci explícitamente.

Checklist pre-migración

  1. Inventario de objetos: tablas, vistas, procedimientos, triggers, funciones
  2. Validación con mysqlcheck --all-databases --check --auto-repair
  3. Dump completo con --routines --triggers --events antes de cualquier cambio
  4. Probar restauración del dump en instancia limpia de 8.0
  5. Ejecutar el Upgrade Checker disponible desde MySQL 5.7.14

Conclusión

La validación no termina con el arranque del servicio. Requiere pruebas funcionales reales, comparación de planes de ejecución del optimizador y un rollback probado antes de declarar la migración exitosa.