não consigo logar como root do usuário mysql a partir da conta de usuário normal no ubuntu 16.04

203

Acabei de instalar o Ubuntu 16.04 LTS junto com os pacotes php, mariadbe nginx. Eu corri mysql_secure_installatione alterei a senha do root.

Agora, quando tento fazer o login mysqlusando a conta root enquanto estiver logado no Ubuntu como uma conta de usuário normal, tenho acesso negado.

Quando eu entro usando sudo mysql, o mysql nem me pede a senha. Se eu executar mysql_secure_installtion, vejo que as configurações antigas nunca foram definidas permanentemente.

O que estou fazendo errado?

codescópio
fonte

Respostas:

359

Recentemente, atualizei meu Ubuntu 15.04 para 16.04 e isso funcionou para mim:

  1. Primeiro, conecte-se ao sudo mysql

    sudo mysql -u root
    
  2. Verifique suas contas presentes no seu banco de dados

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. Excluir conta root @ localhost atual

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. Recrie seu usuário

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. Conceda permissões ao seu usuário (não esqueça de liberar privilégios)

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0,00 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0,01 sec)
    
  6. Saia do MySQL e tente se reconectar sem o sudo.

Espero que isso ajude alguém :)

Loremhipsum
fonte
16
Essa foi a única coisa que funcionou para mim. Alguém sabe exatamente o que aconteceu com o usuário root quando você instala o mysql-server no 16.04?
Ruggi
32
Espere, não %significa que você pode se conectar de qualquer lugar ... remotamente?
Stevie G
9
Você pode alterar a linha para: CREATE USER 'root' @ 'localhost' IDENTIFIED BY '';
vladnev
11
Para os interessados ​​em segurança: o padrão de conexão root @ localhost não seguro do mysql é um item básico do desenvolvimento local, mas deve aparecer absolutamente em nenhum outro lugar.
Charney Kaye
5
A declaração de concessão para o novo usuário root aqui não fornece "with grant" para a raiz, portanto o root não pode conceder sem executar isso posteriormente: dba.stackexchange.com/a/62046/115679 Altere a declaração de concessão paragrant all privileges on *.* to 'root'@'localhost' with grant option;
Loren
132

Se você instalar o 5.7 e não fornecer uma senha ao rootusuário, ele usará o auth_socketplugin. Esse plugin não se importa e não precisa de uma senha. Apenas verifica se o usuário está se conectando usando um soquete UNIX e depois compara o nome de usuário.

Retirado de Alterar senha do usuário no MySQL 5.7 com "plugin: auth_socket"

Então, para mudar de pluginvolta para mysql_native_password:

  1. Entre com o sudo:

    sudo mysql -u root
    
  2. Altere plugine defina uma senha com um único comando:

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';
    

Obviamente, você também pode usar o comando acima para definir uma senha vazia.

Apenas para o registro, (e MariaDB < 10.2usuários), há também outra maneira de alterar apenas pluginsem fornecer uma senha (deixando em branco):

update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;
Todor
fonte
2
Obrigado, por algum motivo isso foi definido automaticamente subitamente após um apt-get upgrade eu acho ...
Tominator
4
Além disso, eu gosto desta resposta mais - é muito menos destrutiva ;-)
benzkji
3
Para MariaDB <10.2, para mudar o plugin junto com a senha, aqui está a consulta: UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;Fonte: stackoverflow.com/a/41537019/1004587
pothi Kalimuthu
5
Esta deve ser a resposta aceita
Geo C.
3
Eu gostaria de poder votar duas vezes.
James Smith
21

Em resumo, no MariaDB

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

onde você substitui NEWPASSWORD pela senha desejada e tudo mais literalmente.

O problema aqui é que, quando o MariaDB ou o MySQL são instalados / atualizados (especialmente se em algum momento a raiz estiver definida sem uma senha), na tabela Usuários, a senha estará realmente vazia (ou ignorada) e o login dependerá do usuário do sistema correspondente. para um usuário MySQL. Você pode testar isso da seguinte maneira alternando para a raiz do sistema e digite:

mysql -uroot -p

