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.

Compartí este artículo