Cómo cambiar o recuperar la clave de root de MySQL y MariaDB
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
Passwordy pasó a usarauthentication_string. MySQL 8 eliminó además la funciónPASSWORD(). - En MariaDB 10.4 y posteriores,
mysql.useres una vista: las cuentas se guardan enmysql.global_priv, y la vista se puede leer pero no modificar. ALTER USERes la forma soportada en los dos motores, y el cambio vale en el momento, sinFLUSH 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 BYreemplaza 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
-pen la línea de comandos, porque queda en el historial de la consola. Con-psolo, 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- Ya adentro, corré
FLUSH PRIVILEGES;. En este modo el motor rechazaALTER USERhasta recargar las tablas de usuarios, y eso es lo que hace ese comando. - Cambiá la clave con el
ALTER USERde arriba, en cualquiera de sus dos formas, y salí conexit. - Borrá la variable y reiniciá normal:
systemctl unset-environment MYSQLD_OPTSy despuéssystemctl restart mariadb. En ese orden: si reiniciás antes, la base vuelve a arrancar sin control de accesos. - 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- Reiniciá el servicio para que lo tome:
systemctl restart mysqlen Ubuntu,systemctl restart mysqlden AlmaLinux. - Entrá con
mysql, corréFLUSH PRIVILEGES;y después elALTER USER. - Borrá el archivo y reiniciá otra vez el servicio. Mientras el archivo exista, la base acepta a cualquiera que entre desde el servidor.
- 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
Cómo cambiar o recuperar la clave de root de tu servidor
Cambiá la clave de root con passwd o, si la perdiste, recuperala desde la consola de rescate y el menú de GRUB en Debian, Ubuntu y AlmaLinux, sin reinstalar.
Cómo importar una base de datos MySQL grande por consola
Cuando phpMyAdmin corta la subida: cómo llevar el volcado al servidor, crear la base e importarla por consola, comprimida y con avance, y los errores comunes.
Cómo conectarte por SSH a tu servidor Linux desde Windows
Con la terminal que ya trae Windows 10 y 11, sin instalar nada: la primera conexión, las claves SSH, PuTTY como alternativa y qué hacer si no conecta.