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

35

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

Eu tentei o método usual para redefinir a senha root (pular a montagem de tabelas de concessão 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'
Morgan Touverey Quilling
fonte

Respostas:

56

Eu encontrei uma solução que é tão estranha quanto o próprio problema.

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

Veja o plugincampo na mysql.usertabela:

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 do plug-in de cada entrada para uma string em branco.

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

Além disso, verifique se a senha está definida, porque às vezes ela parece ser apagada (selecione nos user, passwordcampos). 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 raiz.

Isso não desativará necessariamente a conexão via soquete Unix. Após o reparo do meu MySQL, no PMA, vejo que a conexão é estabelecida através de um soquete Unix.

Edição , alguns meses depois: agora estou acostumado a ter esse problema com frequência, acho que a cada atualização do MariaDB (ou algo assim). Então, eu tenho uma melhor compreensão do probem; existe um plug-in UNIX_SOCKET que permite que você faça login em uma conta MariaDB sem precisar criar uma senha, porque 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. Portanto, 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 plug-in UNIX_SOCKET é definido regularmente em cada conta do banco de dados, sem nenhuma ação do meu lado.

Isso tem o efeito colateral agradável de que, quando isso acontece, você pode efetuar login no servidor SQL sem precisar reiniciar o MariaDB com --skip-grant-tables: basta fazer login na conta raiz do sistema, conectar-se mysql -u rootsem senha e redefinir o campo do plug-in no campo como é explicado acima.

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

Morgan Touverey Quilling
fonte
1
Isso interrompe o trabalho cron de manutenção no Ubuntu 16.04 (pelo menos) porque esse script espera efetuar login sem uma senha usando o plug-in de soquete. Consulte superuser.com/questions/957708/… para obter detalhes.
Colan
Ok, interessante, mas isso não acontece mais (minha configuração de senhas herdadas não quebra aleatoriamente agora). Talvez o plugin do soquete Unix esteja definido apenas no usuário root, agora? Não foi possível verificar isso agora. Mas não gosto da ideia de que o sistema operacional decida para mim qual configuração de autenticação usar.
Morgan Touverey Quilling
Esse problema é péssimo, aconteceu no Debian 9, nenhuma senha de root foi solicitada quando eu instalei o MariaDB e nem consegui redefini-lo. Espero que isso não aconteça novamente após uma atualização. Devemos substituir o MariaDB pelo MySQL para evitar esses problemas?
baptx
Não sei se isso ainda acontece, pode ter sido corrigido agora (posso editar a postagem, se alguém souber). Talvez isso aconteça apenas na instalação, o que seria uma boa configuração padrão.
Morgan Touverey Quilling
1
Eu notei que se não usar o soquete de encaixe unix para o usuário root, ele vai deixar de instalar o pacote phpMyAdmin na mais recente Debian: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). Portanto, a melhor solução é continuar usando a autenticação de soquete unix padrão com o comando sudo mysql -u root, o que eu acho que também é mais seguro e com melhor desempenho.
baptx
5

Nesta resposta, http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

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

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q
pôneis
fonte
2
Foi exatamente o que eu postei como resposta.
Morgan Touverey Quilling
1
É um pacote um pouco mais conciso com a sua atualização.
pôneis
Eu não consigo nem obter um shell mysql, então isso não funcionará no meu caso, mesmo estando Could not open mysql.plugin table.no log de erros.
Dave Everitt
0

Conecte como descrito anteriormente:

mysqld_safe --skip-grant-tables

O arquivo de log será mostrado:

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 direito:

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 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
fonte
Acabei de receber, $ 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/varmas sou jogado de volta ao prompt do bash.
Dave Everitt
0

Por padrão, o marriadb usa o plug-in de autenticação "unix_socket" para definir senhas, que deve ser "mysql_native_password", portanto

alternar banco de dados ..

use mydatabase;

primeiro veja o plugin de bruxa está definido ..

SELECT user, plugin FROM user;

defina-o como "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';
André Verwijs
fonte