Cambiar la contraseña de usuario en MySQL: comandos ALTER USER (MySQL 5.7 / 8.0) + recuperación del root

目次

1. [Quick Answer] Lista de comandos para cambiar la contraseña de usuarios MySQL (solución más rápida)

El comando básico para cambiar la contraseña de un usuario en MySQL es ALTER USER.
Este método se recomienda en MySQL 5.7 y versiones posteriores, y se utiliza de la misma forma en MySQL 8.0.

1.1 Sintaxis básica (la más utilizada)

ALTER USER 'username'@'localhost' IDENTIFIED BY 'newpassword';
  • username : el nombre de usuario objetivo a actualizar
  • localhost : el host del cliente (una cuenta MySQL se identifica por “nombre de usuario + host”)
  • newpassword : la nueva contraseña

Después de la ejecución, el cambio tiene efecto inmediato. En la mayoría de los casos, no es necesario FLUSH PRIVILEGES; (ALTER USER actualiza automáticamente las tablas de privilegios).

Errores comunes

  • Incluso con el mismo nombre de usuario, @'localhost' y @'%' se tratan como cuentas diferentes
  • Los símbolos en las contraseñas deben estar entre comillas simples

1.2 Cambiar un usuario de acceso remoto (%)

ALTER USER 'username'@'%' IDENTIFIED BY 'newpassword';

% significa “cualquier host”.
Se usa comúnmente en entornos de nube o para usuarios que pueden conectarse desde el exterior.

Notas

  • Es más seguro verificar previamente con SELECT User, Host FROM mysql.user;
  • Si cambias la contraseña del Host incorrecto, no podrás iniciar sesión

1.3 Cambiar la contraseña especificando el plugin de autenticación (importante en 8.0)

En MySQL 8.0, el plugin de autenticación predeterminado es caching_sha2_password.
Si no puedes conectarte con clientes antiguos, establece explícitamente el plugin.

ALTER USER 'username'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'newpassword';
  • mysql_native_password : método heredado (prioriza la compatibilidad)
  • caching_sha2_password : estándar de MySQL 8.0 (recomendado)

Errores típicos

  • PHP u otros clientes antiguos pueden no soportar el plugin predeterminado de MySQL 8.0
  • Decidir “No puedo iniciar sesión” sin verificar el plugin de autenticación

1.4 Si recibes un error de privilegios

Ejemplo de error:

ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s)

En este caso, el usuario actualmente conectado no tiene permiso para realizar el cambio.

Verifica:

SHOW GRANTS FOR CURRENT_USER();

Ejecuta el comando como root o como un usuario con privilegios suficientes.

1.5 Cómo verificar después de cambiar

SELECT User, Host, plugin FROM mysql.user WHERE User='username';
  • Verifica el plugin de autenticación mediante la columna plugin
  • La verificación más fiable es iniciar sesión realmente y confirmar la conectividad

1.6 Qué ocurre con las sesiones existentes

Después de cambiar una contraseña:

  • Las nuevas conexiones deben usar la nueva contraseña
  • Las sesiones existentes pueden terminarse inmediatamente según el entorno
  • En producción, se recomienda realizar los cambios fuera del horario laboral

2. Conceptos básicos de usuarios y hosts en MySQL (prevenir problemas comunes de “atasco”)

En MySQL, un usuario no se identifica solo por un “nombre de usuario”. En su lugar, se identifica por la combinación de “nombre de usuario + host del cliente (Host)”.
Si no comprendes esto, puedes encontrarte con el problema clásico: “Cambié la contraseña pero aún no puedo iniciar sesión.”

2.1 Un usuario es un par “usuario@host”

Ejemplos:

  • 'appuser'@'localhost'
  • 'appuser'@'%'
  • 'appuser'@'192.168.1.%'

Estos son todos tratados como cuentas diferentes.
Así que aunque cambies la contraseña para localhost, no afecta a la cuenta %.

Comando de verificación:

SELECT User, Host FROM mysql.user ORDER BY User, Host;

