Este artículo explica cómo resetear la clave del usuario 'debian-sys-maint' de administración de un servidor de bases de datos MySQL o MariaDB en Debian y derivados (Ubuntu Server, Devuan, y otros).
Luego de migrar un servidor desde Debian Buster a Debian Beowulf, me encontré con el siguiente error al intentar recargar la configuración del servicio de bases de datos MariaDB:
root@linuxito:~# service mysql reload [....] Reloading MariaDB database server: mysqld/usr/bin/mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: NO)'
No se puede conectar al servidor de bases de datos. Lo mismo ocurre al intentar reiniciar el servicio:
root@linuxito:/etc/mysql/conf.d# service mysql restart [FAIL] Stopping MariaDB database server: mysqld failed! [ ok ] Starting MariaDB database server: mysqld already running.
El error lo detecté originalmente al fallar el cronjob de logrotate y recibir el siguiente correo:
/etc/cron.daily/logrotate: mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: NO)' error: error running shared postrotate script for '/var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log /var/log/mysql/mariadb-slow.log /var/log/mysql/error.log ' run-parts: /etc/cron.daily/logrotate exited with return code 1
De acuerdo a la salida de mi script mysqlgrants
, el usuario "debian-sys-maint" tenía una contraseña configurada:
root@linuxito:~/scripts# ./mysqlgrants -u root -p | grep debian-sys-maint Enter password: GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY PASSWORD xxxx
El problema era que se perdió la configuración de los scripts de Debian (usuario y contraseña) en el archivo /etc/mysql/debian.cnf
:
# Automatically generated for Debian scripts. DO NOT TOUCH! [client] host = localhost user = root password = socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] host = localhost user = root password = socket = /var/run/mysqld/mysqld.sock basedir = /usr
Se observa que tanto para el cliente como para las actualizaciones, figura "root" sin contraseña.
Para solucionar esto es necesario resetear la contraseña del usuario "debian-sys-maint". Conetarse al servidor de bases de datos como "root" (de MySQL):
root@linuxito:~/scripts# mysql -u root -p
Setear una nueva contraseña, por ejemplo "abc123", ejecutar flush privileges
, y cerrar el cliente:
MariaDB [(none)]> SET PASSWORD FOR 'debian-sys-maint'@'localhost' = PASSWORD('abc123'); Query OK, 0 rows affected (0.012 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.000 sec) MariaDB [(none)]> quit Bye
Luego editar la configuración de Debian y definir el usuario "debian-sys-maint" y la contraseña creada en el paso anterior:
root@linuxito:~/scripts# nano /etc/mysql/debian.cnf
Debe quedar así:
# Automatically generated for Debian scripts. DO NOT TOUCH! [client] host = localhost user = debian-sys-maint password = abc123 socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] host = localhost user = debian-sys-maint password = abc123 socket = /var/run/mysqld/mysqld.sock basedir = /usr
Eso es todo.