Em seguida, insira nenhuma senha ou a senha errada . Você provavelmente será autorizado a entrar. (Você pode até conseguir fazer login na raiz do unix simplesmente # mysqlporque a senha é irrelevante e o usuário está definido).

Então oque está acontecendo? Bem, se você fizer login como root e faça o seguinte:

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+

você notará auth_socket(que pode ler unix_socketno MariaDB). Esses soquetes ignoram senhas e permitem ao usuário Unix correspondente sem uma verificação de senha. É por isso que você pode efetuar login com root, mas não com um usuário diferente.

Portanto, a solução é atualizar os Usuários para não usar auth_socket/unix_sockete definir corretamente uma senha.

No MariaDB (<10.2, veja os comentários abaixo), que está na versão 16 do Ubuntu a partir de 2017, isso deve ser suficiente. NEWPASSWORD é sua senha. mysql_native_passwordvocê digita literalmente.

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

(É possível que definir o plug-in como vazio funcione. YMMV. Eu não tentei isso. Portanto, essa é uma alternativa.)

UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

De outra forma:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';

Então

FLUSH PRIVILEGES;

Para o registro, a solução que envolve excluir o usuário e recriá-lo com '%' me deixou totalmente bloqueado do banco de dados e pode causar outros problemas, a menos que você obtenha a grantdeclaração exatamente correta - mais fácil simplesmente atualizar a raiz que você já possui.

Na minha experiência, o problema ocorre apenas com o usuário root, pois outros usuários serão adicionados manualmente e não fazem parte de uma instalação / atualização inicial.

Gazzer
fonte
2
Achei que isso funcionasse perfeitamente. Me faz pensar, no entanto, por que alterar a senha do root mysql_secure_installationnão teve o mesmo efeito. Onde ele armazena a nova senha?
Mausy5043
Você pode editar sua resposta e dizer mais sobre cada um dos comandos à medida que avança? Não sei ao certo quais são aplicáveis. São os dois UPDATEs que se aplicam ao MariaDB <10.2 e a ALTERoutras versões? E o segundo é UPDATEuma alternativa ao primeiro, ou precisamos digitar os dois? Finalmente, 'mysql_native_password' é algo para digitar literalmente, ou devemos substituí-lo por nossa senha root pretendida para o MySQL?
Michael Scheper
1
@MichaelScheper Já faz um tempo, então não quero editar muito, mas eis o que me lembro. (1) Faça apenas a primeira atualização (<10.2 pode não ser um requisito). (2) Sim, digite 'mysql_native_password' literalmente. Essencialmente, o que você está fazendo é dizer ao mariadb: "Não use privilégios unix, use privilégios de banco de dados". A mysql_native_passwordopção é essa.
Gazzer
Porra, eu escrevi 'privilégio' errado!
Gazzer
1
Parece que você também perdeu o limite de tempo de edição em 1½ minutos! Às vezes também fico frustrado com isso. De qualquer forma, obrigado!
Michael Scheper
8

Se você instalou o MySQL / MariaDB a partir do repositório base, os usuários não poderão fazer login no MySQL como o usuário root do MySQL a partir de seus logins Unix (não aplicável se tiverem acesso sudo )

  1. Entre no shell raiz do MySQL:

    $ sudo mysql -u root -p
    
  2. Execute as consultas abaixo:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. Abra um novo shell e, em seguida:

    $ mysql -u root -p
    

Fonte

Gayan Weerakutti
fonte
Quando fiz isso, não consegui mais usar o sudo mysql como root. Eu tive que su primeiro, e depois poderia entrar no mysql como root. Então eu mudei de volta para auth_socket.
até
Comando único:mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
Chris Stryczynski 23/07
Se você deseja perder o acesso à sua instância do MySQL, então esta resposta é a maneira mais fácil.
Danila Vershinin
2

Tente criar uma nova conta mysql, para mim funcionou (mysql 5.7.12):

  1. Faça o login como sudo:

    sudo mysql -uroot
    
  2. Crie um novo usuário e conceda a ele privilégios (sem senha):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. Faça login como novo usuário:

    mysql -uadmin
    
Alex Yakovlev
fonte
2

Eu tive que fazer duas coisas (graças a @Todor e @Loremhipsum):

update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';

e depois:

FLUSH PRIVILEGES;

Eu não recomendaria largar usuário root.

Franc Drobnič
fonte
1

Experimente este código primeiro,

echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql 
echo "FLUSH PRIVILEGES;" >> your_init_file.sql

e depois,

killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql

pressione Ctrl+Ze digite: bgpara executar o processo do primeiro plano para o segundo plano e verifique seu acesso:

mysql -u root -proot
mysql> show grants;
ADHITHYA SRINIVASAN
fonte
1

Se você acabou de executar o comando mysql no usuário root, receberá acesso sem a senha solicitada, porque a autenticação de soquete está ativada para root @ localhost. .

A única maneira de definir a senha é alternar para autenticação nativa, como:

$ sudo mysql

mysql> ALTER USUÁRIO 'root' @ 'localhost' IDENTIFICADO COM mysql_native_password BY 'test';

Vadiaz
fonte
0

Estou adaptando alguns scripts de provisionamento que criei para usar o MariaDB e deparei-me com esse problema exato. Reunindo muitas informações aqui, a resposta de um Gazzer realmente aparece na edição; tudo se resume à configuração auth_socket/ unix_socket.

Portanto, ao usar o MariaDB 5.5 (no Ubuntu 14.04) e o MariaDB 10 no (Ubuntu 16.04), o login no MySQL e a execução deste comando esclareceram as coisas imediatamente:

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

As outras respostas - incluindo a resposta mais votada até o momento nesta publicação de Loremhipsum - incentivam realmente as más práticas, recomendando a remoção de um usuário e, em seguida, recriando-o. Para mim, essa é uma solução bastante radical. A melhor / mais simples solução é anular o pluginvalor, liberar privilégios e seguir com a vida.

JakeGould
fonte
-1

Eu tive o mesmo problema e executando o seguinte corrigi-lo:

mysql_upgrade --force
klob
fonte
Infelizmente isso não funcionou. Estou reinstalando o ubuntu.
codescope
1
Acabei de instalar o ubuntu 16.04 e o mariad-server. Após a instalação, executei o mysql_secure_installation e defini a senha. Depois de seguir as demais etapas do mysql_secure_installation, executei novamente e parece que não está salvando as alterações. Ainda não consigo fazer login na minha conta de usuário normal. Poderia ser um bug?
codescope
Isso nunca vai ajudar. O problema não tem nada a ver com a instalação real do binário MariaDB, mas com o usuário rootsendo definido com pluginconfigurações não padrão. O único caso extremo em que uma atualização do banco de dados pode ajudar em um caso como esse é se o mysql_upgradepróprio processo responder pela pluginconfiguração que duvido.
JakeGould