Errores comunes

  • No darse cuenta de que existen múltiples cuentas con el mismo nombre de usuario
  • Cambiaste la contraseña para localhost, pero en realidad te estás conectando vía TCP (127.0.0.1)

2.2 localhost y 127.0.0.1 se tratan de forma diferente

En MySQL:

  • localhost → conexión por socket UNIX (conexión interna local)
  • 127.0.0.1 → conexión TCP/IP

Dependiendo del entorno, puede coincidir una cuenta diferente.

Verifica:

mysql -u username -p -h 127.0.0.1

If you can’t log in with the above, the @'127.0.0.1' account may not exist.

2.3 Verificar el usuario autenticado actualmente

Es importante entender “con qué cuenta estás autenticado”.

SELECT CURRENT_USER();

Esto muestra el “user@host” que realmente está autenticado.

SELECT USER(); muestra la información de la solicitud de conexión, por lo que puede no coincidir.

2.4 Verificar privilegios (SHOW GRANTS)

Si no puedes cambiar una contraseña, la causa puede ser privilegios insuficientes.

SHOW GRANTS FOR 'username'@'host';

O para el usuario que ha iniciado sesión actualmente:

SHOW GRANTS FOR CURRENT_USER();

Privilegios mínimos requeridos

  • ALTER USER
  • O SYSTEM_USER (MySQL 8.0 y posteriores)

2.5 Patrones típicos de fallos

  1. Cambiaste la contraseña para el Host incorrecto
  2. El plugin de autenticación difiere (muy común en 8.0)
  3. La cuenta objetivo no existe en primer lugar

Verifica si el usuario existe:

SELECT User, Host FROM mysql.user WHERE User='username';

Una vez que comprendas este modelo, podrás evitar la mayoría de los problemas relacionados con el cambio de contraseña.

3. Procedimiento recomendado: Cambiar de forma segura con ALTER USER (Funciona para MySQL 8.0 / 5.7)

En MySQL 5.7 y posteriores, cambiar contraseñas con ALTER USER es el método estándar y recomendado.
Actualizaciones directas como UPDATE mysql.user pueden comportarse de manera diferente según la versión y conllevan riesgos de compatibilidad futura, por lo que es mejor evitarlas.

3.1 Verificaciones previas (Siempre confirmar antes de cambiar)

Antes de cambiar una contraseña, confirma estos tres puntos.

① Confirmar el usuario y Host objetivo

SELECT User, Host FROM mysql.user WHERE User='username';
  • Verificar si existen varias cuentas con el mismo nombre de usuario
  • No confundas localhost con %

② Confirmar el plugin de autenticación actual (importante en 8.0)

SELECT User, Host, plugin
FROM mysql.user
WHERE User='username';
  • caching_sha2_password (estándar MySQL 8.0)
  • mysql_native_password (plugin heredado)

Algunas fallas de conexión son causadas por el plugin de autenticación.

③ Confirmar el usuario autenticado actualmente

SELECT CURRENT_USER();

Para evitar errores de privilegios, ejecuta los comandos como root o como un usuario con los privilegios adecuados.

3.2 Ejecutar ALTER USER (forma estándar)

ALTER USER 'username'@'localhost'
IDENTIFIED BY 'NewStrongPassword123!';

El cambio tiene efecto inmediato.
En la mayoría de los casos, no se requiere FLUSH PRIVILEGES;.

Notas

  • Si se viola la política de contraseñas (validate_password), puede aparecer ERROR 1819
  • Si la contraseña incluye caracteres especiales, siempre encierra la cadena entre comillas simples

3.3 Cambiar especificando el plugin de autenticación (solo si es necesario)

Si estás usando clientes antiguos en un entorno MySQL 8.0:

ALTER USER 'username'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'NewStrongPassword123!';

Casos en los que deberías cambiarlo:

  • No se puede conectar con clientes PHP antiguos / MySQL antiguos
  • Un entorno que no soporta caching_sha2_password

Casos en los que NO deberías cambiarlo:

  • Si ya puedes conectar sin problemas en un entorno moderno (el plugin estándar es más seguro)

3.4 Verificación después del cambio

① Verificar el plugin de autenticación

