No se puede restablecer la contraseña de root de MySQL (MariaDB)

35

Hoy, quería crear una base de datos en PMA. Decía: "No se puede iniciar sesión en el servidor MySQL". Intenté a través de una terminal, el mismo problema, y ​​es porque mi contraseña es incorrecta. Y no puedo entender por qué.

Intenté el método habitual para restablecer la contraseña de root (omitir el montaje de tablas de concesión y restablecer el passord) pero parece que no funciona.

Mira eso:

morgan@rakija:~$ sudo mysqld_safe --skip-grant-tables &
[1] 14016
morgan@rakija:~$ 150802 19:07:25 mysqld_safe Can't log to error log and syslog at the same time.  Remove all --log-error configuration options for --syslog to take effect.
150802 19:07:25 mysqld_safe Logging to '/var/log/mysql/error.log'.
150802 19:07:25 mysqld_safe A mysqld process already exists

[1]+  Terminé 1               sudo mysqld_safe --skip-grant-tables
morgan@rakija:~$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.0.20-MariaDB-0ubuntu0.15.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> update user set password=PASSWORD("newPass") where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
morgan@rakija:~$ sudo service mysql restart
morgan@rakija:~$ mysql -uroot -pnewPass
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Morgan Touverey Quilling
fuente

Respuestas:

56

He encontrado una solución tan extraña como el problema en sí.

Reinicie MySQL / MariaDB usando --skip-grant-tables(busque tutoriales en la web). (no es necesario en absoluto, lea mis ediciones al final de la publicación)

Mira el plugincampo en la mysql.usertabla:

MariaDB [mysql]> SELECT user, plugin FROM user;
+------+-------------+
| user | plugin      |
+------+-------------+
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
+------+-------------+

Tuve que restablecer el campo del complemento de cada entrada a una cadena en blanco.

UPDATE user SET plugin="";   // without WHERE clause

Además, asegúrese de que se haya definido una contraseña, porque a veces parece borrada (seleccione en los user, passwordcampos). Si no, actualícelo con:

UPDATE user SET password=PASSWORD("my_password") WHERE user="root";

Los parámetros de privilegios deben guardarse explícitamente:

FLUSH PRIVILEGES;

Luego, reinicie MySQL en modo normal y debería poder conectarse a la cuenta raíz.

Esto no necesariamente deshabilitará la conexión a través del socket Unix. Después de reparar mi MySQL va, en PMA, puedo ver que la conexión se establece a través de un socket Unix.

EDITAR , algunos meses después: ahora estoy acostumbrado a que este problema vuelva con frecuencia, creo que en cada actualización de MariaDB (o algo así). Así que tengo una mejor comprensión de la sonda; hay un complemento UNIX_SOCKET que puede permitirle iniciar sesión en una cuenta MariaDB sin tener que crear una contraseña, porque utiliza las credenciales del shell para confiar en usted, sin tener que ingresar ninguna contraseña. De hecho, este complemento es un complemento de autenticación y no un método de comunicación con el servidor SQL. Por lo tanto, puede deshabilitarlo de manera segura si no usa el socket Unix como método de inicio de sesión. Lo único que no puedo explicar es por qué el complemento UNIX_SOCKET se configura regularmente en cada cuenta de la base de datos, sin ninguna acción de mi parte.

Esto tiene el agradable efecto secundario de que, cuando sucede, puede iniciar sesión en el servidor SQL sin tener que reiniciar MariaDB con --skip-grant-tables: simplemente inicie sesión en la cuenta raíz del sistema, luego simplemente conéctese mysql -u rootsin contraseña, luego restablezca el campo del complemento en el tal como se explica más arriba.

EDIT 2: Confirmado, sucede en cada actualización de MariaDB en Ubuntu.

Morgan Touverey Quilling
fuente
1
Esto interrumpe el trabajo cron de mantenimiento en Ubuntu 16.04 (al menos) porque ese script espera iniciar sesión sin una contraseña utilizando el complemento de socket. Ver superuser.com/questions/957708/... para más detalles.
colan
Bien, interesante, pero esto ya no sucede (la configuración de mis contraseñas heredadas no se rompe al azar ahora). ¿Quizás el complemento de socket Unix está configurado solo para el usuario root, ahora? No podría comprobar eso ahora. Pero no me gusta la idea de que el sistema operativo decida por mí qué configuración de autenticación usar.
Morgan Touverey Quilling
Este problema apesta, sucedió en Debian 9, no se solicitó ninguna contraseña de root cuando instalé MariaDB y ni siquiera pude restablecerla. Espero que no vuelva a suceder después de una actualización. ¿Deberíamos reemplazar MariaDB con MySQL para evitar tales problemas?
baptx
No estoy seguro de que todavía suceda, puede que se haya solucionado ahora (puedo editar la publicación si alguien lo sabe). Tal vez solo sucede en la instalación, lo que sería una buena configuración predeterminada.
Morgan Touverey Quilling
1
Me he dado cuenta de que si no utilizamos el plugin socket de Unix para el usuario root, no será capaz de instalar el paquete phpmyadmin en la última Debian: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). Entonces, la mejor solución es seguir usando la autenticación de socket Unix predeterminada con el comando sudo mysql -u root, que creo que también es más segura y eficiente.
baptx
5

De esta respuesta, http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

Mysql intenta autenticar root usando el complemento, no la contraseña. Debe deshabilitar el uso del complemento para root.

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q
ponis
fuente
2
Eso es exactamente lo que publiqué como respuesta.
Morgan Touverey Quilling
1
Es un resumen un poco más conciso con su actualización.
ponis
Ni siquiera puedo obtener un shell mysql, por lo que esto no funcionará en mi caso, a pesar de que estoy viendo Could not open mysql.plugin table.en el registro de errores.
Dave Everitt
0

Conéctese como se describió anteriormente:

mysqld_safe --skip-grant-tables

Se mostrará el archivo de registro:

160518 23:21:01 mysqld_safe Logging to '/usr/local/mysql/data/ab123456.domain.com.err'.
160518 23:21:01 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

Busque en el registro listado (en este caso: /usr/local/mysql/data/ab123456.domain.com.err) para el zócalo derecho:

cat /usr/local/mysql/data/ab123456.domain.com.err | grep "socket: "
Version: '5.5.49-MariaDB'  socket: '/tmp/mysql.sock'  port: 3306  MariaDB Server

y úsalo en la conexión mysql:

mysql --socket /tmp/mysql.sock -u root
root@ab123456:~# /usr/local/mysql/bin/mysql --socket /tmp/mysql.sock -u root

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.49-MariaDB MariaDB Server
wiesia.stachanczyk
fuente
Acabo de recibir, $ mysqld_safe --skip-grant-tables 190818 14:13:35 mysqld_safe Logging to '/usr/local/var/mylaptop.local.err'. 190818 14:13:35 mysqld_safe Starting mysqld daemon with databases from /usr/local/varpero acabo de regresar al indicador de bash.
Dave Everitt
0

Por defecto, marriadb usa el complemento de autenticación "unix_socket" para establecer contraseñas, esto debería ser "mysql_native_password", así que

cambiar base de datos ..

use mydatabase;

primero ver el complemento de bruja está configurado ...

SELECT user, plugin FROM user;

configúrelo en "mysql_native_password"

UPDATE user SET plugin="mysql_native_password"; 

establecer nueva contraseña ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
André Verwijs
fuente