Não é possível redefinir a senha de root do MySQL (MariaDB)

31

Hoje, eu quis criar um banco de dados no PMA. Ele disse: "Não é possível efetuar login no servidor MySQL". Eu tentei através de um terminal, mesmo problema, e é porque minha senha está errada. E não consigo entender o porquê.

Eu tentei o método usual para redefinir a senha de root (ignorar as tabelas de concessão de montagem e redefinir a senha), mas parece que não funciona.

Veja que:

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'
    
por Morgan Touverey Quilling 02.08.2015 / 19:20

4 respostas

48

Encontrei uma solução que é tão estranha quanto o problema em si.

Reinicie o MySQL / MariaDB usando --skip-grant-tables (procure por tutoriais na web). (não é necessário, leia minhas edições no final do post)

Veja o campo plugin na tabela mysql.user :

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

Eu tive que redefinir o campo de plug-in de cada entrada para uma string em branco.

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

Além disso, certifique-se de que uma senha esteja definida, porque às vezes ela parece ser apagada (selecione em user, password fields). Caso contrário, atualize-o com:

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

Os parâmetros de privilégios precisam ser salvos explicitamente:

FLUSH PRIVILEGES;

Em seguida, reinicie o MySQL no modo normal e você poderá conectar-se à conta root.

Isso não necessariamente desabilitará a conexão via soquete Unix. Depois que meu MySQL va reparado, no PMA, eu posso ver que a conexão é estabelecida através de um socket Unix.

EDIT , alguns meses depois: Estou acostumado a ter esse problema voltando com frequência, acho que a cada atualização do MariaDB (ou algo parecido). Então eu tenho uma melhor compreensão do problema; há um plugin UNIX_SOCKET que permite que você efetue login em uma conta MariaDB sem ter que criar uma senha, porque ela usa as credenciais do shell para confiar em você, sem precisar digitar nenhuma senha. De fato, este plugin é um plugin de autenticação e não um método de comunicação com o servidor SQL. Assim, você pode desativá-lo com segurança se não usar o soquete unix como método de login. A única coisa que não consigo explicar é por que o plugin UNIX_SOCKET é regularmente configurado em cada conta do banco de dados, sem nenhuma ação do meu lado.

Isso tem um bom efeito colateral que, quando isso acontece, você pode acessar o servidor SQL sem precisar reiniciar o MariaDB com --skip-grant-tables : faça o login na conta root do sistema e conecte-se com mysql -u root sem senha, então redefina o campo do plugin da maneira explicada acima.

EDIT 2: Confirmado, acontece em cada atualização do MariaDB no Ubuntu.

    
por 03.08.2015 / 10:51
4

A partir desta resposta, link .

O Mysql tenta autenticar o root usando o plugin, não a senha. Você precisa desativar o uso do plug-in para o root.

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q
    
por 18.01.2016 / 09:14
0

Conecte-se como descrito anteriormente:

mysqld_safe --skip-grant-tables

O arquivo de registro será exibido:

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

Log de pesquisa listado (neste caso: /usr/local/mysql/data/ab123456.domain.com.err) para o soquete certo:

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

e use-o na conexão do 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
    
por 18.05.2016 / 23:37
0

Por padrão, o marriadb usa o plugin de autenticação "unix_socket" para definir senhas isso deve ser "mysql_native_password" então

alternar banco de dados ..

use mydatabase;

primeiro veja o plugin da bruxa está definido ..

SELECT user, plugin FROM user;

defina para "mysql_native_password"

UPDATE user SET plugin="mysql_native_password"; 

definir nova senha ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
    
por 12.08.2017 / 04:48

Tags