SELECT User, Host, plugin
FROM mysql.user
WHERE User='username';

② Verificar iniciando sesión realmente

mysql -u username -p

Siempre prueba que puedes iniciar sesión.

3.5 Impacto en sesiones existentes

Después de cambiar una contraseña:

  • Nuevas conexiones → deben usar la nueva contraseña
  • Conexiones existentes → pueden permanecer según el entorno
  • Producción → puede ser necesario reiniciar la conexión de la aplicación

Errores comunes

  • No actualizar las credenciales de conexión de la aplicación
  • Contraseñas antiguas que siguen presentes en archivos de configuración

3.6 Consejos operacionales seguros para producción

  • Realice los cambios fuera del horario laboral
  • Revise los archivos de configuración de la aplicación con anticipación
  • Realice el trabajo sin desconectar su sesión SSH
  • Al cambiar root, asegúrese de tener un método de recuperación listo

4. Diferencias entre MySQL 8.0 y 5.7

La mayor causa de problemas al cambiar contraseñas de MySQL es la diferencia en los métodos de autenticación entre MySQL 8.0 y 5.7.
En particular, muchos casos de “Lo cambié pero no puedo iniciar sesión” son causados por diferencias en el plugin de autenticación.

Diagram showing the difference between MySQL 5.7 mysql_native_password and MySQL 8.0 caching_sha2_password authentication methods

Diferencia de autenticación entre MySQL 5.7 y MySQL 8.0

4.1 Diferencias en el plugin de autenticación predeterminado

VersionDefault authentication plugin
MySQL 5.7mysql_native_password
MySQL 8.0caching_sha2_password

En MySQL 8.0, caching_sha2_password se convirtió en el estándar para una mayor seguridad.
Sin embargo, los clientes más antiguos (versiones antiguas de PHP, conectores MySQL antiguos, etc.) pueden no soportarlo.

Cómo comprobar:

SELECT User, Host, plugin
FROM mysql.user
WHERE User='username';

Problemas comunes

  • Los clientes antiguos no pueden conectarse a usuarios creados en MySQL 8.0
  • Incluso si ocurre un error, no se percibe que la causa raíz es el plugin de autenticación

4.2 Cómo cambiar el plugin de autenticación para compatibilidad

Solo cuando necesite conectarse desde un entorno antiguo, cámbielo de la siguiente manera:

ALTER USER 'username'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'NewStrongPassword123!';

Después de cambiarlo, siempre ejecute una prueba de conexión.

Notas

  • Desde el punto de vista de la seguridad, caching_sha2_password es más seguro
  • No cambie al plugin heredado innecesariamente
  • Si es posible, actualizar el lado del cliente es preferible

4.3 UPDATE directo no es recomendable

En MySQL 5.7 y versiones anteriores, se utilizaban métodos como el siguiente:

UPDATE mysql.user
SET authentication_string=PASSWORD('newpassword')
WHERE User='username';
FLUSH PRIVILEGES;

Sin embargo, este enfoque es:

  • Altamente dependiente de la versión
  • Sujeto a cambios de especificación en 8.0
  • Probablemente obsoleto en el futuro

Regla general: usar ALTER USER

4.4 Diferencias de comportamiento del plugin validate_password

En MySQL 5.7 y 8.0, las funciones de política de contraseñas (verificación de fortaleza) están disponibles por defecto.

Verifique:

SHOW VARIABLES LIKE 'validate_password%';

Si viola la política, puede obtener:

ERROR 1819 (HY000)

.

Porque muchos entornos 8.0 imponen bases de seguridad más estrictas, después de actualizar desde 5.7, puede descubrir que los cambios de contraseña ya no pasan debido a requisitos de política más estrictos.

4.5 Cómo comprobar su versión

Si no está seguro de qué versión está ejecutando:

SELECT VERSION();

Si aplica correcciones sin confirmar la versión, podría terminar usando el método incorrecto

5. Recuperar una contraseña root olvidada (Procedimiento centrado en la seguridad)

