Cómo cambiar o recuperar la clave de root de MySQL y MariaDB

· 5 min de lectura · por el equipo técnico de VPS Argentina

Si ya entrás como root a la base, la clave se cambia con ALTER USER 'root'@'localhost' IDENTIFIED BY 'clave-nueva';, que funciona en MySQL 8 y en MariaDB. El viejo UPDATE user SET password=PASSWORD(...) ya no anda en ninguno de los dos. En Debian y Ubuntu, MariaDB deja entrar al root del sistema por el socket, sin clave: escribís mysql y estás adentro. Si perdiste la clave, arrancás el motor con --skip-grant-tables --skip-networking, corrés FLUSH PRIVILEGES; y el ALTER USER, y lo volvés a arrancar normal. Si el VPS tiene DirectAdmin, el superusuario es da_admin y conviene hacerlo por ticket.

Por qué el método viejo ya no funciona

Muchas guías todavía cambian la clave editando la tabla de usuarios con UPDATE user SET password=PASSWORD('...'). Eso dejó de funcionar hace varias versiones:

  • MySQL 5.7 dejó de guardar la clave en la columna Password y pasó a usar authentication_string. MySQL 8 eliminó además la función PASSWORD().
  • En MariaDB 10.4 y posteriores, mysql.user es una vista: las cuentas se guardan en mysql.global_priv, y la vista se puede leer pero no modificar.
  • ALTER USER es la forma soportada en los dos motores, y el cambio vale en el momento, sin FLUSH PRIVILEGES.

En Debian y Ubuntu, root entra sin clave

En Debian y Ubuntu, MariaDB 10.4 o posterior crea la cuenta root de la base atada al root del sistema: se valida por el socket local, sin contraseña. Si estás como root en la consola, escribís mysql y entrás. MySQL 8 en Ubuntu hace lo mismo con su complemento auth_socket.

Para ver cómo entra tu root, corré SHOW CREATE USER 'root'@'localhost';. Si aparece unix_socket o auth_socket, no hay clave que recuperar: entrás desde el root del sistema, o con sudo mysql desde tu usuario.

Para administrar, eso alcanza, y no hay una clave que se pueda adivinar ni filtrar. Si una aplicación necesita conectarse con usuario y clave, creale un usuario propio en lugar de darle root.

Cambiar la clave si ya entrás

Entrá con mysql, o con mysql -u root -p si tu root ya usa clave, y corré:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'una-clave-larga-y-nueva';
  • Desde ese momento, root entra con mysql -u root -p, también donde antes entraba por socket: en MySQL y en MariaDB, IDENTIFIED BY reemplaza ese acceso por la clave.
  • En MariaDB podés conservar los dos caminos, el socket para el root del sistema y la clave para lo demás: ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket OR mysql_native_password USING PASSWORD('una-clave-larga-y-nueva');.
  • No escribas la clave pegada al -p en la línea de comandos, porque queda en el historial de la consola. Con -p solo, te la pide.

Si perdiste la clave, en MariaDB

Sin la clave, hay que arrancar el motor sin control de accesos, cambiarla y volver a arrancarlo normal. --skip-grant-tables desactiva la verificación de usuarios, y --skip-networking cierra el acceso por red mientras tanto, para que solo se pueda entrar desde el propio servidor. Los sitios que usan la base se cortan durante los reinicios.

La unidad de systemd de MariaDB toma opciones extra de la variable MYSQLD_OPTS, y systemctl set-environment la define sin tocar ningún archivo:

systemctl stop mariadb
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
systemctl start mariadb
mysql
  1. Ya adentro, corré FLUSH PRIVILEGES;. En este modo el motor rechaza ALTER USER hasta recargar las tablas de usuarios, y eso es lo que hace ese comando.
  2. Cambiá la clave con el ALTER USER de arriba, en cualquiera de sus dos formas, y salí con exit.
  3. Borrá la variable y reiniciá normal: systemctl unset-environment MYSQLD_OPTS y después systemctl restart mariadb. En ese orden: si reiniciás antes, la base vuelve a arrancar sin control de accesos.
  4. Probá la clave nueva con mysql -u root -p.

Si perdiste la clave, en MySQL 8

El servicio de MySQL que trae Ubuntu no lee MYSQLD_OPTS. Por eso, las mismas dos opciones van en un archivo de configuración temporal, que funciona igual en AlmaLinux: /etc/mysql/conf.d/reset.cnf en Ubuntu y /etc/my.cnf.d/reset.cnf en AlmaLinux, con este contenido:

[mysqld]
skip-grant-tables
skip-networking
  1. Reiniciá el servicio para que lo tome: systemctl restart mysql en Ubuntu, systemctl restart mysqld en AlmaLinux.
  2. Entrá con mysql, corré FLUSH PRIVILEGES; y después el ALTER USER.
  3. Borrá el archivo y reiniciá otra vez el servicio. Mientras el archivo exista, la base acepta a cualquiera que entre desde el servidor.
  4. Probá la clave nueva con mysql -u root -p.

Preguntas frecuentes

¿Cómo sé si tengo MySQL o MariaDB?

Con mysql --version: si es MariaDB, el nombre aparece en la versión. Importa saberlo porque cambia la forma de recuperar la clave.

¿Por qué me da Access denied si la clave es correcta?

Si root entra por socket, solo lo acepta desde el root del sistema: desde otro usuario, usá sudo mysql. Y si le pusiste clave, entrá con mysql -u root -p; sin el -p, el cliente no la manda.

¿Conviene que mis aplicaciones usen root?

No. Creá un usuario por aplicación, con permisos solo sobre su base: CREATE USER 'juan'@'localhost' IDENTIFIED BY 'otra-clave-larga'; y GRANT ALL PRIVILEGES ON tienda.* TO 'juan'@'localhost';. Si esa clave se filtra, el daño queda limitado a esa base.

¿Y en el hosting?

En el hosting no hay root de la base: cada base tiene sus usuarios, y sus claves se cambian desde DirectAdmin, en la sección de MySQL. Después actualizá la clave en la configuración de tu sitio, por ejemplo en el wp-config.php de WordPress.

Seguí leyendo