Si olvida la contraseña del usuario root de MySQL (administrador), no podrá iniciar sesión normalmente. En este caso, debe desactivar temporalmente las tablas de privilegios y restablecer la contraseña. Sin embargo, este procedimiento conlleva riesgos de seguridad, así que siga los pasos con cuidado.

5.1 Confirmar si realmente necesita la contraseña root

Primero, verifique lo siguiente:

  • Si tiene privilegios de sudo a nivel del SO
  • Si la autenticación auth_socket está habilitada (común en sistemas basados en Ubuntu)

Ejemplo de verificación:

SELECT User, Host, plugin
FROM mysql.user
WHERE User='root';

Si el plugin es auth_socket, podría iniciar sesión como usuario root del SO.

sudo mysql

Si esto funciona, solo necesita restablecer la contraseña.

5.2 Flujo de recuperación (procedimiento general)

① Detener el servidor MySQL

sudo systemctl stop mysql

② Iniciar con las tablas de privilegios deshabilitadas

sudo mysqld_safe --skip-grant-tables &

--skip-grant-tables deshabilita la autenticación. En este estado, cualquiera puede conectarse, así que complete el procedimiento rápidamente.

③ Conectarse a MySQL

mysql -u root

Puede conectarse sin contraseña.

④ Restablecer la contraseña root (método recomendado)

ALTER USER 'root'@'localhost'
IDENTIFIED BY 'NewStrongPassword123!';

Importante

  • No use directamente UPDATE mysql.user
  • Use ALTER USER (para compatibilidad de versiones)

⑤ Reactivar las tablas de privilegios

FLUSH PRIVILEGES;

⑥ Reiniciar MySQL en modo normal

sudo systemctl restart mysql

Luego verifique el inicio de sesión normal:

mysql -u root -p

5.3 Errores comunes

  • Dejar habilitado --skip-grant-tables (riesgo grave de seguridad)
  • Cambiar accidentalmente el Host del root
  • Modificar incorrectamente el plugin de autenticación y bloquearse a sí mismo

5.4 Notas para entornos de producción

  • Siempre realícelo durante una ventana de mantenimiento en servidores públicos
  • Mantenga su sesión SSH activa mientras trabaja
  • Cree una copia de seguridad con antelación si es posible

La recuperación de la contraseña de root puede realizarse de forma segura si se ejecuta con cuidado.

6. Errores comunes y soluciones (Captura de tráfico por mensaje de error)

Se presentan varios errores típicos al cambiar contraseñas de MySQL.
A continuación, organizamos causas comunes y soluciones según los códigos de error más buscados.

6.1 ERROR 1819 (La contraseña no cumple con los requisitos de política)

Ejemplo de error:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

Causa

La contraseña no pasó la validación de fortaleza impuesta por el plugin validate_password.

Verificar la política actual

SHOW VARIABLES LIKE 'validate_password%';

Configuraciones importantes:

  • validate_password.length
  • validate_password.policy
  • validate_password.mixed_case_count
  • validate_password.number_count
  • validate_password.special_char_count

Solución ① (Recomendado): Usar una contraseña más fuerte

  • Al menos 12 caracteres
  • Incluir mayúsculas, minúsculas, números y símbolos
  • Evitar palabras del diccionario

Solución ② (Relajar la política temporalmente)

SET GLOBAL validate_password.policy = LOW;

Después de completar su tarea, se recomienda restaurar la configuración original.

Errores comunes

  • Dejar la política relajada en producción
  • Pasar por alto que cambiar esta configuración requiere privilegios SUPER

6.2 ERROR 1227 (Privilegios insuficientes)

Ejemplo de error:

ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s)

Causa

El usuario actual no posee el privilegio ALTER USER o SYSTEM_USER.

Verificar privilegios

SHOW GRANTS FOR CURRENT_USER();

Solución

Ejecute el comando como root o como un usuario con privilegios suficientes.

Si es necesario:

GRANT ALTER USER ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;

Nota

  • En MySQL 8.0, también puede requerirse el privilegio SYSTEM_USER
  • Siga el principio de menor privilegio en producción

6.3 No se puede iniciar sesión después de cambiar la contraseña

Causas principales

  1. Host incorrecto
  2. Incompatibilidad del plugin de autenticación
  3. Incompatibilidad del cliente
  4. Configuración de la aplicación no actualizada

① Verificar Host

SELECT User, Host FROM mysql.user WHERE User='username';

② Verificar plugin de autenticación

SELECT plugin FROM mysql.user WHERE User='username';

③ Cambiar plugin de autenticación (si es necesario)

ALTER USER 'username'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'NewStrongPassword123!';

④ Verificar configuración de la aplicación

  • .env
  • config.php
  • Cadena de conexión (DSN)

Errores comunes

  • Cambiar MySQL sin actualizar la aplicación
  • No reiniciar contenedores en entornos Docker

6.4 Aún es posible iniciar sesión con la contraseña antigua después del cambio

Normalmente, los cambios realizados con ALTER USER entran en vigor de inmediato.

Posibles causas:

  • En realidad cambió una cuenta de Host diferente
  • La conexión apunta a otro servidor (réplica)
  • Caché de sesión

Verifique:

SELECT CURRENT_USER();

Es fundamental confirmar con precisión tanto el servidor al que está conectado como el usuario autenticado.

7. Operaciones de Seguridad: Políticas de Contraseñas y Mejores Prácticas

Cambiar una contraseña no es una tarea única.
En las operaciones del mundo real, se mantiene la seguridad combinando imposición de fortaleza, diseño de privilegios y reglas operativas.

7.1 Uso del plugin validate_password

MySQL proporciona funcionalidad integrada para imponer la fortaleza de las contraseñas.

Verificar configuraciones actuales

SHOW VARIABLES LIKE 'validate_password%';

Parámetros de configuración principales

  • validate_password.length (longitud mínima)
  • validate_password.policy (BAJO / MEDIO / FUERTE)
  • validate_password.mixed_case_count
  • validate_password.number_count
  • validate_password.special_char_count

Configuración de ejemplo (mínimo 12 caracteres, política MEDIUM)

SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.policy = MEDIUM;

Nota

  • Los cambios GLOBAL pueden restablecerse después de un reinicio
  • Para que las configuraciones persistan, configúrelas en el archivo de configuración ( my.cnf / my.ini )

7.2 Requisitos mínimos para contraseñas fuertes

Estándares recomendados en la práctica:

  • Al menos 12 caracteres
  • Incluir mayúsculas, minúsculas, números y símbolos
  • Evitar palabras del diccionario
  • No reutilizar en otros servicios

Ejemplo:

X9v!pQ4z#Lm2

Ejemplos a evitar

password123
mysql2025
companyname!

7.3 Más importante que los cambios periódicos

Más importante que “cambiar cada seis meses” es diseñar bajo la suposición de fuga potencial de credenciales.

① Separar usuarios de aplicaciones

  • No usar root en aplicaciones
  • Crear usuarios con privilegios mínimos

Ejemplo:

GRANT SELECT, INSERT, UPDATE ON dbname.* TO 'appuser'@'localhost';

② Minimizar privilegios (Principio de Privilegios Mínimos)

Permitir solo las operaciones necesarias para limitar el daño potencial.

③ Usar auditoría y registros

Ejemplo de verificación de registro:

tail -f /var/log/mysql/mysql.log

MySQL Enterprise también soporta plugins de auditoría.

7.4 Consejos operativos para entornos de producción

  • Probar en staging antes de hacer cambios en producción
  • Rastrear historial de cambios (Git o documentación)
  • Siempre ejecutar una prueba de conexión después de los cambios
  • Mantener la sesión SSH activa mientras se trabaja

7.5 Cosas que nunca se deben hacer

  • Usar la cuenta root en aplicaciones
  • Codificar contraseñas de forma fija en el código fuente
  • Desactivar validate_password y dejarlo así
  • Dejar el servidor ejecutándose con --skip-grant-tables

La gestión de contraseñas no es una tarea única, sino parte del diseño operativo continuo.

8. Preguntas Frecuentes (FAQ)

8.1 P. ¿Qué sucede con las sesiones activas después de cambiar una contraseña?

R. En principio, las nuevas conexiones requieren la nueva contraseña.
Para las sesiones existentes, pueden terminarse inmediatamente o permanecer activas dependiendo del entorno y la configuración.

En la práctica:

  • Realizar cambios fuera del horario laboral en producción
  • Reiniciar la aplicación para actualizar las conexiones

se recomienda.

8.2 P. Cambié la contraseña pero aún no puedo iniciar sesión

Las tres causas más comunes son:

  1. Host incorrecto ( localhost vs % , etc.)
  2. Desajuste del plugin de autenticación (muy común en 8.0)
  3. Configuración de la aplicación no actualizada

Verificar con:

SELECT User, Host, plugin
FROM mysql.user
WHERE User='username';

Prestar especial atención a la columna plugin.

8.3 P. ¿Puedo permitir que solo un usuario específico cambie contraseñas?

Sí.

GRANT ALTER USER ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;

En MySQL 8.0, también puede requerirse el privilegio SYSTEM_USER.

SHOW GRANTS FOR 'username'@'host';

Usar esto para verificar privilegios.

8.4 P. ¿Es el método el mismo en MariaDB?

Básicamente, ALTER USER está disponible, pero:

  • Plugins de autenticación
  • Comportamiento de la política de contraseñas
  • Diferencias específicas de la versión

pueden diferir dependiendo del entorno.

Verificar con:

SELECT VERSION();

MySQL Community Edition no proporciona seguimiento de historial de contraseñas incorporado de forma predeterminada.

8.5 Q. ¿Puedo verificar el historial de cambios de contraseña?

Enfoques posibles:

  • Habilitar registro de auditoría
  • Utilizar gestión de registros externa
  • Registrar el historial en la documentación operativa

Ejemplo:

tail -f /var/log/mysql/mysql.log

8.6 Q. ¿Puedo recuperar usuarios que no son root con –skip-grant-tables?

Sí, pero crea un estado altamente peligroso.
Siempre vuelva al modo normal inmediatamente después de completar el procedimiento.

9. Resumen

Cambiar una contraseña de MySQL puede parecer simple, pero sin comprender el modelo user@host, los complementos de autenticación y el diseño de privilegios, puede generar problemas fácilmente.

Los puntos clave de este artículo son:

9.1 Use ALTER USER como método estándar

ALTER USER 'username'@'localhost'
IDENTIFIED BY 'NewStrongPassword123!';
  • Método estándar en MySQL 5.7 y posteriores
  • No se recomienda UPDATE mysql.user directo
  • FLUSH PRIVILEGES suele ser innecesario

9.2 Los usuarios se gestionan como “user@host”

  • localhost y % son cuentas diferentes
  • Pueden existir varias cuentas con el mismo nombre de usuario
  • Verifique con SELECT User, Host FROM mysql.user;

9.3 Preste atención a los complementos de autenticación en 8.0

  • Predeterminado en 8.0: caching_sha2_password
  • Compatibilidad heredada: mysql_native_password
  • Si no puede conectarse, revise la columna plugin
    SELECT plugin FROM mysql.user WHERE User='username';
    

9.4 Tenga cuidado al recuperar la contraseña root

  • --skip-grant-tables es solo una medida temporal
  • Siempre vuelva al modo normal después de terminar
  • Realícelo durante una ventana de mantenimiento en producción

9.5 La mayoría de los errores tienen causas claras

  • ERROR 1819 → Violación de la política de contraseñas
  • ERROR 1227 → Privilegios insuficientes
  • No se puede iniciar sesión → Desajuste de host o de complemento de autenticación

9.6 En la práctica, el principio de menor privilegio y el diseño operativo son lo más importante

  • No use root en aplicaciones
  • Cree usuarios dedicados
  • Implemente políticas de contraseñas fuertes
  • Siempre pruebe las conexiones después de los cambios

La gestión de contraseñas en MySQL no se trata solo de cambiar un valor; es la base de operaciones seguras en bases de datos.
Elija el método apropiado para su entorno y ejecútelo con cuidado.